diff --git a/.gitignore b/.gitignore index a0e5b64e4..0566cb462 100644 --- a/.gitignore +++ b/.gitignore @@ -248,4 +248,5 @@ locales/ /cache/ /packs/ /dump.json -/saved-refresh-tokens.json \ No newline at end of file +/saved-refresh-tokens.json +/languages/ \ No newline at end of file diff --git a/README.md b/README.md index 3e247f4b5..aba8babf2 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! -### Currently supporting Minecraft Bedrock 1.18.0 - 1.18.31 and Minecraft Java 1.18.2. +### Currently supporting Minecraft Bedrock 1.19 and Minecraft Java 1.19.0. ## Setting Up Take a look [here](https://wiki.geysermc.org/geyser/setup/) for how to set up Geyser. diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/command/Command.java b/api/geyser/src/main/java/org/geysermc/geyser/api/command/Command.java index 55e894dd7..f9ae68ab3 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/command/Command.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/command/Command.java @@ -69,6 +69,13 @@ public interface Command { @NonNull List aliases(); + /** + * Gets if this command is designed to be used only by server operators. + * + * @return if this command is designated to be used only by server operators. + */ + boolean isSuggestedOpOnly(); + /** * Gets if this command is executable on console. * @@ -135,6 +142,14 @@ public interface Command { */ Builder aliases(List aliases); + /** + * Sets if this command is designed to be used only by server operators. + * + * @param suggestedOpOnly if this command is designed to be used only by server operators + * @return the builder + */ + Builder suggestedOpOnly(boolean suggestedOpOnly); + /** * Sets if this command is executable on console. * diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java index 54cb16edb..938e2fc3a 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.platform.bungeecord; import lombok.Getter; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; -import org.geysermc.geyser.text.AsteriskSerializer; import org.geysermc.geyser.dump.BootstrapDumpInfo; +import org.geysermc.geyser.text.AsteriskSerializer; import java.util.ArrayList; import java.util.Collections; diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java index 2b1fa10c0..cef430bd6 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java @@ -39,8 +39,8 @@ import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.netty.PipelineUtils; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; import org.geysermc.geyser.network.netty.LocalSession; diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java index 7120a94f9..d98349eac 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java @@ -29,18 +29,18 @@ import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.plugin.Plugin; import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.common.PlatformType; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserBootstrap; -import org.geysermc.geyser.command.GeyserCommandManager; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.network.AuthType; +import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough; -import org.geysermc.geyser.util.FileUtils; -import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor; import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandManager; +import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.util.FileUtils; import java.io.File; import java.io.IOException; diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/GeyserBungeeCommandExecutor.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/GeyserBungeeCommandExecutor.java index 87e5f9e13..d022074fd 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/GeyserBungeeCommandExecutor.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/GeyserBungeeCommandExecutor.java @@ -30,8 +30,8 @@ import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.api.plugin.TabExecutor; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandExecutor; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandExecutor; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; diff --git a/bootstrap/spigot/build.gradle.kts b/bootstrap/spigot/build.gradle.kts index 3b87a7c19..8e2b73cd1 100644 --- a/bootstrap/spigot/build.gradle.kts +++ b/bootstrap/spigot/build.gradle.kts @@ -16,6 +16,7 @@ platformRelocate("com.fasterxml.jackson") platformRelocate("net.kyori") platformRelocate("org.objectweb.asm") platformRelocate("me.lucko.commodore") +platformRelocate("io.netty.channel.kqueue") // These dependencies are already present on the platform provided("io.papermc.paper", "paper-api", paperVersion) diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserPaperPingPassthrough.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserPaperPingPassthrough.java new file mode 100644 index 000000000..8d0641599 --- /dev/null +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserPaperPingPassthrough.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.platform.spigot; + +import com.destroystokyo.paper.event.server.PaperServerListPingEvent; +import com.destroystokyo.paper.network.StatusClient; +import com.destroystokyo.paper.profile.PlayerProfile; +import org.bukkit.Bukkit; +import org.geysermc.geyser.network.GameProtocol; +import org.geysermc.geyser.ping.GeyserPingInfo; +import org.geysermc.geyser.ping.IGeyserPingPassthrough; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.net.InetSocketAddress; + +/** + * This class is used if possible, so listeners listening for PaperServerListPingEvent exclusively have their changes + * applied. + */ +public final class GeyserPaperPingPassthrough implements IGeyserPingPassthrough { + private final GeyserSpigotLogger logger; + + public GeyserPaperPingPassthrough(GeyserSpigotLogger logger) { + this.logger = logger; + } + + @Nullable + @Override + public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) { + try { + // We'd rather *not* use deprecations here, but unfortunately any Adventure class would be relocated at + // runtime because we still have to shade in our own Adventure class. For now. + PaperServerListPingEvent event = new PaperServerListPingEvent(new GeyserStatusClient(inetSocketAddress), + Bukkit.getMotd(), Bukkit.getOnlinePlayers().size(), Bukkit.getMaxPlayers(), Bukkit.getVersion(), + GameProtocol.getJavaProtocolVersion(), null); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + // We have to send a ping, so not really sure what else to do here. + return null; + } + + GeyserPingInfo.Players players; + if (event.shouldHidePlayers()) { + players = new GeyserPingInfo.Players(1, 0); + } else { + players = new GeyserPingInfo.Players(event.getMaxPlayers(), event.getNumPlayers()); + } + + GeyserPingInfo geyserPingInfo = new GeyserPingInfo(event.getMotd(), players, + new GeyserPingInfo.Version(Bukkit.getVersion(), GameProtocol.getJavaProtocolVersion())); + + if (!event.shouldHidePlayers()) { + for (PlayerProfile profile : event.getPlayerSample()) { + geyserPingInfo.getPlayerList().add(profile.getName()); + } + } + + return geyserPingInfo; + } catch (Exception e) { + logger.debug("Error while getting Paper ping passthrough: " + e); + return null; + } + } + + private record GeyserStatusClient(InetSocketAddress address) implements StatusClient { + @Override + public @NotNull InetSocketAddress getAddress() { + return address; + } + + @Override + public int getProtocolVersion() { + return GameProtocol.getJavaProtocolVersion(); + } + + @Override + public @Nullable InetSocketAddress getVirtualHost() { + return null; + } + } +} diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java index 7f8213155..8055a375f 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.platform.spigot; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import org.geysermc.geyser.text.AsteriskSerializer; import org.geysermc.geyser.dump.BootstrapDumpInfo; +import org.geysermc.geyser.text.AsteriskSerializer; import java.util.ArrayList; import java.util.List; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java index 0d3b8ef16..0fd8d849b 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java @@ -169,9 +169,10 @@ public class GeyserSpigotInjector extends GeyserInjector { * For the future, if someone wants to properly fix this - as of December 28, 2021, it happens on 1.16.5/1.17.1/1.18.1 EXCEPT Spigot 1.16.5 */ private void workAroundWeirdBug(GeyserBootstrap bootstrap) { + MinecraftProtocol protocol = new MinecraftProtocol(); LocalSession session = new LocalSession(bootstrap.getGeyserConfig().getRemote().getAddress(), bootstrap.getGeyserConfig().getRemote().getPort(), this.serverSocketAddress, - InetAddress.getLoopbackAddress().getHostAddress(), new MinecraftProtocol()); + InetAddress.getLoopbackAddress().getHostAddress(), protocol, protocol.createHelper()); session.connect(); } diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java index ca1d4160f..eb328735d 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java @@ -30,8 +30,8 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.util.CachedServerIcon; -import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.network.GameProtocol; +import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.IGeyserPingPassthrough; import javax.annotation.Nonnull; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java index c5a8a4a25..fed5dd6b9 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java @@ -29,15 +29,21 @@ import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.data.MappingData; import com.viaversion.viaversion.api.protocol.ProtocolPathEntry; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import io.netty.buffer.ByteBuf; import me.lucko.commodore.CommodoreProvider; import org.bukkit.Bukkit; import org.bukkit.command.PluginCommand; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.java.JavaPlugin; import org.geysermc.common.PlatformType; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.adapters.spigot.SpigotAdapters; +import org.geysermc.geyser.api.command.Command; +import org.geysermc.geyser.api.network.AuthType; +import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.dump.BootstrapDumpInfo; @@ -52,7 +58,6 @@ import org.geysermc.geyser.platform.spigot.command.SpigotCommandSource; import org.geysermc.geyser.platform.spigot.world.GeyserPistonListener; import org.geysermc.geyser.platform.spigot.world.GeyserSpigotBlockPlaceListener; import org.geysermc.geyser.platform.spigot.world.manager.*; -import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; @@ -61,10 +66,16 @@ import java.io.IOException; import java.net.SocketAddress; import java.nio.file.Path; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.logging.Level; public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { + /** + * Determines if the plugin has been ran once before, including before /geyser reload. + */ + private static boolean INITIALIZED = false; + private GeyserSpigotCommandManager geyserCommandManager; private GeyserSpigotConfiguration geyserConfig; private GeyserSpigotInjector geyserInjector; @@ -99,11 +110,9 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { } try { - // Required for the Cloudburst Network dependency to initialize. - Class.forName("io.netty.channel.kqueue.KQueue"); - } catch (ClassNotFoundException e) { - // While we could support these older versions, the downside is not having KQueue working at all - // And since there are alternative ways to get Geyser working for these aging platforms, it's not worth it. + // AvailableCommandsSerializer_v291 complains otherwise + ByteBuf.class.getMethod("writeShortLE", int.class); + } catch (NoSuchMethodException e) { getLogger().severe("*********************************************"); getLogger().severe(""); getLogger().severe(GeyserLocale.getLocaleStringLog("geyser.bootstrap.unsupported_server.header")); @@ -159,8 +168,14 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { if (geyserConfig.isLegacyPingPassthrough()) { this.geyserSpigotPingPassthrough = GeyserLegacyPingPassthrough.init(geyser); } else { - this.geyserSpigotPingPassthrough = new GeyserSpigotPingPassthrough(geyserLogger); + try { + Class.forName("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); + this.geyserSpigotPingPassthrough = new GeyserPaperPingPassthrough(geyserLogger); + } catch (ClassNotFoundException e) { + this.geyserSpigotPingPassthrough = new GeyserSpigotPingPassthrough(geyserLogger); + } } + geyserLogger.debug("Spigot ping passthrough type: " + (this.geyserSpigotPingPassthrough == null ? null : this.geyserSpigotPingPassthrough.getClass())); this.geyserCommandManager = new GeyserSpigotCommandManager(geyser); this.geyserCommandManager.init(); @@ -233,14 +248,32 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { } geyserLogger.debug("Using default world manager: " + this.geyserWorldManager.getClass()); } - GeyserSpigotBlockPlaceListener blockPlaceListener = new GeyserSpigotBlockPlaceListener(geyser, this.geyserWorldManager); - Bukkit.getServer().getPluginManager().registerEvents(blockPlaceListener, this); - - Bukkit.getServer().getPluginManager().registerEvents(new GeyserPistonListener(geyser, this.geyserWorldManager), this); PluginCommand pluginCommand = this.getCommand("geyser"); pluginCommand.setExecutor(new GeyserSpigotCommandExecutor(geyser)); + if (!INITIALIZED) { + // Register permissions so they appear in, for example, LuckPerms' UI + // Re-registering permissions throws an error + for (Map.Entry entry : geyserCommandManager.getCommands().entrySet()) { + Command command = entry.getValue(); + if (command.aliases().contains(entry.getKey())) { + // Don't register aliases + continue; + } + + Bukkit.getPluginManager().addPermission(new Permission(command.permission(), + GeyserLocale.getLocaleStringLog(command.description()), + command.isSuggestedOpOnly() ? PermissionDefault.OP : PermissionDefault.TRUE)); + } + + // Events cannot be unregistered - re-registering results in duplicate firings + GeyserSpigotBlockPlaceListener blockPlaceListener = new GeyserSpigotBlockPlaceListener(geyser, this.geyserWorldManager); + Bukkit.getServer().getPluginManager().registerEvents(blockPlaceListener, this); + + Bukkit.getServer().getPluginManager().registerEvents(new GeyserPistonListener(geyser, this.geyserWorldManager), this); + } + boolean brigadierSupported = CommodoreProvider.isSupported(); geyserLogger.debug("Brigadier supported? " + brigadierSupported); if (brigadierSupported) { @@ -249,6 +282,8 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { // Check to ensure the current setup can support the protocol version Geyser uses GeyserSpigotVersionChecker.checkForSupportedProtocol(geyserLogger, isViaVersion); + + INITIALIZED = true; } @Override diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java index 35cb2d03a..b5a6ee887 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java @@ -30,8 +30,8 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandExecutor; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandExecutor; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserPistonListener.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserPistonListener.java index 981d00b97..8be1cb84e 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserPistonListener.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserPistonListener.java @@ -41,12 +41,12 @@ import org.bukkit.event.block.BlockPistonEvent; import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.cache.PistonCache; import org.geysermc.geyser.level.block.BlockStateValues; -import org.geysermc.geyser.translator.level.block.entity.PistonBlockEntity; import org.geysermc.geyser.level.physics.Direction; import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotWorldManager; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.PistonCache; +import org.geysermc.geyser.translator.level.block.entity.PistonBlockEntity; import java.util.List; import java.util.Map; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserSpigotBlockPlaceListener.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserSpigotBlockPlaceListener.java index 62a56bd2d..d486501de 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserSpigotBlockPlaceListener.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/GeyserSpigotBlockPlaceListener.java @@ -33,10 +33,10 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPlaceEvent; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; -import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotWorldManager; +import org.geysermc.geyser.registry.BlockRegistries; +import org.geysermc.geyser.session.GeyserSession; @AllArgsConstructor public class GeyserSpigotBlockPlaceListener implements Listener { diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12NativeWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12NativeWorldManager.java index 670070a68..0ac8d6856 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12NativeWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12NativeWorldManager.java @@ -30,10 +30,10 @@ import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.storage.BlockSto import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.adapters.spigot.SpigotAdapters; import org.geysermc.geyser.adapters.spigot.SpigotWorldAdapter; +import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; /** * Used with ViaVersion and pre-1.13. diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12WorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12WorldManager.java index 1936d608f..2ca024abf 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12WorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigot1_12WorldManager.java @@ -36,8 +36,8 @@ import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; import java.util.List; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotFallbackWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotFallbackWorldManager.java index 3079c523f..fa78a671c 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotFallbackWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotFallbackWorldManager.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.platform.spigot.world.manager; import org.bukkit.plugin.Plugin; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; /** * Should only be used when we know {@link GeyserSpigotWorldManager#getBlockAt(GeyserSession, int, int, int)} diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java index 816edb231..baffc9679 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java @@ -33,8 +33,8 @@ import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import it.unimi.dsi.fastutil.ints.IntList; import org.geysermc.geyser.network.GameProtocol; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.platform.spigot.GeyserSpigotPlugin; +import org.geysermc.geyser.session.GeyserSession; import java.util.List; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java index 2db01ab4f..bf9085979 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.platform.spigot.world.manager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.adapters.spigot.SpigotAdapters; import org.geysermc.geyser.adapters.spigot.SpigotWorldAdapter; +import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; public class GeyserSpigotNativeWorldManager extends GeyserSpigotWorldManager { protected final SpigotWorldAdapter adapter; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java index b9bbba9d3..093e28794 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java @@ -38,14 +38,14 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import org.bukkit.plugin.Plugin; -import org.geysermc.geyser.network.GameProtocol; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator; +import org.geysermc.geyser.level.GameRule; import org.geysermc.geyser.level.GeyserWorldManager; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.registry.BlockRegistries; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator; import org.geysermc.geyser.util.BlockEntityUtils; -import org.geysermc.geyser.level.GameRule; import java.util.ArrayList; import java.util.List; diff --git a/bootstrap/spigot/src/main/resources/plugin.yml b/bootstrap/spigot/src/main/resources/plugin.yml index 27f51acd1..e28b8981d 100644 --- a/bootstrap/spigot/src/main/resources/plugin.yml +++ b/bootstrap/spigot/src/main/resources/plugin.yml @@ -8,38 +8,4 @@ api-version: 1.13 commands: geyser: description: The main command for Geyser. - usage: /geyser -permissions: - geyser.command.help: - description: Shows help for all registered commands. - default: true - geyser.command.offhand: - description: Puts an items in your offhand. - default: true - geyser.command.advancements: - description: Shows the advancements of the player on the server. - default: true - geyser.command.tooltips: - description: Toggles showing advanced tooltips on your items. - default: true - geyser.command.statistics: - description: Shows the statistics of the player on the server. - default: true - geyser.command.settings: - description: Modify user settings - default: true - geyser.command.list: - description: List all players connected through Geyser. - default: op - geyser.command.dump: - description: Dumps Geyser debug information for bug reports. - default: op - geyser.command.reload: - description: Reloads the Geyser configurations. Kicks all players when used! - default: false - geyser.command.version: - description: Shows the current Geyser version and checks for updates. - default: op - geyser.command.extensions: - description: Shows all the loaded extensions. - default: op + usage: /geyser \ No newline at end of file diff --git a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePingPassthrough.java b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePingPassthrough.java index 63900d615..a661061e2 100644 --- a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePingPassthrough.java +++ b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePingPassthrough.java @@ -25,8 +25,8 @@ package org.geysermc.geyser.platform.sponge; -import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.network.GameProtocol; +import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.spongepowered.api.MinecraftVersion; import org.spongepowered.api.Sponge; diff --git a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePlugin.java b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePlugin.java index 894368e5e..4e088161d 100644 --- a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePlugin.java +++ b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePlugin.java @@ -27,17 +27,17 @@ package org.geysermc.geyser.platform.sponge; import com.google.inject.Inject; import org.geysermc.common.PlatformType; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough; -import org.geysermc.geyser.util.FileUtils; -import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.platform.sponge.command.GeyserSpongeCommandExecutor; import org.geysermc.geyser.platform.sponge.command.GeyserSpongeCommandManager; +import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.util.FileUtils; import org.slf4j.Logger; import org.spongepowered.api.Sponge; import org.spongepowered.api.config.ConfigDir; diff --git a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/GeyserSpongeCommandExecutor.java b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/GeyserSpongeCommandExecutor.java index c8338e440..485c06c41 100644 --- a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/GeyserSpongeCommandExecutor.java +++ b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/GeyserSpongeCommandExecutor.java @@ -26,11 +26,11 @@ package org.geysermc.geyser.platform.sponge.command; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandExecutor; import org.geysermc.geyser.command.GeyserCommandSource; -import org.geysermc.geyser.command.GeyserCommand; -import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; import org.spongepowered.api.command.CommandCallable; import org.spongepowered.api.command.CommandResult; diff --git a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/SpongeCommandSource.java b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/SpongeCommandSource.java index 664727c50..12fdcb989 100644 --- a/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/SpongeCommandSource.java +++ b/bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/command/SpongeCommandSource.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.platform.sponge.command; import lombok.AllArgsConstructor; - import org.geysermc.geyser.command.GeyserCommandSource; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.source.ConsoleSource; diff --git a/bootstrap/standalone/build.gradle.kts b/bootstrap/standalone/build.gradle.kts index 977a4a7a6..088d5dc82 100644 --- a/bootstrap/standalone/build.gradle.kts +++ b/bootstrap/standalone/build.gradle.kts @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer val terminalConsoleVersion = "1.2.0" -val jlineVersion = "3.20.0" +val jlineVersion = "3.10.0" dependencies { api(projects.core) diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java index 65a8bc235..a89b18d1e 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java @@ -38,10 +38,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.appender.ConsoleAppender; -import org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender; import org.geysermc.common.PlatformType; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; @@ -49,9 +48,9 @@ import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.platform.standalone.command.GeyserStandaloneCommandManager; -import org.geysermc.geyser.util.FileUtils; -import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.platform.standalone.gui.GeyserStandaloneGUI; +import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.util.FileUtils; import java.io.File; import java.io.IOException; @@ -211,6 +210,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap { return; } } + geyserLogger.setDebug(geyserConfig.isDebugMode()); GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); // Allow libraries like Protocol to have their debug information passthrough diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java index 5901da470..a8bce303f 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.platform.standalone.gui; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.command.GeyserCommand; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.platform.standalone.GeyserStandaloneLogger; import org.geysermc.geyser.platform.standalone.command.GeyserStandaloneCommandManager; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.GeyserLocale; import javax.swing.*; import javax.swing.table.DefaultTableModel; diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityDumpInfo.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityDumpInfo.java index ffc7db291..9f429cc83 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityDumpInfo.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityDumpInfo.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.platform.velocity; import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.ProxyServer; import lombok.Getter; -import org.geysermc.geyser.text.AsteriskSerializer; import org.geysermc.geyser.dump.BootstrapDumpInfo; +import org.geysermc.geyser.text.AsteriskSerializer; import java.util.ArrayList; import java.util.List; diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java index 184d59b3e..0b228941b 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java @@ -38,6 +38,7 @@ import lombok.Getter; import org.geysermc.common.PlatformType; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.dump.BootstrapDumpInfo; @@ -45,7 +46,6 @@ import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandExecutor; import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandManager; -import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; import org.jetbrains.annotations.Nullable; diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/GeyserVelocityCommandExecutor.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/GeyserVelocityCommandExecutor.java index d30d9ae9e..b3c4221df 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/GeyserVelocityCommandExecutor.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/GeyserVelocityCommandExecutor.java @@ -27,11 +27,11 @@ package org.geysermc.geyser.platform.velocity.command; import com.velocitypowered.api.command.SimpleCommand; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandExecutor; import org.geysermc.geyser.command.GeyserCommandSource; -import org.geysermc.geyser.command.GeyserCommand; -import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; import java.util.Arrays; diff --git a/build-logic/src/main/kotlin/Versions.kt b/build-logic/src/main/kotlin/Versions.kt index fb8b9cb2f..779065bc5 100644 --- a/build-logic/src/main/kotlin/Versions.kt +++ b/build-logic/src/main/kotlin/Versions.kt @@ -30,15 +30,15 @@ object Versions { const val guavaVersion = "29.0-jre" const val nbtVersion = "2.1.0" const val websocketVersion = "1.5.1" - const val protocolVersion = "2a344e4" + const val protocolVersion = "977a9a1" const val raknetVersion = "1.6.28-SNAPSHOT" const val mcauthlibVersion = "d9d773e" - const val mcprotocollibversion = "0771504" - const val packetlibVersion = "2.1-SNAPSHOT" + const val mcprotocollibversion = "bb2b414" + const val packetlibVersion = "3.0" const val adventureVersion = "4.9.3" const val eventVersion = "3.0.0" const val junitVersion = "4.13.1" const val checkerQualVersion = "3.19.0" - const val cumulusVersion = "1.0-SNAPSHOT" + const val cumulusVersion = "1.1" const val log4jVersion = "2.17.1" } \ No newline at end of file diff --git a/common/src/main/java/org/geysermc/floodgate/pluginmessage/PluginMessageChannels.java b/common/src/main/java/org/geysermc/floodgate/pluginmessage/PluginMessageChannels.java index 37c5d4015..f06c0f9da 100644 --- a/common/src/main/java/org/geysermc/floodgate/pluginmessage/PluginMessageChannels.java +++ b/common/src/main/java/org/geysermc/floodgate/pluginmessage/PluginMessageChannels.java @@ -31,8 +31,11 @@ public final class PluginMessageChannels { public static final String SKIN = "floodgate:skin"; public static final String FORM = "floodgate:form"; public static final String TRANSFER = "floodgate:transfer"; + public static final String PACKET = "floodgate:packet"; - private static final byte[] FLOODGATE_REGISTER_DATA = String.join("\0", SKIN, FORM, TRANSFER).getBytes(Charsets.UTF_8); + private static final byte[] FLOODGATE_REGISTER_DATA = + String.join("\0", SKIN, FORM, TRANSFER, PACKET) + .getBytes(Charsets.UTF_8); /** * Get the prebuilt register data as a byte array diff --git a/core/build.gradle.kts b/core/build.gradle.kts index abf703110..e82af5687 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,5 +1,5 @@ -import net.kyori.indra.git.IndraGitExtension import net.kyori.blossom.BlossomExtension +import net.kyori.indra.git.IndraGitExtension plugins { id("net.kyori.blossom") @@ -31,7 +31,7 @@ dependencies { // Network libraries implementation("org.java-websocket", "Java-WebSocket", Versions.websocketVersion) - api("com.github.CloudburstMC.Protocol", "bedrock-v503", Versions.protocolVersion) { + api("com.github.CloudburstMC.Protocol", "bedrock-v527", Versions.protocolVersion) { exclude("com.nukkitx.network", "raknet") exclude("com.nukkitx", "nbt") } diff --git a/core/src/main/java/org/geysermc/connector/GeyserConnector.java b/core/src/main/java/org/geysermc/connector/GeyserConnector.java index d9ff694bd..bd14ebb25 100644 --- a/core/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/core/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -26,10 +26,10 @@ package org.geysermc.connector; import com.nukkitx.protocol.bedrock.BedrockServer; +import org.geysermc.api.Geyser; import org.geysermc.common.PlatformType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.api.Geyser; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java b/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java index fc21087ae..aaf45ce35 100644 --- a/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java +++ b/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java @@ -25,8 +25,8 @@ package org.geysermc.geyser; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; import org.geysermc.geyser.api.network.AuthType; +import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; import org.geysermc.geyser.text.GeyserLocale; import java.nio.file.Files; @@ -43,7 +43,7 @@ public class FloodgateKeyLoader { if (floodgateDataFolder != null) { Path autoKey = floodgateDataFolder.resolve("key.pem"); if (Files.exists(autoKey)) { - logger.info(GeyserLocale.getLocaleStringLog("geyser.bootstrap.floodgate.auto_loaded")); + logger.debug(GeyserLocale.getLocaleStringLog("geyser.bootstrap.floodgate.auto_loaded")); return autoKey; } else { logger.error(GeyserLocale.getLocaleStringLog("geyser.bootstrap.floodgate.missing_key")); @@ -52,7 +52,7 @@ public class FloodgateKeyLoader { Path floodgateKey; if (config.getFloodgateKeyFile().equals("public-key.pem")) { - logger.info("Floodgate 2.0 doesn't use a public/private key system anymore. We'll search for key.pem instead"); + logger.debug("Floodgate 2.0 doesn't use a public/private key system anymore. We'll search for key.pem instead"); floodgateKey = geyserDataFolder.resolve("key.pem"); } else { floodgateKey = geyserDataFolder.resolve(config.getFloodgateKeyFile()); diff --git a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java index 188393f4c..9eeae4abb 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java @@ -55,6 +55,7 @@ import org.geysermc.geyser.api.event.EventBus; import org.geysermc.geyser.api.event.lifecycle.GeyserPostInitializeEvent; import org.geysermc.geyser.api.event.lifecycle.GeyserPreInitializeEvent; import org.geysermc.geyser.api.event.lifecycle.GeyserShutdownEvent; +import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.api.network.BedrockListener; import org.geysermc.geyser.api.network.RemoteServer; import org.geysermc.geyser.command.GeyserCommandManager; @@ -75,9 +76,9 @@ import org.geysermc.geyser.scoreboard.ScoreboardUpdater; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.PendingMicrosoftAuthentication; import org.geysermc.geyser.session.SessionManager; -import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.skin.FloodgateSkinUploader; import org.geysermc.geyser.skin.SkinProvider; +import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; @@ -89,6 +90,7 @@ import javax.naming.directory.InitialDirContext; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -247,7 +249,6 @@ public class GeyserImpl implements GeyserApi { GeyserLogger logger = bootstrap.getGeyserLogger(); GeyserConfiguration config = bootstrap.getGeyserConfig(); - logger.setDebug(config.isDebugMode()); ScoreboardUpdater.init(); @@ -295,16 +296,22 @@ public class GeyserImpl implements GeyserApi { // Ensure that PacketLib does not create an event loop for handling packets; we'll do that ourselves TcpSession.USE_EVENT_LOOP_FOR_PACKETS = false; - if (config.getRemote().getAuthType() == AuthType.FLOODGATE) { - try { - Key key = new AesKeyProducer().produceFrom(config.getFloodgateKeyPath()); - cipher = new AesCipher(new Base64Topping()); - cipher.init(key); - logger.info(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.loaded_key")); - skinUploader = new FloodgateSkinUploader(this).start(); - } catch (Exception exception) { - logger.severe(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.bad_key"), exception); + String branch = "unknown"; + int buildNumber = -1; + if (this.isProductionEnvironment()) { + try (InputStream stream = bootstrap.getResource("git.properties")) { + Properties gitProperties = new Properties(); + gitProperties.load(stream); + branch = gitProperties.getProperty("git.branch"); + String build = gitProperties.getProperty("git.build.number"); + if (build != null) { + buildNumber = Integer.parseInt(build); + } + } catch (Throwable e) { + logger.error("Failed to read git.properties", e); } + } else { + logger.debug("Not getting git properties for the news handler as we are in a development environment."); } pendingMicrosoftAuthentication = new PendingMicrosoftAuthentication(config.getPendingAuthenticationTimeout()); @@ -349,14 +356,34 @@ public class GeyserImpl implements GeyserApi { if (shouldStartListener) { bedrockServer.bind().whenComplete((avoid, throwable) -> { if (throwable == null) { - logger.info(GeyserLocale.getLocaleStringLog("geyser.core.start", config.getBedrock().getAddress(), String.valueOf(config.getBedrock().getPort()))); + logger.info(GeyserLocale.getLocaleStringLog("geyser.core.start", config.getBedrock().getAddress(), + String.valueOf(config.getBedrock().getPort()))); } else { - logger.severe(GeyserLocale.getLocaleStringLog("geyser.core.fail", config.getBedrock().getAddress(), String.valueOf(config.getBedrock().getPort()))); - throwable.printStackTrace(); + String address = config.getBedrock().getAddress(); + int port = config.getBedrock().getPort(); + logger.severe(GeyserLocale.getLocaleStringLog("geyser.core.fail", address, String.valueOf(port))); + if (!"0.0.0.0".equals(address)) { + logger.info(ChatColor.GREEN + "Suggestion: try setting `address` under `bedrock` in the Geyser config back to 0.0.0.0"); + logger.info(ChatColor.GREEN + "Then, restart this server."); + } } }).join(); } + if (config.getRemote().getAuthType() == AuthType.FLOODGATE) { + try { + Key key = new AesKeyProducer().produceFrom(config.getFloodgateKeyPath()); + cipher = new AesCipher(new Base64Topping()); + cipher.init(key); + logger.debug(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.loaded_key")); + // Note: this is positioned after the bind so the skin uploader doesn't try to run if Geyser fails + // to load successfully. Spigot complains about class loader if the plugin is disabled. + skinUploader = new FloodgateSkinUploader(this).start(); + } catch (Exception exception) { + logger.severe(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.bad_key"), exception); + } + } + if (config.getMetrics().isEnabled()) { metrics = new Metrics(this, "GeyserMC", config.getMetrics().getUniqueId(), false, java.util.logging.Logger.getLogger("")); metrics.addCustomChart(new Metrics.SingleLineChart("players", sessionManager::size)); diff --git a/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java b/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java index 2b3a855aa..0d020ad08 100644 --- a/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java @@ -86,4 +86,14 @@ public abstract class GeyserCommand implements Command { public void setAliases(List aliases) { this.aliases = aliases; } + + /** + * Used for permission defaults on server implementations. + * + * @return if this command is designated to be used only by server operators. + */ + @Override + public boolean isSuggestedOpOnly() { + return false; + } } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java index c242106d8..fea57efa1 100644 --- a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java +++ b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.command; import lombok.Getter; - import lombok.RequiredArgsConstructor; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.common.PlatformType; @@ -42,7 +41,10 @@ import org.geysermc.geyser.text.GeyserLocale; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @RequiredArgsConstructor public abstract class GeyserCommandManager extends CommandManager { @@ -155,6 +157,7 @@ public abstract class GeyserCommandManager extends CommandManager { private String description = ""; private String permission = ""; private List aliases; + private boolean suggestedOpOnly = false; private boolean executableOnConsole = true; private List subCommands; private boolean bedrockOnly; @@ -180,6 +183,12 @@ public abstract class GeyserCommandManager extends CommandManager { return this; } + @Override + public Command.Builder suggestedOpOnly(boolean suggestedOpOnly) { + this.suggestedOpOnly = suggestedOpOnly; + return this; + } + public CommandBuilder executableOnConsole(boolean executableOnConsole) { this.executableOnConsole = executableOnConsole; return this; @@ -231,6 +240,11 @@ public abstract class GeyserCommandManager extends CommandManager { return CommandBuilder.this.aliases == null ? Collections.emptyList() : CommandBuilder.this.aliases; } + @Override + public boolean isSuggestedOpOnly() { + return CommandBuilder.this.suggestedOpOnly; + } + @NonNull @Override public List subCommands() { diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancedTooltipsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancedTooltipsCommand.java index 350b98f04..466515b3f 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancedTooltipsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancedTooltipsCommand.java @@ -25,8 +25,8 @@ package org.geysermc.geyser.command.defaults; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.MinecraftLocale; diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancementsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancementsCommand.java index 2aea5f4df..28253433f 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancementsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/AdvancementsCommand.java @@ -25,8 +25,8 @@ package org.geysermc.geyser.command.defaults; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; public class AdvancementsCommand extends GeyserCommand { diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java index 32382526a..60683d34a 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java @@ -32,12 +32,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.common.PlatformType; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; -import org.geysermc.geyser.text.ChatColor; -import org.geysermc.geyser.text.AsteriskSerializer; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.dump.DumpInfo; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.AsteriskSerializer; +import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.WebUtils; @@ -147,4 +147,9 @@ public class DumpCommand extends GeyserCommand { public List subCommands() { return Arrays.asList("offline", "full", "logs"); } + + @Override + public boolean isSuggestedOpOnly() { + return true; + } } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/HelpCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/HelpCommand.java index fccb1b267..84a0730b8 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/HelpCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/HelpCommand.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.command.defaults; import org.geysermc.common.PlatformType; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; -import org.geysermc.geyser.text.ChatColor; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; import java.util.Collections; diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/ListCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/ListCommand.java index 8382d7a29..f911e431e 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/ListCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/ListCommand.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.command.defaults; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; @@ -51,4 +51,9 @@ public class ListCommand extends GeyserCommand { sender.sendMessage(message); } + + @Override + public boolean isSuggestedOpOnly() { + return true; + } } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java index a9f265f6e..e60daacd3 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java @@ -28,11 +28,11 @@ package org.geysermc.geyser.command.defaults; import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerActionPacket; +import com.nukkitx.math.vector.Vector3i; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.util.BlockUtils; public class OffhandCommand extends GeyserCommand { @@ -46,8 +46,8 @@ public class OffhandCommand extends GeyserCommand { return; } - ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, BlockUtils.POSITION_ZERO, - Direction.DOWN); + ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, Vector3i.ZERO, + Direction.DOWN, session.getNextSequence()); session.sendDownstreamPacket(releaseItemPacket); } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/ReloadCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/ReloadCommand.java index 31e17faad..843e93de0 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/ReloadCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/ReloadCommand.java @@ -27,8 +27,8 @@ package org.geysermc.geyser.command.defaults; import org.geysermc.common.PlatformType; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; @@ -54,4 +54,9 @@ public class ReloadCommand extends GeyserCommand { geyser.getSessionManager().disconnectAll("geyser.commands.reload.kick"); geyser.reload(); } + + @Override + public boolean isSuggestedOpOnly() { + return true; + } } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/SettingsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/SettingsCommand.java index a8e8a374e..7828cf1d2 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/SettingsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/SettingsCommand.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.command.defaults; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.SettingsUtils; diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/StatisticsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/StatisticsCommand.java index c898f32a9..ea2da51df 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/StatisticsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/StatisticsCommand.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.command.defaults; import com.github.steveice10.mc.protocol.data.game.ClientCommand; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; public class StatisticsCommand extends GeyserCommand { diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/StopCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/StopCommand.java index b038fa0ff..151aa2d84 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/StopCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/StopCommand.java @@ -27,8 +27,8 @@ package org.geysermc.geyser.command.defaults; import org.geysermc.common.PlatformType; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; @@ -54,4 +54,9 @@ public class StopCommand extends GeyserCommand { geyser.getBootstrap().onDisable(); } + + @Override + public boolean isSuggestedOpOnly() { + return true; + } } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java index eabd3800c..9006ca959 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.command.defaults; import com.nukkitx.protocol.bedrock.BedrockPacketCodec; import org.geysermc.common.PlatformType; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.ChatColor; @@ -95,4 +95,9 @@ public class VersionCommand extends GeyserCommand { } } } + + @Override + public boolean isSuggestedOpOnly() { + return true; + } } diff --git a/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java b/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java index be9e3e374..d74d804df 100644 --- a/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java +++ b/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java @@ -101,6 +101,10 @@ public interface GeyserConfiguration { boolean isAllowCustomSkulls(); + int getMaxVisibleCustomSkulls(); + + int getCustomSkullRenderDistance(); + IMetricsInfo getMetrics(); int getPendingAuthenticationTimeout(); diff --git a/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java b/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java index 19b1c9627..77b351518 100644 --- a/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java +++ b/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java @@ -130,6 +130,12 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration @JsonProperty("allow-custom-skulls") private boolean allowCustomSkulls = true; + @JsonProperty("max-visible-custom-skulls") + private int maxVisibleCustomSkulls = 128; + + @JsonProperty("custom-skull-render-distance") + private int customSkullRenderDistance = 32; + @JsonProperty("add-non-bedrock-items") private boolean addNonBedrockItems = true; diff --git a/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java b/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java index 9ff4c9ebc..da52d064c 100644 --- a/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java +++ b/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java @@ -35,17 +35,18 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import lombok.AllArgsConstructor; import lombok.Getter; +import org.geysermc.floodgate.util.DeviceOs; +import org.geysermc.floodgate.util.FloodgateInfoHolder; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.GeyserApi; import org.geysermc.geyser.api.extension.Extension; -import org.geysermc.geyser.text.AsteriskSerializer; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.AsteriskSerializer; +import org.geysermc.geyser.util.CpuUtils; import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.WebUtils; -import org.geysermc.floodgate.util.DeviceOs; -import org.geysermc.floodgate.util.FloodgateInfoHolder; import java.io.File; import java.io.IOException; @@ -66,6 +67,7 @@ public class DumpInfo { private final DumpInfo.VersionInfo versionInfo; private final int cpuCount; + private final String cpuName; private final Locale systemLocale; private final String systemEncoding; private Properties gitInfo; @@ -83,6 +85,7 @@ public class DumpInfo { this.versionInfo = new VersionInfo(); this.cpuCount = Runtime.getRuntime().availableProcessors(); + this.cpuName = CpuUtils.tryGetProcessorName(); this.systemLocale = Locale.getDefault(); this.systemEncoding = System.getProperty("file.encoding"); diff --git a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java index 1de571c94..52d9250ac 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java +++ b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java @@ -51,6 +51,7 @@ import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.translator.text.MessageTranslator; public final class EntityDefinitions { + public static final EntityDefinition ALLAY; public static final EntityDefinition AREA_EFFECT_CLOUD; public static final EntityDefinition ARMOR_STAND; public static final EntityDefinition ARROW; @@ -63,6 +64,7 @@ public final class EntityDefinitions { public static final EntityDefinition CAVE_SPIDER; public static final EntityDefinition CHEST_MINECART; public static final EntityDefinition CHICKEN; + public static final EntityDefinition CHEST_BOAT; public static final EntityDefinition COD; public static final EntityDefinition COMMAND_BLOCK_MINECART; public static final EntityDefinition COW; @@ -88,6 +90,7 @@ public final class EntityDefinitions { public static final EntityDefinition FIREWORK_ROCKET; public static final EntityDefinition FISHING_BOBBER; public static final EntityDefinition FOX; + public static final EntityDefinition FROG; public static final EntityDefinition FURNACE_MINECART; // Not present on Bedrock public static final EntityDefinition GHAST; public static final EntityDefinition GIANT; @@ -143,6 +146,7 @@ public final class EntityDefinitions { public static final EntityDefinition SQUID; public static final EntityDefinition STRAY; public static final EntityDefinition STRIDER; + public static final EntityDefinition TADPOLE; public static final EntityDefinition TNT; public static final EntityDefinition TNT_MINECART; public static final EntityDefinition TRADER_LLAMA; @@ -153,6 +157,7 @@ public final class EntityDefinitions { public static final EntityDefinition VILLAGER; public static final EntityDefinition VINDICATOR; public static final EntityDefinition WANDERING_TRADER; + public static final EntityDefinition WARDEN; public static final EntityDefinition WITCH; public static final EntityDefinition WITHER; public static final EntityDefinition WITHER_SKELETON; @@ -179,7 +184,7 @@ public final class EntityDefinitions { .addTranslator(MetadataType.INT, Entity::setAir) // Air/bubbles .addTranslator(MetadataType.OPTIONAL_CHAT, Entity::setDisplayName) .addTranslator(MetadataType.BOOLEAN, Entity::setDisplayNameVisible) - .addTranslator(MetadataType.BOOLEAN, (entity, entityMetadata) -> entity.setFlag(EntityFlag.SILENT, ((BooleanEntityMetadata) entityMetadata).getPrimitiveValue())) + .addTranslator(MetadataType.BOOLEAN, Entity::setSilent) .addTranslator(MetadataType.BOOLEAN, Entity::setGravity) .addTranslator(MetadataType.POSE, (entity, entityMetadata) -> entity.setPose(entityMetadata.getValue())) .addTranslator(MetadataType.INT, Entity::setFreezing) @@ -209,6 +214,9 @@ public final class EntityDefinitions { .addTranslator(MetadataType.BOOLEAN, BoatEntity::setPaddlingRight) .addTranslator(MetadataType.INT, (boatEntity, entityMetadata) -> boatEntity.getDirtyMetadata().put(EntityData.BOAT_BUBBLE_TIME, entityMetadata.getValue())) // May not actually do anything .build(); + CHEST_BOAT = EntityDefinition.inherited(ChestBoatEntity::new, BOAT) + .type(EntityType.CHEST_BOAT) + .build(); DRAGON_FIREBALL = EntityDefinition.inherited(FireballEntity::new, entityBase) .type(EntityType.DRAGON_FIREBALL) .heightAndWidth(1.0f) @@ -274,6 +282,7 @@ public final class EntityDefinitions { .build(); PAINTING = EntityDefinition.inherited(null, entityBase) .type(EntityType.PAINTING) + .addTranslator(MetadataType.PAINTING_VARIANT, PaintingEntity::setPaintingType) .build(); SHULKER_BULLET = EntityDefinition.inherited(ThrowableEntity::new, entityBase) .type(EntityType.SHULKER_BULLET) @@ -441,6 +450,10 @@ public final class EntityDefinitions { // Extends mob { + ALLAY = EntityDefinition.inherited(AllayEntity::new, mobEntityBase) + .type(EntityType.ALLAY) + .height(0.6f).width(0.35f) + .build(); BAT = EntityDefinition.inherited(BatEntity::new, mobEntityBase) .type(EntityType.BAT) .height(0.9f).width(0.5f) @@ -550,6 +563,11 @@ public final class EntityDefinitions { .height(0.8f).width(0.4f) .addTranslator(MetadataType.BYTE, VexEntity::setVexFlags) .build(); + WARDEN = EntityDefinition.inherited(WardenEntity::new, mobEntityBase) + .type(EntityType.WARDEN) + .height(2.9f).width(0.9f) + .addTranslator(MetadataType.INT, WardenEntity::setAngerLevel) + .build(); WITHER = EntityDefinition.inherited(WitherEntity::new, mobEntityBase) .type(EntityType.WITHER) .height(3.5f).width(0.9f) @@ -634,6 +652,10 @@ public final class EntityDefinitions { .type(EntityType.SALMON) .height(0.5f).width(0.7f) .build(); + TADPOLE = EntityDefinition.inherited(TadpoleEntity::new, abstractFishEntityBase) + .type(EntityType.TADPOLE) + .height(0.3f).width(0.4f) + .build(); TROPICAL_FISH = EntityDefinition.inherited(TropicalFishEntity::new, abstractFishEntityBase) .type(EntityType.TROPICAL_FISH) .heightAndWidth(0.6f) @@ -735,6 +757,12 @@ public final class EntityDefinitions { .addTranslator(null) // Trusted player 1 .addTranslator(null) // Trusted player 2 .build(); + FROG = EntityDefinition.inherited(FrogEntity::new, ageableEntityBase) + .type(EntityType.FROG) + .heightAndWidth(0.5f) + .addTranslator(MetadataType.FROG_VARIANT, FrogEntity::setFrogVariant) + .addTranslator(MetadataType.OPTIONAL_VARINT, FrogEntity::setTongueTarget) + .build(); HOGLIN = EntityDefinition.inherited(HoglinEntity::new, ageableEntityBase) .type(EntityType.HOGLIN) .height(1.4f).width(1.3965f) @@ -744,6 +772,8 @@ public final class EntityDefinitions { .type(EntityType.GOAT) .height(1.3f).width(0.9f) .addTranslator(MetadataType.BOOLEAN, GoatEntity::setScreamer) + .addTranslator(MetadataType.BOOLEAN, GoatEntity::setHasLeftHorn) + .addTranslator(MetadataType.BOOLEAN, GoatEntity::setHasRightHorn) .build(); MOOSHROOM = EntityDefinition.inherited(MooshroomEntity::new, ageableEntityBase) .type(EntityType.MOOSHROOM) @@ -871,7 +901,7 @@ public final class EntityDefinitions { CAT = EntityDefinition.inherited(CatEntity::new, tameableEntityBase) .type(EntityType.CAT) .height(0.35f).width(0.3f) - .addTranslator(MetadataType.INT, CatEntity::setCatVariant) + .addTranslator(MetadataType.CAT_VARIANT, CatEntity::setCatVariant) .addTranslator(MetadataType.BOOLEAN, CatEntity::setResting) .addTranslator(null) // "resting state one" //TODO .addTranslator(MetadataType.INT, CatEntity::setCollarColor) diff --git a/core/src/main/java/org/geysermc/geyser/entity/GeyserDirtyMetadata.java b/core/src/main/java/org/geysermc/geyser/entity/GeyserDirtyMetadata.java index f0095d26a..c896c239e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/GeyserDirtyMetadata.java +++ b/core/src/main/java/org/geysermc/geyser/entity/GeyserDirtyMetadata.java @@ -52,4 +52,9 @@ public final class GeyserDirtyMetadata { public boolean hasEntries() { return !metadata.isEmpty(); } + + @Override + public String toString() { + return metadata.toString(); + } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java index 164fbf705..a38a4dd16 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java @@ -32,8 +32,8 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ChestBoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ChestBoatEntity.java new file mode 100644 index 000000000..724bf921e --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ChestBoatEntity.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type; + +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import com.nukkitx.math.vector.Vector3f; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.InteractionResult; +import org.geysermc.geyser.util.InteractiveTag; + +import java.util.UUID; + +public class ChestBoatEntity extends BoatEntity { + public ChestBoatEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + } + + @Override + protected InteractiveTag testInteraction(Hand hand) { + return passengers.isEmpty() && !session.isSneaking() ? super.testInteraction(hand) : InteractiveTag.OPEN_CONTAINER; + } + + @Override + public InteractionResult interact(Hand hand) { + return passengers.isEmpty() && !session.isSneaking() ? super.interact(hand) : InteractionResult.SUCCESS; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/EnderCrystalEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/EnderCrystalEntity.java index a1e91bfd2..f9e4af7c1 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/EnderCrystalEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/EnderCrystalEntity.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.entity.type; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.data.entity.EntityData; @@ -50,13 +49,12 @@ public class EnderCrystalEntity extends Entity { setFlag(EntityFlag.FIRE_IMMUNE, true); } - public void setBlockTarget(EntityMetadata, ?> entityMetadata) { + public void setBlockTarget(EntityMetadata, ?> entityMetadata) { // Show beam // Usually performed client-side on Bedrock except for Ender Dragon respawn event - Optional optionalPos = entityMetadata.getValue(); + Optional optionalPos = entityMetadata.getValue(); if (optionalPos.isPresent()) { - Position pos = optionalPos.get(); - dirtyMetadata.put(EntityData.BLOCK_TARGET, Vector3i.from(pos.getX(), pos.getY(), pos.getZ())); + dirtyMetadata.put(EntityData.BLOCK_TARGET, optionalPos.get()); } else { dirtyMetadata.put(EntityData.BLOCK_TARGET, Vector3i.ZERO); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java b/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java index a841bc05d..1db2e6117 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java @@ -94,6 +94,8 @@ public class Entity { private float boundingBoxWidth; @Setter(AccessLevel.NONE) protected String nametag = ""; + @Setter(AccessLevel.NONE) + protected boolean silent = false; /* Metadata end */ protected List passengers = Collections.emptyList(); @@ -141,13 +143,19 @@ public class Entity { */ protected void initializeMetadata() { dirtyMetadata.put(EntityData.SCALE, 1f); - dirtyMetadata.put(EntityData.COLOR, 0); + dirtyMetadata.put(EntityData.COLOR, (byte) 0); dirtyMetadata.put(EntityData.MAX_AIR_SUPPLY, getMaxAir()); setDimensions(Pose.STANDING); setFlag(EntityFlag.HAS_GRAVITY, true); setFlag(EntityFlag.HAS_COLLISION, true); setFlag(EntityFlag.CAN_SHOW_NAME, true); setFlag(EntityFlag.CAN_CLIMB, true); + // Let the Java server (or us) supply all sounds for an entity + setClientSideSilent(); + } + + protected void setClientSideSilent() { + setFlag(EntityFlag.SILENT, true); } public void spawnEntity() { @@ -351,7 +359,7 @@ public class Entity { dirtyMetadata.put(EntityData.AIR_SUPPLY, (short) MathUtils.constrain(amount, 0, getMaxAir())); } - protected int getMaxAir() { + protected short getMaxAir() { return 300; } @@ -370,6 +378,10 @@ public class Entity { dirtyMetadata.put(EntityData.NAMETAG_ALWAYS_SHOW, (byte) (entityMetadata.getPrimitiveValue() ? 1 : 0)); } + public final void setSilent(BooleanEntityMetadata entityMetadata) { + silent = entityMetadata.getPrimitiveValue(); + } + public void setGravity(BooleanEntityMetadata entityMetadata) { setFlag(EntityFlag.HAS_GRAVITY, !entityMetadata.getPrimitiveValue()); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/EvokerFangsEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/EvokerFangsEntity.java index 03c71cec6..af7dca68c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/EvokerFangsEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/EvokerFangsEntity.java @@ -27,7 +27,6 @@ package org.geysermc.geyser.entity.type; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; -import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.PlaySoundPacket; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.session.GeyserSession; @@ -58,7 +57,7 @@ public class EvokerFangsEntity extends Entity implements Tickable { public void setAttackStarted() { this.attackStarted = true; - if (!getFlag(EntityFlag.SILENT)) { + if (!silent) { // Play the chomp sound PlaySoundPacket packet = new PlaySoundPacket(); packet.setPosition(this.position); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/FallingBlockEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/FallingBlockEntity.java index ceb3ea15c..3e64cfcea 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/FallingBlockEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/FallingBlockEntity.java @@ -36,8 +36,8 @@ import java.util.UUID; public class FallingBlockEntity extends Entity { - public FallingBlockEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, Vector3f position, Vector3f motion, float yaw, float pitch, int javaId) { - super(session, entityId, geyserId, uuid, EntityDefinitions.FALLING_BLOCK, position, motion, yaw, pitch, 0f); + public FallingBlockEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw, int javaId) { + super(session, entityId, geyserId, uuid, EntityDefinitions.FALLING_BLOCK, position, motion, yaw, pitch, headYaw); this.dirtyMetadata.put(EntityData.VARIANT, session.getBlockMappings().getBedrockBlockId(javaId)); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/FireworkEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/FireworkEntity.java index fa22422ba..12498f752 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/FireworkEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/FireworkEntity.java @@ -36,12 +36,12 @@ import com.nukkitx.nbt.NbtMapBuilder; import com.nukkitx.nbt.NbtType; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.packet.SetEntityMotionPacket; +import org.geysermc.floodgate.util.DeviceOs; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.type.player.PlayerEntity; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.FireworkColor; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.MathUtils; -import org.geysermc.floodgate.util.DeviceOs; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/FishingHookEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/FishingHookEntity.java index 52ad82370..75bdd9021 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/FishingHookEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/FishingHookEntity.java @@ -28,17 +28,16 @@ package org.geysermc.geyser.entity.type; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; -import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.PlaySoundPacket; import lombok.Getter; import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.entity.type.player.PlayerEntity; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.level.physics.BoundingBox; -import org.geysermc.geyser.translator.collision.BlockCollision; -import org.geysermc.geyser.level.block.BlockStateValues; -import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.level.block.BlockPositionIterator; +import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.level.physics.BoundingBox; +import org.geysermc.geyser.registry.BlockRegistries; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.collision.BlockCollision; import org.geysermc.geyser.util.BlockUtils; import java.util.UUID; @@ -56,7 +55,7 @@ public class FishingHookEntity extends ThrowableEntity { private final BoundingBox boundingBox; - public FishingHookEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, Vector3f position, Vector3f motion, float yaw, float pitch, PlayerEntity owner) { + public FishingHookEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw, PlayerEntity owner) { super(session, entityId, geyserId, uuid, EntityDefinitions.FISHING_BOBBER, position, motion, yaw, pitch, 0f); this.boundingBox = new BoundingBox(0.125, 0.125, 0.125, 0.25, 0.25, 0.25); @@ -129,7 +128,7 @@ public class FishingHookEntity extends ThrowableEntity { } private void sendSplashSound(GeyserSession session) { - if (!getFlag(EntityFlag.SILENT)) { + if (!silent) { float volume = (float) (0.2f * Math.sqrt(0.2 * (motion.getX() * motion.getX() + motion.getZ() * motion.getZ()) + motion.getY() * motion.getY())); if (volume > 1) { volume = 1; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/FurnaceMinecartEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/FurnaceMinecartEntity.java index dbd9bf91f..8074cd5ab 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/FurnaceMinecartEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/FurnaceMinecartEntity.java @@ -30,8 +30,8 @@ import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ItemEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ItemEntity.java index f36a7c732..89db9b0c8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ItemEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ItemEntity.java @@ -35,9 +35,9 @@ import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.packet.AddItemEntityPacket; import com.nukkitx.protocol.bedrock.packet.EntityEventPacket; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; -import org.geysermc.geyser.level.block.BlockStateValues; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java index 9cfa22a1f..bc7736e9b 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java @@ -79,8 +79,8 @@ public class ItemFrameEntity extends Entity { */ private boolean changed = true; - public ItemFrameEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, Direction direction) { - super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, 0f); + public ItemFrameEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw, Direction direction) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); NbtMapBuilder blockBuilder = NbtMap.builder() .putString("name", this.definition.entityType() == EntityType.GLOW_ITEM_FRAME ? "minecraft:glow_frame" : "minecraft:frame") diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java index 0cce0f8df..2550643d3 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java @@ -29,7 +29,6 @@ import com.github.steveice10.mc.protocol.data.game.entity.attribute.Attribute; import com.github.steveice10.mc.protocol.data.game.entity.attribute.AttributeType; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.FloatEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; @@ -52,17 +51,13 @@ import lombok.Setter; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.attribute.GeyserAttributeType; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.AttributeUtils; import org.geysermc.geyser.util.ChunkUtils; import org.geysermc.geyser.util.InteractionResult; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; @Getter @Setter @@ -123,12 +118,11 @@ public class LivingEntity extends Entity { session.sendUpstreamPacket(attributesPacket); } - public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { - Optional optionalPos = entityMetadata.getValue(); + public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { + Optional optionalPos = entityMetadata.getValue(); if (optionalPos.isPresent()) { - Position bedPosition = optionalPos.get(); - Vector3i vector = Vector3i.from(bedPosition.getX(), bedPosition.getY(), bedPosition.getZ()); - dirtyMetadata.put(EntityData.BED_POSITION, vector); + Vector3i bedPosition = optionalPos.get(); + dirtyMetadata.put(EntityData.BED_POSITION, bedPosition); int bed = session.getGeyser().getWorldManager().getBlockAt(session, bedPosition); // Bed has to be updated, or else player is floating in the air ChunkUtils.updateBlock(session, bed, bedPosition); @@ -136,7 +130,7 @@ public class LivingEntity extends Entity { // Has to be a byte or it does not work // (Bed position is what actually triggers sleep - "pose" is only optional) dirtyMetadata.put(EntityData.PLAYER_FLAGS, (byte) 2); - return vector; + return bedPosition; } else { // Player is no longer sleeping dirtyMetadata.put(EntityData.PLAYER_FLAGS, (byte) 0); @@ -300,7 +294,9 @@ public class LivingEntity extends Entity { if (javaAttribute.getType() instanceof AttributeType.Builtin type) { switch (type) { case GENERIC_MAX_HEALTH -> { - this.maxHealth = (float) AttributeUtils.calculateValue(javaAttribute); + // Since 1.18.0, setting the max health to 0 or below causes the entity to die on Bedrock but not on Java + // See https://github.com/GeyserMC/Geyser/issues/2971 + this.maxHealth = Math.max((float) AttributeUtils.calculateValue(javaAttribute), 1f); newAttributes.add(createHealthAttribute()); } case GENERIC_ATTACK_DAMAGE -> newAttributes.add(calculateAttribute(javaAttribute, GeyserAttributeType.ATTACK_DAMAGE)); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java index 70b5d52ba..cdd9449e5 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java @@ -25,33 +25,45 @@ package org.geysermc.geyser.entity.type; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.AddPaintingPacket; -import org.geysermc.geyser.entity.EntityDefinitions; -import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.level.PaintingType; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; public class PaintingEntity extends Entity { private static final double OFFSET = -0.46875; - private final PaintingType paintingName; - private final int direction; + private final Direction direction; - public PaintingEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, Vector3f position, PaintingType paintingName, int direction) { - super(session, entityId, geyserId, uuid, EntityDefinitions.PAINTING, position, Vector3f.ZERO, 0f, 0f, 0f); - this.paintingName = paintingName; + public PaintingEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw, Direction direction) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); this.direction = direction; } @Override public void spawnEntity() { + // Wait until we get the metadata needed + } + + public void setPaintingType(ObjectEntityMetadata entityMetadata) { + PaintingType type = PaintingType.getByPaintingType(entityMetadata.getValue()); AddPaintingPacket addPaintingPacket = new AddPaintingPacket(); addPaintingPacket.setUniqueEntityId(geyserId); addPaintingPacket.setRuntimeEntityId(geyserId); - addPaintingPacket.setMotive(paintingName.getBedrockName()); - addPaintingPacket.setPosition(fixOffset()); - addPaintingPacket.setDirection(direction); + addPaintingPacket.setMotive(type.getBedrockName()); + addPaintingPacket.setPosition(fixOffset(type)); + addPaintingPacket.setDirection(switch (direction) { + //TODO this doesn't seem right. Why did it work fine before? + case SOUTH -> 0; + case WEST -> 1; + case NORTH -> 2; + case EAST -> 3; + default -> 0; + }); session.sendUpstreamPacket(addPaintingPacket); valid = true; @@ -64,17 +76,17 @@ public class PaintingEntity extends Entity { // Do nothing, as head look messes up paintings } - private Vector3f fixOffset() { + private Vector3f fixOffset(PaintingType paintingName) { Vector3f position = super.position; position = position.add(0.5, 0.5, 0.5); double widthOffset = paintingName.getWidth() > 1 ? 0.5 : 0; double heightOffset = paintingName.getHeight() > 1 && paintingName.getHeight() != 3 ? 0.5 : 0; return switch (direction) { - case 0 -> position.add(widthOffset, heightOffset, OFFSET); - case 1 -> position.add(-OFFSET, heightOffset, widthOffset); - case 2 -> position.add(-widthOffset, heightOffset, -OFFSET); - case 3 -> position.add(OFFSET, heightOffset, -widthOffset); + case SOUTH -> position.add(widthOffset, heightOffset, OFFSET); + case WEST -> position.add(-OFFSET, heightOffset, widthOffset); + case NORTH -> position.add(-widthOffset, heightOffset, -OFFSET); + case EAST -> position.add(OFFSET, heightOffset, -widthOffset); default -> position; }; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/SpawnerMinecartEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/SpawnerMinecartEntity.java index 5f7c906e9..cd5df1bf4 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/SpawnerMinecartEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/SpawnerMinecartEntity.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.entity.type; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java index ad8b60bdb..3652860b3 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java @@ -32,8 +32,8 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; import com.nukkitx.protocol.bedrock.packet.MoveEntityDeltaPacket; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ThrownPotionEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ThrownPotionEntity.java index 6f6125f2d..fcfc4ff12 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ThrownPotionEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ThrownPotionEntity.java @@ -34,9 +34,9 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.item.Potion; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.EnumSet; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/TippedArrowEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/TippedArrowEntity.java index d296019c1..95118f928 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/TippedArrowEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/TippedArrowEntity.java @@ -29,8 +29,8 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntit import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.item.TippedArrowPotion; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java index e6cd13f61..842c94e95 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -49,11 +50,11 @@ public class AbstractFishEntity extends WaterEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (EntityUtils.attemptToBucket(session, itemInHand)) { return InteractionResult.SUCCESS; } else { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/AllayEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/AllayEntity.java new file mode 100644 index 000000000..ab444c4ab --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/AllayEntity.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living; + +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import com.nukkitx.math.vector.Vector3f; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.inventory.GeyserItemStack; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.InteractionResult; +import org.geysermc.geyser.util.InteractiveTag; + +import javax.annotation.Nonnull; +import java.util.UUID; + +public class AllayEntity extends MobEntity { + public AllayEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + } + + @Nonnull + @Override + protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + if (!this.hand.isValid() && !itemInHand.isEmpty()) { + return InteractiveTag.GIVE_ITEM_TO_ALLAY; + } else if (this.hand.isValid() && hand == Hand.MAIN_HAND && itemInHand.isEmpty()) { + // Seems like there isn't a good tag for this yet + return InteractiveTag.GIVE_ITEM_TO_ALLAY; + } else { + return super.testMobInteraction(hand, itemInHand); + } + } + + @Nonnull + @Override + protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + if (!this.hand.isValid() && !itemInHand.isEmpty()) { + //TODO play sound? + return InteractionResult.SUCCESS; + } else if (this.hand.isValid() && hand == Hand.MAIN_HAND && itemInHand.isEmpty()) { + //TOCHECK also play sound here? + return InteractionResult.SUCCESS; + } else { + return super.mobInteract(hand, itemInHand); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java index 18076763e..04e4727d0 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java @@ -26,9 +26,7 @@ package org.geysermc.geyser.entity.type.living; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Rotation; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; -import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; @@ -165,27 +163,27 @@ public class ArmorStandEntity extends LivingEntity { setFlag(EntityFlag.ADMIRING, (xd & 0x08) == 0x08); // Has no baseplate } - public void setHeadRotation(EntityMetadata entityMetadata) { + public void setHeadRotation(EntityMetadata entityMetadata) { onRotationUpdate(EntityData.MARK_VARIANT, EntityFlag.INTERESTED, EntityFlag.CHARGED, EntityFlag.POWERED, entityMetadata.getValue()); } - public void setBodyRotation(EntityMetadata entityMetadata) { + public void setBodyRotation(EntityMetadata entityMetadata) { onRotationUpdate(EntityData.VARIANT, EntityFlag.IN_LOVE, EntityFlag.CELEBRATING, EntityFlag.CELEBRATING_SPECIAL, entityMetadata.getValue()); } - public void setLeftArmRotation(EntityMetadata entityMetadata) { + public void setLeftArmRotation(EntityMetadata entityMetadata) { onRotationUpdate(EntityData.TRADE_TIER, EntityFlag.CHARGING, EntityFlag.CRITICAL, EntityFlag.DANCING, entityMetadata.getValue()); } - public void setRightArmRotation(EntityMetadata entityMetadata) { + public void setRightArmRotation(EntityMetadata entityMetadata) { onRotationUpdate(EntityData.MAX_TRADE_TIER, EntityFlag.ELDER, EntityFlag.EMOTING, EntityFlag.IDLING, entityMetadata.getValue()); } - public void setLeftLegRotation(EntityMetadata entityMetadata) { + public void setLeftLegRotation(EntityMetadata entityMetadata) { onRotationUpdate(EntityData.SKIN_ID, EntityFlag.IS_ILLAGER_CAPTAIN, EntityFlag.IS_IN_UI, EntityFlag.LINGERING, entityMetadata.getValue()); } - public void setRightLegRotation(EntityMetadata entityMetadata) { + public void setRightLegRotation(EntityMetadata entityMetadata) { onRotationUpdate(EntityData.HURT_DIRECTION, EntityFlag.IS_PREGNANT, EntityFlag.SHEARED, EntityFlag.STALKING, entityMetadata.getValue()); } @@ -200,13 +198,13 @@ public class ArmorStandEntity extends LivingEntity { * @param negativeZToggle the flag to set true if the Z value of rotation is negative * @param rotation the Java rotation value */ - private void onRotationUpdate(EntityData dataLeech, EntityFlag negativeXToggle, EntityFlag negativeYToggle, EntityFlag negativeZToggle, Rotation rotation) { + private void onRotationUpdate(EntityData dataLeech, EntityFlag negativeXToggle, EntityFlag negativeYToggle, EntityFlag negativeZToggle, Vector3f rotation) { // Indicate that rotation should be checked setFlag(EntityFlag.BRIBED, true); - int rotationX = MathUtils.wrapDegreesToInt(rotation.getPitch()); - int rotationY = MathUtils.wrapDegreesToInt(rotation.getYaw()); - int rotationZ = MathUtils.wrapDegreesToInt(rotation.getRoll()); + int rotationX = MathUtils.wrapDegreesToInt(rotation.getX()); + int rotationY = MathUtils.wrapDegreesToInt(rotation.getY()); + int rotationZ = MathUtils.wrapDegreesToInt(rotation.getZ()); // The top bit acts like binary and determines if each rotation goes above 100 // We don't do this for the negative values out of concerns of the number being too big int topBit = (Math.abs(rotationX) >= 100 ? 4 : 0) + (Math.abs(rotationY) >= 100 ? 2 : 0) + (Math.abs(rotationZ) >= 100 ? 1 : 0); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java index 7085547f8..5d49f3e85 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -47,20 +48,20 @@ public class DolphinEntity extends WaterEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { return InteractiveTag.FEED; } - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { // Feed return InteractionResult.SUCCESS; } - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java index 4ab36b00e..e5cbb2f89 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; @@ -48,7 +49,7 @@ public class IronGolemEntity extends GolemEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().ironIngot()) { if (health < maxHealth) { // Healing the iron golem @@ -57,6 +58,6 @@ public class IronGolemEntity extends GolemEntity { return InteractionResult.PASS; } } - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java index 8734f8bd1..723a9c431 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java @@ -90,7 +90,7 @@ public class MobEntity extends LivingEntity { } } - InteractiveTag tag = testMobInteraction(itemStack); + InteractiveTag tag = testMobInteraction(hand, itemStack); return tag != InteractiveTag.NONE ? tag : super.testInteraction(hand); } } @@ -109,7 +109,7 @@ public class MobEntity extends LivingEntity { if (result.consumesAction()) { return result; } else { - InteractionResult mobResult = mobInteract(itemInHand); + InteractionResult mobResult = mobInteract(hand, itemInHand); return mobResult.consumesAction() ? mobResult : super.interact(hand); } } @@ -137,12 +137,12 @@ public class MobEntity extends LivingEntity { } @Nonnull - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { return InteractiveTag.NONE; } @Nonnull - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { return InteractionResult.PASS; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java index 794f71c04..b075de882 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -51,7 +52,7 @@ public class SnowGolemEntity extends GolemEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (session.getItemMappings().getStoredItems().shears() == itemInHand.getJavaId() && isAlive() && !getFlag(EntityFlag.SHEARED)) { // Shearing the snow golem return InteractiveTag.SHEAR; @@ -61,7 +62,7 @@ public class SnowGolemEntity extends GolemEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (session.getItemMappings().getStoredItems().shears() == itemInHand.getJavaId() && isAlive() && !getFlag(EntityFlag.SHEARED)) { // Shearing the snow golem return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/SquidEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/SquidEntity.java index 552f6a46c..6b235a8e5 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/SquidEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/SquidEntity.java @@ -30,8 +30,8 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.MoveEntityDeltaPacket; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.type.Tickable; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java new file mode 100644 index 000000000..034dffc65 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living; + +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import com.nukkitx.math.vector.Vector3f; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.inventory.GeyserItemStack; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.InteractionResult; +import org.geysermc.geyser.util.InteractiveTag; + +import javax.annotation.Nonnull; +import java.util.UUID; + +public class TadpoleEntity extends AbstractFishEntity { + public TadpoleEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + } + + @Nonnull + @Override + protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + if (isFood(itemInHand)) { + return InteractiveTag.FEED; + } + return super.testMobInteraction(hand, itemInHand); + } + + @Nonnull + @Override + protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + if (isFood(itemInHand)) { + //TODO particles + return InteractionResult.SUCCESS; + } + return super.mobInteract(hand, itemInHand); + } + + private boolean isFood(GeyserItemStack itemStack) { + return itemStack.getJavaId() == session.getItemMappings().getStoredItems().slimeBall(); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java index 64f41c5ad..16a72a235 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java @@ -25,14 +25,15 @@ package org.geysermc.geyser.entity.type.living.animal; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityEventType; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.type.living.AgeableEntity; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -63,16 +64,16 @@ public class AnimalEntity extends AgeableEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (canEat(itemInHand)) { return InteractiveTag.FEED; } - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (canEat(itemInHand)) { // FEED if (getFlag(EntityFlag.BABY)) { @@ -82,6 +83,6 @@ public class AnimalEntity extends AgeableEntity { return InteractionResult.CONSUME; } } - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java index aafa2b782..74652da80 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java @@ -27,13 +27,14 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.InteractionResult; @@ -64,7 +65,7 @@ public class AxolotlEntity extends AnimalEntity { } @Override - protected int getMaxAir() { + protected short getMaxAir() { return 6000; } @@ -75,11 +76,11 @@ public class AxolotlEntity extends AnimalEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (EntityUtils.attemptToBucket(session, itemInHand)) { return InteractionResult.SUCCESS; } else { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java index 09b1b73c5..ce02905b9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java @@ -33,8 +33,8 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityEventType; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.EntityEventPacket; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java index c5fad8bb8..2185d158b 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java @@ -27,8 +27,8 @@ package org.geysermc.geyser.entity.type.living.animal; import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java index b5ae48b23..3fd55d073 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.SoundEvent; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; @@ -44,9 +45,9 @@ public class CowEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (getFlag(EntityFlag.BABY) || !itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) { - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } return InteractiveTag.MILK; @@ -54,9 +55,9 @@ public class CowEntity extends AnimalEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (getFlag(EntityFlag.BABY) || !itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } session.playSoundEvent(SoundEvent.MILK, position); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java index 5ae3bd524..8e350e685 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java @@ -31,8 +31,8 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java new file mode 100644 index 000000000..97af056a0 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living.animal; + +import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata; +import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.protocol.bedrock.data.entity.EntityData; +import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.Entity; +import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; + +import java.util.OptionalInt; +import java.util.UUID; + +public class FrogEntity extends AnimalEntity { + public FrogEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + } + + @Override + public void setPose(Pose pose) { + setFlag(EntityFlag.JUMP_GOAL_JUMP, pose == Pose.LONG_JUMPING); + setFlag(EntityFlag.CROAKING, pose == Pose.CROAKING); + setFlag(EntityFlag.EAT_MOB, pose == Pose.USING_TONGUE); + + super.setPose(pose); + } + + public void setFrogVariant(IntEntityMetadata entityMetadata) { + int variant = entityMetadata.getPrimitiveValue(); + dirtyMetadata.put(EntityData.VARIANT, switch (variant) { + case 1 -> 2; // White + case 2 -> 1; // Green + default -> variant; + }); + } + + public void setTongueTarget(ObjectEntityMetadata entityMetadata) { + OptionalInt entityId = entityMetadata.getValue(); + if (entityId.isPresent()) { + Entity entity = session.getEntityCache().getEntityByJavaId(entityId.getAsInt()); + if (entity != null) { + dirtyMetadata.put(EntityData.TARGET_EID, entity.getGeyserId()); + } + } else { + dirtyMetadata.put(EntityData.TARGET_EID, 0L); + } + } + + @Override + public boolean canEat(String javaIdentifierStripped, ItemMapping mapping) { + return mapping.getJavaId() == session.getItemMappings().getStoredItems().slimeBall(); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java index 817b466fa..d50eb74c5 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java @@ -27,8 +27,10 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.SoundEvent; +import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -43,6 +45,8 @@ public class GoatEntity extends AnimalEntity { private static final float LONG_JUMPING_WIDTH = 0.9f * 0.7f; private boolean isScreamer; + private boolean hasLeftHorn; + private boolean hasRightHorn; public GoatEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); @@ -65,12 +69,26 @@ public class GoatEntity extends AnimalEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.BABY) && itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) { session.playSoundEvent(isScreamer ? SoundEvent.MILK_SCREAMER : SoundEvent.MILK, position); return InteractionResult.SUCCESS; } else { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } + + public void setHasLeftHorn(BooleanEntityMetadata entityMetadata) { + hasLeftHorn = entityMetadata.getPrimitiveValue(); + setHornCount(); + } + + public void setHasRightHorn(BooleanEntityMetadata entityMetadata) { + hasRightHorn = entityMetadata.getPrimitiveValue(); + setHornCount(); + } + + private void setHornCount() { + dirtyMetadata.put(EntityData.GOAT_HORN_COUNT, (hasLeftHorn ? 1 : 0) + (hasRightHorn ? 1 : 0)); + } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java index 362c25256..a96d3072c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java @@ -49,7 +49,7 @@ public class HoglinEntity extends AnimalEntity { @Override protected boolean isShaking() { - return (!isImmuneToZombification && !session.isDimensionPiglinSafe()) || super.isShaking(); + return (!isImmuneToZombification && !session.getDimensionType().piglinSafe()) || super.isShaking(); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java index c249663ac..d2b8420fd 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import org.geysermc.geyser.entity.EntityDefinition; @@ -52,7 +53,7 @@ public class MooshroomEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { StoredItemMappings storedItems = session.getItemMappings().getStoredItems(); if (!isBaby()) { if (itemInHand.getJavaId() == storedItems.bowl()) { @@ -63,12 +64,12 @@ public class MooshroomEntity extends AnimalEntity { return InteractiveTag.MOOSHROOM_SHEAR; } } - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { StoredItemMappings storedItems = session.getItemMappings().getStoredItems(); boolean isBaby = isBaby(); if (!isBaby && itemInHand.getJavaId() == storedItems.bowl()) { @@ -81,6 +82,6 @@ public class MooshroomEntity extends AnimalEntity { // ? return InteractionResult.SUCCESS; } - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java index 4ed2bdce1..a44a0e9f9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java @@ -25,12 +25,13 @@ package org.geysermc.geyser.entity.type.living.animal; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -50,23 +51,23 @@ public class OcelotEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { // Attempt to feed return InteractiveTag.FEED; } else { - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { // Attempt to feed return InteractionResult.SUCCESS; } else { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java index d607f113b..5e8d9c16f 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityEventType; @@ -34,8 +35,8 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.EntityEventPacket; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -93,16 +94,16 @@ public class PandaEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (mainGene == Gene.WORRIED && session.isThunder()) { return InteractiveTag.NONE; } - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (mainGene == Gene.WORRIED && session.isThunder()) { // Huh! return InteractionResult.PASS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java index 05f628f44..3b424b456 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java @@ -25,12 +25,13 @@ package org.geysermc.geyser.entity.type.living.animal; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -51,12 +52,12 @@ public class PigEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount return InteractiveTag.MOUNT; } else { - InteractiveTag superTag = super.testMobInteraction(itemInHand); + InteractiveTag superTag = super.testMobInteraction(hand, itemInHand); if (superTag != InteractiveTag.NONE) { return superTag; } else { @@ -68,12 +69,12 @@ public class PigEntity extends AnimalEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount return InteractionResult.SUCCESS; } else { - InteractionResult superResult = super.mobInteract(itemInHand); + InteractionResult superResult = super.mobInteract(hand, itemInHand); if (superResult.consumesAction()) { return superResult; } else { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java index b677c135e..1c5c47261 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java @@ -27,8 +27,8 @@ package org.geysermc.geyser.entity.type.living.animal; import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java index 966e500b4..c49c9beb3 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java @@ -31,8 +31,8 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java index 9481944a7..0febfdb11 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; @@ -55,11 +56,11 @@ public class SheepEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().shears()) { return InteractiveTag.SHEAR; } else { - InteractiveTag tag = super.testMobInteraction(itemInHand); + InteractiveTag tag = super.testMobInteraction(hand, itemInHand); if (tag != InteractiveTag.NONE) { return tag; } else { @@ -74,11 +75,11 @@ public class SheepEntity extends AnimalEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().shears()) { return InteractionResult.CONSUME; } else { - InteractionResult superResult = super.mobInteract(itemInHand); + InteractionResult superResult = super.mobInteract(hand, itemInHand); if (superResult.consumesAction()) { return superResult; } else { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java index 5f42b4b67..fdbaad997 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java @@ -26,13 +26,14 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; -import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -98,12 +99,12 @@ public class StriderEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount Strider return InteractiveTag.RIDE_STRIDER; } else { - InteractiveTag tag = super.testMobInteraction(itemInHand); + InteractiveTag tag = super.testMobInteraction(hand, itemInHand); if (tag != InteractiveTag.NONE) { return tag; } else { @@ -115,12 +116,12 @@ public class StriderEntity extends AnimalEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount Strider return InteractionResult.SUCCESS; } else { - InteractionResult superResult = super.mobInteract(itemInHand); + InteractionResult superResult = super.mobInteract(hand, itemInHand); if (superResult.consumesAction()) { return superResult; } else { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java index 79a7b8f50..1aa0d4fc9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java @@ -29,8 +29,8 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanE import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java index 9139495b8..867d9f799 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.google.common.collect.ImmutableSet; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; @@ -129,12 +130,12 @@ public class AbstractHorseEntity extends AnimalEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { - return testHorseInteraction(itemInHand); + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + return testHorseInteraction(hand, itemInHand); } @Nonnull - protected final InteractiveTag testHorseInteraction(@Nonnull GeyserItemStack itemInHand) { + protected final InteractiveTag testHorseInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { boolean isBaby = isBaby(); if (!isBaby) { if (getFlag(EntityFlag.TAMED) && session.isSneaking()) { @@ -142,7 +143,7 @@ public class AbstractHorseEntity extends AnimalEntity { } if (!passengers.isEmpty()) { - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } } @@ -171,7 +172,7 @@ public class AbstractHorseEntity extends AnimalEntity { } if (isBaby) { - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } else { return InteractiveTag.MOUNT; } @@ -179,12 +180,12 @@ public class AbstractHorseEntity extends AnimalEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { - return mobHorseInteract(itemInHand); + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + return mobHorseInteract(hand, itemInHand); } @Nonnull - protected final InteractionResult mobHorseInteract(@Nonnull GeyserItemStack itemInHand) { + protected final InteractionResult mobHorseInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { boolean isBaby = isBaby(); if (!isBaby) { if (getFlag(EntityFlag.TAMED) && session.isSneaking()) { @@ -193,7 +194,7 @@ public class AbstractHorseEntity extends AnimalEntity { } if (!passengers.isEmpty()) { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } @@ -227,7 +228,7 @@ public class AbstractHorseEntity extends AnimalEntity { } if (isBaby) { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } else { // Attempt to mount // TODO client-set flags sitting standing? @@ -249,15 +250,15 @@ public class AbstractHorseEntity extends AnimalEntity { /* Just a place to stuff common code for the undead variants without having duplicate code */ - protected final InteractiveTag testUndeadHorseInteraction(@Nonnull GeyserItemStack itemInHand) { + protected final InteractiveTag testUndeadHorseInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TAMED)) { return InteractiveTag.NONE; } else if (isBaby()) { - return testHorseInteraction(itemInHand); + return testHorseInteraction(hand, itemInHand); } else if (session.isSneaking()) { return InteractiveTag.OPEN_CONTAINER; } else if (!passengers.isEmpty()) { - return testHorseInteraction(itemInHand); + return testHorseInteraction(hand, itemInHand); } else { if (session.getItemMappings().getStoredItems().saddle() == itemInHand.getJavaId()) { return InteractiveTag.OPEN_CONTAINER; @@ -271,16 +272,16 @@ public class AbstractHorseEntity extends AnimalEntity { } } - protected final InteractionResult undeadHorseInteract(@Nonnull GeyserItemStack itemInHand) { + protected final InteractionResult undeadHorseInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TAMED)) { return InteractionResult.PASS; } else if (isBaby()) { - return mobHorseInteract(itemInHand); + return mobHorseInteract(hand, itemInHand); } else if (session.isSneaking()) { // Opens inventory return InteractionResult.SUCCESS; } else if (!passengers.isEmpty()) { - return mobHorseInteract(itemInHand); + return mobHorseInteract(hand, itemInHand); } else { // The client tests for saddle but it doesn't matter for us at this point. return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java index c9f95f507..4d07c7d13 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -42,13 +43,13 @@ public class SkeletonHorseEntity extends AbstractHorseEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { - return testUndeadHorseInteraction(itemInHand); + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + return testUndeadHorseInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { - return undeadHorseInteract(itemInHand); + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + return undeadHorseInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java index ddde11c5d..659a8bad8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -42,13 +43,13 @@ public class ZombieHorseEntity extends AbstractHorseEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { - return testUndeadHorseInteraction(itemInHand); + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + return testUndeadHorseInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { - return undeadHorseInteract(itemInHand); + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + return undeadHorseInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java index c17503606..f700f6951 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java @@ -28,13 +28,14 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -105,7 +106,7 @@ public class CatEntity extends TameableEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { boolean tamed = getFlag(EntityFlag.TAMED); if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) { // Toggle sitting @@ -117,7 +118,7 @@ public class CatEntity extends TameableEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { boolean tamed = getFlag(EntityFlag.TAMED); if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) { return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java index b7aca99e5..51582e087 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java @@ -25,12 +25,13 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -58,7 +59,7 @@ public class ParrotEntity extends TameableEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { String javaIdentifierStripped = itemInHand.getMapping(session).getJavaIdentifier().replace("minecraft:", ""); boolean tame = getFlag(EntityFlag.TAMED); if (!tame && isTameFood(javaIdentifierStripped)) { @@ -69,12 +70,12 @@ public class ParrotEntity extends TameableEntity { // Sitting/standing return getFlag(EntityFlag.SITTING) ? InteractiveTag.STAND : InteractiveTag.SIT; } - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { String javaIdentifierStripped = itemInHand.getMapping(session).getJavaIdentifier().replace("minecraft:", ""); boolean tame = getFlag(EntityFlag.TAMED); if (!tame && isTameFood(javaIdentifierStripped)) { @@ -85,6 +86,6 @@ public class ParrotEntity extends TameableEntity { // Sitting/standing return InteractionResult.SUCCESS; } - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/TameableEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/TameableEntity.java index 33b2144e8..c95556cb4 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/TameableEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/TameableEntity.java @@ -31,8 +31,8 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import lombok.Getter; -import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.living.animal.AnimalEntity; import org.geysermc.geyser.session.GeyserSession; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java index 8b900f071..d6825e8a1 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java @@ -27,14 +27,15 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.google.common.collect.ImmutableSet; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.ItemUtils; @@ -103,7 +104,7 @@ public class WolfEntity extends TameableEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (getFlag(EntityFlag.ANGRY)) { return InteractiveTag.NONE; } @@ -122,12 +123,12 @@ public class WolfEntity extends TameableEntity { return getFlag(EntityFlag.SITTING) ? InteractiveTag.STAND : InteractiveTag.SIT; } } - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (ownerBedrockId == session.getPlayerEntity().getGeyserId() || getFlag(EntityFlag.TAMED) || itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bone") && !getFlag(EntityFlag.ANGRY)) { // Sitting toggle or feeding; not angry diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java index 633ba707f..e6538ebad 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.merchant; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -51,7 +52,7 @@ public class AbstractMerchantEntity extends AgeableEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { String javaIdentifier = itemInHand.getMapping(session).getJavaIdentifier(); if (!javaIdentifier.equals("minecraft:villager_spawn_egg") && (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING) && ((VillagerEntity) this).isCanTradeWith())) { @@ -60,12 +61,12 @@ public class AbstractMerchantEntity extends AgeableEntity { return InteractiveTag.TRADE; } } - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { String javaIdentifier = itemInHand.getMapping(session).getJavaIdentifier(); if (!javaIdentifier.equals("minecraft:villager_spawn_egg") && (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING)) @@ -73,7 +74,7 @@ public class AbstractMerchantEntity extends AgeableEntity { // Trading time return InteractionResult.SUCCESS; } else { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java index 866ba36fc..e77d34f23 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.entity.type.living.merchant; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3i; @@ -103,7 +102,7 @@ public class VillagerEntity extends AbstractMerchantEntity { } @Override - public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { + public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { return bedPosition = super.setBedPosition(entityMetadata); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java index ed26a71e1..e003dd080 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java @@ -48,6 +48,6 @@ public class BasePiglinEntity extends MonsterEntity { @Override protected boolean isShaking() { - return (!isImmuneToZombification && !session.isDimensionPiglinSafe()) || super.isShaking(); + return (!isImmuneToZombification && !session.getDimensionType().piglinSafe()) || super.isShaking(); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java index cf9393410..f73ab257a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.monster; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.SoundEvent; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; @@ -63,23 +64,23 @@ public class CreeperEntity extends MonsterEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().flintAndSteel()) { return InteractiveTag.IGNITE_CREEPER; } else { - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().flintAndSteel()) { // Ignite creeper session.playSoundEvent(SoundEvent.IGNITE, position); return InteractionResult.SUCCESS; } else { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonEntity.java index 99ab1a55c..6adcb4694 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonEntity.java @@ -39,6 +39,7 @@ import org.geysermc.geyser.entity.type.living.MobEntity; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.DimensionUtils; +import java.util.Optional; import java.util.Random; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; @@ -212,7 +213,7 @@ public class EnderDragonEntity extends MobEntity implements Tickable { */ private void effectTick() { Random random = ThreadLocalRandom.current(); - if (!getFlag(EntityFlag.SILENT)) { + if (!silent) { if (Math.cos(wingPosition * 2f * Math.PI) <= -0.3f && Math.cos(lastWingPosition * 2f * Math.PI) >= -0.3f) { PlaySoundPacket playSoundPacket = new PlaySoundPacket(); playSoundPacket.setSound("mob.enderdragon.flap"); @@ -262,6 +263,7 @@ public class EnderDragonEntity extends MobEntity implements Tickable { spawnParticleEffectPacket.setDimensionId(DimensionUtils.javaToBedrock(session.getDimension())); spawnParticleEffectPacket.setPosition(head.getPosition().add(random.nextGaussian() / 2f, random.nextGaussian() / 2f, random.nextGaussian() / 2f)); spawnParticleEffectPacket.setIdentifier("minecraft:dragon_breath_fire"); + spawnParticleEffectPacket.setMolangVariablesJson(Optional.empty()); session.sendUpstreamPacket(spawnParticleEffectPacket); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonPartEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonPartEntity.java index a169081fc..5631a68c9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonPartEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/EnderDragonPartEntity.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.entity.type.living.monster; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; -import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.EntityDefinitions; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.session.GeyserSession; public class EnderDragonPartEntity extends Entity { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/GuardianEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/GuardianEntity.java index fe1f3038b..e2454123f 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/GuardianEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/GuardianEntity.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.entity.type.living.monster; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; -import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java index f0577ee20..4eb0baa6c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.monster; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; @@ -71,8 +72,8 @@ public class PiglinEntity extends BasePiglinEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { - InteractiveTag tag = super.testMobInteraction(itemInHand); + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + InteractiveTag tag = super.testMobInteraction(hand, itemInHand); if (tag != InteractiveTag.NONE) { return tag; } else { @@ -82,8 +83,8 @@ public class PiglinEntity extends BasePiglinEntity { @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { - InteractionResult superResult = super.mobInteract(itemInHand); + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + InteractionResult superResult = super.mobInteract(hand, itemInHand); if (superResult.consumesAction()) { return superResult; } else { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/WardenEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/WardenEntity.java new file mode 100644 index 000000000..1ca34037c --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/WardenEntity.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living.monster; + +import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import com.nukkitx.math.GenericMath; +import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.protocol.bedrock.data.entity.EntityData; +import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; +import com.nukkitx.protocol.bedrock.packet.PlaySoundPacket; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.Tickable; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.MathUtils; + +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class WardenEntity extends MonsterEntity implements Tickable { + private int heartBeatDelay; + private int tickCount; + + private int sonicBoomTickDuration; + + public WardenEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + } + + @Override + public void setPose(Pose pose) { + setFlag(EntityFlag.DIGGING, pose == Pose.DIGGING); + setFlag(EntityFlag.EMERGING, pose == Pose.EMERGING); + setFlag(EntityFlag.ROARING, pose == Pose.ROARING); + setFlag(EntityFlag.SNIFFING, pose == Pose.SNIFFING); + super.setPose(pose); + } + + public void setAngerLevel(IntEntityMetadata entityMetadata) { + float anger = (float) entityMetadata.getPrimitiveValue() / 80f; + heartBeatDelay = 40 - GenericMath.floor(MathUtils.clamp(anger, 0.0F, 1.0F) * 30F); + dirtyMetadata.put(EntityData.HEARTBEAT_INTERVAL_TICKS, heartBeatDelay); + } + + @Override + public void tick() { + if (++tickCount % heartBeatDelay == 0 && !silent) { + // We have to do these calculations because they're clientside on Java Edition but we mute entities + // to prevent hearing their step sounds + ThreadLocalRandom random = ThreadLocalRandom.current(); + + PlaySoundPacket packet = new PlaySoundPacket(); + packet.setSound("mob.warden.heartbeat"); + packet.setPosition(position); + packet.setPitch((random.nextFloat() - random.nextFloat()) * 0.2f + 1.0f); + packet.setVolume(1.0f); + session.sendUpstreamPacket(packet); + } + + if (sonicBoomTickDuration > 0) { + sonicBoomTickDuration--; + if (sonicBoomTickDuration == 0) { + setFlag(EntityFlag.SONIC_BOOM, false); + updateBedrockMetadata(); + } + } + } + + public void onSonicBoom() { + setFlag(EntityFlag.SONIC_BOOM, true); + updateBedrockMetadata(); + + sonicBoomTickDuration = 3 * 20; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/WitherEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/WitherEntity.java index d6926996e..81aa1ed99 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/WitherEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/WitherEntity.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.entity.type.living.monster; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; -import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java index 1ec0fc26b..bf5180e36 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.entity.type.living.monster; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; @@ -67,22 +68,22 @@ public class ZombieVillagerEntity extends ZombieEntity { @Nonnull @Override - protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().goldenApple()) { return InteractiveTag.CURE; } else { - return super.testMobInteraction(itemInHand); + return super.testMobInteraction(hand, itemInHand); } } @Nonnull @Override - protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().goldenApple()) { // The client doesn't know if the entity has weakness as that's not usually sent over the network return InteractionResult.CONSUME; } else { - return super.mobInteract(itemInHand); + return super.mobInteract(hand, itemInHand); } } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/raid/PillagerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/raid/PillagerEntity.java index 4359c4254..716c54de1 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/raid/PillagerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/raid/PillagerEntity.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.entity.type.living.monster.raid; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java index 5c0b18838..6f2958ffd 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java @@ -27,7 +27,6 @@ package org.geysermc.geyser.entity.type.player; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.FloatEntityMetadata; @@ -169,6 +168,12 @@ public class PlayerEntity extends LivingEntity { } session.sendUpstreamPacket(movePlayerPacket); + + if (teleported) { + // As of 1.19.0, head yaw seems to be ignored during teleports. + updateHeadLookRotation(headYaw); + } + if (leftParrot != null) { leftParrot.moveAbsolute(position, yaw, pitch, headYaw, true, teleported); } @@ -211,52 +216,8 @@ public class PlayerEntity extends LivingEntity { } } - @Override - public void updateHeadLookRotation(float headYaw) { - moveRelative(0, 0, 0, getYaw(), getPitch(), headYaw, isOnGround()); - MovePlayerPacket movePlayerPacket = new MovePlayerPacket(); - movePlayerPacket.setRuntimeEntityId(geyserId); - movePlayerPacket.setPosition(position); - movePlayerPacket.setRotation(getBedrockRotation()); - movePlayerPacket.setMode(MovePlayerPacket.Mode.HEAD_ROTATION); - session.sendUpstreamPacket(movePlayerPacket); - } - - @Override - public void updatePositionAndRotation(double moveX, double moveY, double moveZ, float yaw, float pitch, boolean isOnGround) { - moveRelative(moveX, moveY, moveZ, yaw, pitch, isOnGround); - if (leftParrot != null) { - leftParrot.moveRelative(moveX, moveY, moveZ, yaw, pitch, isOnGround); - } - if (rightParrot != null) { - rightParrot.moveRelative(moveX, moveY, moveZ, yaw, pitch, isOnGround); - } - } - public void updateRotation(float yaw, float pitch, float headYaw, boolean isOnGround) { - // the method below is called by super.updateRotation(yaw, pitch, isOnGround). - // but we have to be able to set the headYaw, so we call the method below directly. - super.moveRelative(0, 0, 0, yaw, pitch, headYaw, isOnGround); - - // Both packets need to be sent or else player head rotation isn't correctly updated - MovePlayerPacket movePlayerPacket = new MovePlayerPacket(); - movePlayerPacket.setRuntimeEntityId(geyserId); - movePlayerPacket.setPosition(position); - movePlayerPacket.setRotation(getBedrockRotation()); - movePlayerPacket.setOnGround(isOnGround); - movePlayerPacket.setMode(MovePlayerPacket.Mode.HEAD_ROTATION); - session.sendUpstreamPacket(movePlayerPacket); - if (leftParrot != null) { - leftParrot.updateRotation(yaw, pitch, isOnGround); - } - if (rightParrot != null) { - rightParrot.updateRotation(yaw, pitch, isOnGround); - } - } - - @Override - public void updateRotation(float yaw, float pitch, boolean isOnGround) { - updateRotation(yaw, pitch, getHeadYaw(), isOnGround); + moveRelative(0, 0, 0, yaw, pitch, headYaw, isOnGround); } @Override @@ -265,7 +226,7 @@ public class PlayerEntity extends LivingEntity { } @Override - public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { + public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { return bedPosition = super.setBedPosition(entityMetadata); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java index ae8d23810..f16f46e2e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.player; import com.github.steveice10.mc.protocol.data.game.entity.attribute.Attribute; import com.github.steveice10.mc.protocol.data.game.entity.attribute.AttributeType; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.GlobalPos; import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.nukkitx.math.vector.Vector3f; @@ -40,7 +41,9 @@ import org.geysermc.geyser.entity.attribute.GeyserAttributeType; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.AttributeUtils; +import org.geysermc.geyser.util.DimensionUtils; +import javax.annotation.Nullable; import java.util.Collections; import java.util.List; import java.util.Map; @@ -75,6 +78,11 @@ public class SessionPlayerEntity extends PlayerEntity { valid = true; } + @Override + protected void setClientSideSilent() { + // Do nothing, since we want the session player to hear their own footstep sounds for example. + } + @Override public void spawnEntity() { // Already logged in @@ -134,6 +142,10 @@ public class SessionPlayerEntity extends PlayerEntity { return maxHealth; } + public float getHealth() { + return this.health; + } + public void setHealth(float health) { this.health = health; } @@ -218,4 +230,14 @@ public class SessionPlayerEntity extends PlayerEntity { this.attributes.put(type, attributeData); return attributeData; } + + public void setLastDeathPosition(@Nullable GlobalPos pos) { + if (pos != null) { + dirtyMetadata.put(EntityData.PLAYER_LAST_DEATH_POS, pos.getPosition()); + dirtyMetadata.put(EntityData.PLAYER_LAST_DEATH_DIMENSION, DimensionUtils.javaToBedrock(pos.getDimension())); + dirtyMetadata.put(EntityData.PLAYER_HAS_DIED, (byte) 1); + } else { + dirtyMetadata.put(EntityData.PLAYER_HAS_DIED, (byte) 0); + } + } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java index f1a447b57..6c15a4d3e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java @@ -26,33 +26,28 @@ package org.geysermc.geyser.entity.type.player; import com.nukkitx.math.vector.Vector3f; -import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.data.GameType; import com.nukkitx.protocol.bedrock.data.PlayerPermission; import com.nukkitx.protocol.bedrock.data.command.CommandPermission; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.AddPlayerPacket; -import lombok.Getter; +import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.SkullCache; +import org.geysermc.geyser.skin.SkullSkinManager; import java.util.UUID; +import java.util.concurrent.TimeUnit; /** * A wrapper to handle skulls more effectively - skulls have to be treated as entities since there are no * custom player skulls in Bedrock. */ public class SkullPlayerEntity extends PlayerEntity { - /** - * Stores the block state that the skull is associated with. Used to determine if the block in the skull's position - * has changed - */ - @Getter - private final int blockState; - public SkullPlayerEntity(GeyserSession session, long geyserId, Vector3f position, float rotation, int blockState, String texturesProperty) { - super(session, 0, geyserId, UUID.randomUUID(), position, Vector3f.ZERO, rotation, 0, rotation, "", texturesProperty); - this.blockState = blockState; + public SkullPlayerEntity(GeyserSession session, long geyserId) { + super(session, 0, geyserId, UUID.randomUUID(), Vector3f.ZERO, Vector3f.ZERO, 0, 0, 0, "", null); setPlayerList(false); } @@ -95,8 +90,57 @@ public class SkullPlayerEntity extends PlayerEntity { session.sendUpstreamPacket(addPlayerPacket); } - public void despawnEntity(Vector3i position) { - this.despawnEntity(); - session.getSkullCache().remove(position, this); + /** + * Hide the player entity so that it can be reused for a different skull. + */ + public void free() { + setFlag(EntityFlag.INVISIBLE, true); + updateBedrockMetadata(); + + // Move skull entity out of the way + moveAbsolute(session.getPlayerEntity().getPosition().up(128), 0, 0, 0, false, true); + } + + public void updateSkull(SkullCache.Skull skull) { + if (!skull.getTexturesProperty().equals(getTexturesProperty())) { + // Make skull invisible as we change skins + setFlag(EntityFlag.INVISIBLE, true); + updateBedrockMetadata(); + + setTexturesProperty(skull.getTexturesProperty()); + + SkullSkinManager.requestAndHandleSkin(this, session, (skin -> session.scheduleInEventLoop(() -> { + // Delay to minimize split-second "player" pop-in + setFlag(EntityFlag.INVISIBLE, false); + updateBedrockMetadata(); + }, 250, TimeUnit.MILLISECONDS))); + } else { + // Just a rotation/position change + setFlag(EntityFlag.INVISIBLE, false); + updateBedrockMetadata(); + } + + float x = skull.getPosition().getX() + .5f; + float y = skull.getPosition().getY() - .01f; + float z = skull.getPosition().getZ() + .5f; + float rotation; + + int blockState = skull.getBlockState(); + byte floorRotation = BlockStateValues.getSkullRotation(blockState); + if (floorRotation == -1) { + // Wall skull + y += 0.25f; + rotation = BlockStateValues.getSkullWallDirections().get(blockState); + switch ((int) rotation) { + case 180 -> z += 0.24f; // North + case 0 -> z -= 0.24f; // South + case 90 -> x += 0.24f; // West + case 270 -> x -= 0.24f; // East + } + } else { + rotation = (180f + (floorRotation * 22.5f)) % 360; + } + + moveAbsolute(Vector3f.from(x, y, z), rotation, 0, rotation, true, true); } } diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java index 19e2765e8..b220ab576 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java @@ -30,13 +30,12 @@ import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.api.extension.ExtensionDescription; import org.geysermc.geyser.api.extension.exception.InvalidExtensionException; + import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; public class GeyserExtensionClassLoader extends URLClassLoader { private final GeyserExtensionLoader loader; diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionDescription.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionDescription.java index 5c8ff0ae2..eaf29a819 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionDescription.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionDescription.java @@ -29,6 +29,7 @@ import org.geysermc.geyser.api.extension.ExtensionDescription; import org.geysermc.geyser.api.extension.exception.InvalidDescriptionException; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; + import java.io.Reader; import java.util.*; diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java index 676231c5b..137a2005e 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java @@ -31,23 +31,14 @@ import lombok.RequiredArgsConstructor; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.event.ExtensionEventBus; -import org.geysermc.geyser.api.extension.Extension; -import org.geysermc.geyser.api.extension.ExtensionDescription; -import org.geysermc.geyser.api.extension.ExtensionLoader; -import org.geysermc.geyser.api.extension.ExtensionLogger; -import org.geysermc.geyser.api.extension.ExtensionManager; +import org.geysermc.geyser.api.extension.*; import org.geysermc.geyser.api.extension.exception.InvalidDescriptionException; import org.geysermc.geyser.api.extension.exception.InvalidExtensionException; import org.geysermc.geyser.extension.event.GeyserExtensionEventBus; import org.geysermc.geyser.text.GeyserLocale; import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.NoSuchFileException; -import java.nio.file.Path; -import java.nio.file.Paths; +import java.nio.file.*; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionManager.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionManager.java index c125d010b..79cf1febc 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionManager.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionManager.java @@ -30,12 +30,15 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.extension.Extension; -import org.geysermc.geyser.api.extension.ExtensionManager; import org.geysermc.geyser.api.extension.ExtensionLoader; +import org.geysermc.geyser.api.extension.ExtensionManager; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.text.GeyserLocale; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.stream.Collectors; public class GeyserExtensionManager extends ExtensionManager { diff --git a/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java b/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java index 2bd4b6756..94462268e 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java @@ -46,7 +46,7 @@ public class GeyserEnchantOption { */ private static final List ENCHANT_NAMES = Arrays.asList("tougher armor", "lukeeey", "fall better", "explode less", "camo toy", "breathe better", "rtm five one six", "armor stab", "water walk", "you are elsa", - "tim two zero three", "fast walk nether", "oof ouch owie", "enemy on fire", "spider sad", "aj ferguson", "redned", + "tim two zero three", "fast walk nether", "davchoo", "oof ouch owie", "enemy on fire", "spider sad", "aj ferguson", "redned", "more items thx", "long sword reach", "fast tool", "give me block", "less breaky break", "cube craft", "strong arrow", "fist arrow", "spicy arrow", "many many arrows", "geyser", "come here fish", "i like this", "stabby stab", "supreme mortal", "avatar i guess", "more arrows", "fly finder seventeen", "in and out", diff --git a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java index e249f0167..0fb70a1a2 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java @@ -29,9 +29,9 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import lombok.Data; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; import javax.annotation.Nonnull; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java b/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java index 315e6cb18..93c1917d2 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java @@ -25,8 +25,8 @@ package org.geysermc.geyser.inventory; -import com.github.steveice10.mc.protocol.data.game.inventory.VillagerTrade; import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; +import com.github.steveice10.mc.protocol.data.game.inventory.VillagerTrade; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundMerchantOffersPacket; import lombok.Getter; import lombok.Setter; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/click/Click.java b/core/src/main/java/org/geysermc/geyser/inventory/click/Click.java index 027c7a7ce..d7068920e 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/click/Click.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/click/Click.java @@ -25,8 +25,6 @@ package org.geysermc.geyser.inventory.click; -import com.github.steveice10.mc.protocol.data.game.inventory.ClickItemAction; -import com.github.steveice10.mc.protocol.data.game.inventory.ContainerActionType; import com.github.steveice10.mc.protocol.data.game.inventory.*; import lombok.AllArgsConstructor; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java b/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java index 0da085e5d..fd26cc170 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.inventory.holder; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.google.common.collect.ImmutableSet; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NbtMap; @@ -36,9 +35,9 @@ import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket; import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; import org.geysermc.geyser.inventory.Container; import org.geysermc.geyser.inventory.Inventory; +import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.InventoryTranslator; -import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.util.BlockUtils; import java.util.Collections; @@ -154,8 +153,7 @@ public class BlockInventoryHolder extends InventoryHolder { } Vector3i holderPos = inventory.getHolderPosition(); - Position pos = new Position(holderPos.getX(), holderPos.getY(), holderPos.getZ()); - int realBlock = session.getGeyser().getWorldManager().getBlockAt(session, pos.getX(), pos.getY(), pos.getZ()); + int realBlock = session.getGeyser().getWorldManager().getBlockAt(session, holderPos.getX(), holderPos.getY(), holderPos.getZ()); UpdateBlockPacket blockPacket = new UpdateBlockPacket(); blockPacket.setDataLayer(0); blockPacket.setBlockPosition(holderPos); diff --git a/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java b/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java index 9872b9441..bcbfe3e17 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java @@ -67,7 +67,8 @@ public enum Enchantment { MULTISHOT, PIERCING, QUICK_CHARGE, - SOUL_SPEED; + SOUL_SPEED, + SWIFT_SNEAK; private static final Enchantment[] VALUES = values(); @@ -109,6 +110,7 @@ public enum Enchantment { FROST_WALKER, BINDING_CURSE, SOUL_SPEED, + SWIFT_SNEAK, SHARPNESS, SMITE, BANE_OF_ARTHROPODS, diff --git a/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java b/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java index c787f87a1..56b6ee7ac 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java @@ -60,6 +60,7 @@ public class StoredItemMappings { private final int saddle; private final int shears; private final ItemMapping shield; + private final int slimeBall; private final int waterBucket; private final ItemMapping wheat; private final ItemMapping writableBook; @@ -87,6 +88,7 @@ public class StoredItemMappings { this.saddle = load(itemMappings, "saddle").getJavaId(); this.shears = load(itemMappings, "shears").getJavaId(); this.shield = load(itemMappings, "shield"); + this.slimeBall = load(itemMappings, "slime_ball").getJavaId(); this.waterBucket = load(itemMappings, "water_bucket").getJavaId(); this.wheat = load(itemMappings, "wheat"); this.writableBook = load(itemMappings, "writable_book"); diff --git a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java index a011fef6d..d61945ad8 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java @@ -27,7 +27,6 @@ package org.geysermc.geyser.inventory.recipe; import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.recipe.Ingredient; -import com.github.steveice10.mc.protocol.data.game.recipe.RecipeType; import com.github.steveice10.mc.protocol.data.game.recipe.data.ShapedRecipeData; public record GeyserShapedRecipe(int width, int height, Ingredient[] ingredients, ItemStack result) implements GeyserRecipe { diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index 1c5f9d558..e83971443 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -27,7 +27,10 @@ package org.geysermc.geyser.inventory.updater; import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundRenameItemPacket; -import com.github.steveice10.opennbt.tag.builtin.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.nukkitx.nbt.NbtMap; import com.nukkitx.nbt.NbtMapBuilder; import com.nukkitx.protocol.bedrock.data.inventory.ContainerId; @@ -40,12 +43,12 @@ import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.inventory.AnvilContainer; import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.text.MessageTranslator; -import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.inventory.item.Enchantment.JavaEnchantment; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.EnchantmentData; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.InventoryTranslator; +import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.ItemUtils; import java.util.Objects; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java index 1e5c6946d..fd25b5907 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java @@ -31,9 +31,9 @@ import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket; import lombok.AllArgsConstructor; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.util.InventoryUtils; -import org.geysermc.geyser.text.GeyserLocale; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java b/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java index f75405160..fc3c86dd4 100644 --- a/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java +++ b/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.level; import com.github.steveice10.mc.protocol.data.game.advancement.Advancement; import lombok.NonNull; import org.geysermc.geyser.session.cache.AdvancementsCache; +import org.geysermc.geyser.text.ChatColor; import java.util.List; @@ -69,6 +70,14 @@ public class GeyserAdvancement { return this.advancement.getDisplayData(); } + /** + * @return Purple for challenges and green for normal advancements + */ + public String getDisplayColor() { + Advancement.DisplayData displayData = getDisplayData(); + return displayData != null && displayData.getFrameType() == Advancement.DisplayData.FrameType.CHALLENGE ? ChatColor.LIGHT_PURPLE : ChatColor.GREEN; + } + public String getRootId(AdvancementsCache advancementsCache) { if (rootId == null) { if (this.advancement.getParentId() == null) { diff --git a/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java b/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java index 5766cabbf..100917793 100644 --- a/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java @@ -27,15 +27,14 @@ package org.geysermc.geyser.level; import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.data.game.setting.Difficulty; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket; import com.nukkitx.nbt.NbtMap; import com.nukkitx.nbt.NbtMapBuilder; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.ChunkCache; import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator; -import org.geysermc.geyser.level.block.BlockStateValues; import java.util.Locale; @@ -83,7 +82,7 @@ public class GeyserWorldManager extends WorldManager { @Override public void setGameRule(GeyserSession session, String name, Object value) { - session.sendDownstreamPacket(new ServerboundChatPacket("/gamerule " + name + " " + value)); + session.sendCommand("gamerule " + name + " " + value); gameruleCache.put(name, String.valueOf(value)); } @@ -109,12 +108,12 @@ public class GeyserWorldManager extends WorldManager { @Override public void setPlayerGameMode(GeyserSession session, GameMode gameMode) { - session.sendDownstreamPacket(new ServerboundChatPacket("/gamemode " + gameMode.name().toLowerCase(Locale.ROOT))); + session.sendCommand("gamemode " + gameMode.name().toLowerCase(Locale.ROOT)); } @Override public void setDifficulty(GeyserSession session, Difficulty difficulty) { - session.sendDownstreamPacket(new ServerboundChatPacket("/difficulty " + difficulty.name().toLowerCase(Locale.ROOT))); + session.sendCommand("difficulty " + difficulty.name().toLowerCase(Locale.ROOT)); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/level/JavaDimension.java b/core/src/main/java/org/geysermc/geyser/level/JavaDimension.java new file mode 100644 index 000000000..5f3c96b86 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/level/JavaDimension.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.level; + +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.IntTag; +import org.geysermc.geyser.util.JavaCodecEntry; + +import java.util.Map; + +/** + * Represents the information we store from the current Java dimension + * @param piglinSafe Whether piglins and hoglins are safe from conversion in this dimension. + * This controls if they have the shaking effect applied in the dimension. + */ +public record JavaDimension(int minY, int maxY, boolean piglinSafe, double worldCoordinateScale) { + + public static void load(CompoundTag tag, Map map) { + for (CompoundTag dimension : JavaCodecEntry.iterateAsTag(tag.get("minecraft:dimension_type"))) { + CompoundTag elements = dimension.get("element"); + int minY = ((IntTag) elements.get("min_y")).getValue(); + int maxY = ((IntTag) elements.get("height")).getValue(); + // Logical height can be ignored probably - seems to be for artificial limits like the Nether. + + // Set if piglins/hoglins should shake + boolean piglinSafe = ((Number) elements.get("piglin_safe").getValue()).byteValue() != (byte) 0; + // Load world coordinate scale for the world border + double coordinateScale = ((Number) elements.get("coordinate_scale").getValue()).doubleValue(); + + map.put((String) dimension.get("name").getValue(), new JavaDimension(minY, maxY, piglinSafe, coordinateScale)); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/level/PaintingType.java b/core/src/main/java/org/geysermc/geyser/level/PaintingType.java index 1d8b56030..5c0cbf643 100644 --- a/core/src/main/java/org/geysermc/geyser/level/PaintingType.java +++ b/core/src/main/java/org/geysermc/geyser/level/PaintingType.java @@ -56,17 +56,17 @@ public enum PaintingType { SKELETON("Skeleton", 4, 3), DONKEY_KONG("DonkeyKong", 4, 3), POINTER("Pointer", 4, 4), - PIG_SCENE("Pigscene", 4, 4), - BURNING_SKULL("BurningSkull", 4, 4); + PIGSCENE("Pigscene", 4, 4), + BURNING_SKULL("BurningSkull", 4, 4), + EARTH("Earth", 2, 2), + WIND("Wind", 2, 2), + WATER("Water", 2, 2), + FIRE("Fire", 2, 2); private static final PaintingType[] VALUES = values(); - private String bedrockName; - private int width; - private int height; - - public com.github.steveice10.mc.protocol.data.game.entity.type.PaintingType toJavaType() { - return com.github.steveice10.mc.protocol.data.game.entity.type.PaintingType.valueOf(name()); - } + private final String bedrockName; + private final int width; + private final int height; public static PaintingType getByName(String javaName) { for (PaintingType paintingName : VALUES) { diff --git a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java index fc86739e2..69f5d5beb 100644 --- a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.level; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.data.game.setting.Difficulty; import com.nukkitx.math.vector.Vector3i; @@ -41,17 +40,6 @@ import org.geysermc.geyser.session.GeyserSession; */ public abstract class WorldManager { - /** - * Gets the Java block state at the specified location - * - * @param session the session - * @param position the position - * @return the block state at the specified location - */ - public int getBlockAt(GeyserSession session, Position position) { - return this.getBlockAt(session, position.getX(), position.getY(), position.getZ()); - } - /** * Gets the Java block state at the specified location * @@ -59,7 +47,7 @@ public abstract class WorldManager { * @param vector the position * @return the block state at the specified location */ - public int getBlockAt(GeyserSession session, Vector3i vector) { + public final int getBlockAt(GeyserSession session, Vector3i vector) { return this.getBlockAt(session, vector.getX(), vector.getY(), vector.getZ()); } diff --git a/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java b/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java index a9b3ffedc..a8d5859dc 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java @@ -29,11 +29,11 @@ import com.fasterxml.jackson.databind.JsonNode; import it.unimi.dsi.fastutil.ints.*; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import org.geysermc.geyser.translator.level.block.entity.PistonBlockEntityTranslator; -import org.geysermc.geyser.registry.BlockRegistries; -import org.geysermc.geyser.registry.type.BlockMapping; import org.geysermc.geyser.level.physics.Direction; import org.geysermc.geyser.level.physics.PistonBehavior; +import org.geysermc.geyser.registry.BlockRegistries; +import org.geysermc.geyser.registry.type.BlockMapping; +import org.geysermc.geyser.translator.level.block.entity.PistonBlockEntityTranslator; import org.geysermc.geyser.util.collection.FixedInt2ByteMap; import org.geysermc.geyser.util.collection.FixedInt2IntMap; import org.geysermc.geyser.util.collection.LecternHasBookMap; diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java b/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java index 108982a32..d6913d6c0 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java @@ -26,7 +26,9 @@ package org.geysermc.geyser.level.physics; import com.nukkitx.math.vector.Vector3d; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.SneakyThrows; @Data @AllArgsConstructor diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java b/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java index 2617b2750..2b38e4ed4 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java @@ -32,15 +32,15 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket; import lombok.Getter; import lombok.Setter; -import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.EntityDefinitions; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.player.PlayerEntity; +import org.geysermc.geyser.level.block.BlockPositionIterator; +import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.PistonCache; import org.geysermc.geyser.translator.collision.BlockCollision; import org.geysermc.geyser.translator.collision.ScaffoldingCollision; -import org.geysermc.geyser.level.block.BlockStateValues; -import org.geysermc.geyser.level.block.BlockPositionIterator; import org.geysermc.geyser.util.BlockUtils; import java.text.DecimalFormat; diff --git a/core/src/main/java/org/geysermc/geyser/network/ConnectorServerEventHandler.java b/core/src/main/java/org/geysermc/geyser/network/ConnectorServerEventHandler.java index b508471be..e231cd08a 100644 --- a/core/src/main/java/org/geysermc/geyser/network/ConnectorServerEventHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/ConnectorServerEventHandler.java @@ -34,12 +34,12 @@ import io.netty.channel.DefaultEventLoopGroup; import io.netty.channel.socket.DatagramPacket; import io.netty.util.concurrent.DefaultThreadFactory; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.configuration.GeyserConfiguration; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.text.MessageTranslator; +import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.IGeyserPingPassthrough; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.translator.text.MessageTranslator; import javax.annotation.Nonnull; import java.net.InetSocketAddress; diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index cb9be9459..33f2a8dc0 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -28,9 +28,7 @@ package org.geysermc.geyser.network; import com.github.steveice10.mc.protocol.codec.MinecraftCodec; import com.github.steveice10.mc.protocol.codec.PacketCodec; import com.nukkitx.protocol.bedrock.BedrockPacketCodec; -import com.nukkitx.protocol.bedrock.v475.Bedrock_v475; -import com.nukkitx.protocol.bedrock.v486.Bedrock_v486; -import com.nukkitx.protocol.bedrock.v503.Bedrock_v503; +import com.nukkitx.protocol.bedrock.v527.Bedrock_v527; import java.util.ArrayList; import java.util.Collections; @@ -45,7 +43,7 @@ public final class GameProtocol { * Default Bedrock codec that should act as a fallback. Should represent the latest available * release of the game that Geyser supports. */ - public static final BedrockPacketCodec DEFAULT_BEDROCK_CODEC = Bedrock_v503.V503_CODEC; + public static final BedrockPacketCodec DEFAULT_BEDROCK_CODEC = Bedrock_v527.V527_CODEC; /** * A list of all supported Bedrock versions that can join Geyser */ @@ -58,12 +56,8 @@ public final class GameProtocol { private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC; static { - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v475.V475_CODEC.toBuilder().minecraftVersion("1.18.0/1.18.1/1.18.2").build()); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v486.V486_CODEC.toBuilder() - .minecraftVersion("1.18.10/1.18.12") // 1.18.11 is also supported, but was only on Switch and since that auto-updates it's not needed - .build()); SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC.toBuilder() - .minecraftVersion("1.18.30/1.18.31") + .minecraftVersion("1.19.0") .build()); } diff --git a/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java b/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java index f3ccb0d2e..370604db9 100644 --- a/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java +++ b/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java @@ -26,8 +26,11 @@ package org.geysermc.geyser.network.netty; import com.github.steveice10.packetlib.BuiltinFlags; +import com.github.steveice10.packetlib.codec.PacketCodecHelper; import com.github.steveice10.packetlib.packet.PacketProtocol; -import com.github.steveice10.packetlib.tcp.*; +import com.github.steveice10.packetlib.tcp.TcpPacketCodec; +import com.github.steveice10.packetlib.tcp.TcpPacketSizer; +import com.github.steveice10.packetlib.tcp.TcpSession; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBufAllocator; import io.netty.channel.*; @@ -47,15 +50,17 @@ public final class LocalSession extends TcpSession { private final SocketAddress targetAddress; private final String clientIp; + private final PacketCodecHelper codecHelper; - public LocalSession(String host, int port, SocketAddress targetAddress, String clientIp, PacketProtocol protocol) { + public LocalSession(String host, int port, SocketAddress targetAddress, String clientIp, PacketProtocol protocol, PacketCodecHelper codecHelper) { super(host, port, protocol); this.targetAddress = targetAddress; this.clientIp = clientIp; + this.codecHelper = codecHelper; } @Override - public void connect() { + public void connect(boolean wait) { if (this.disconnected) { throw new IllegalStateException("Connection has already been disconnected."); } @@ -102,6 +107,11 @@ public final class LocalSession extends TcpSession { } } + @Override + public PacketCodecHelper getCodecHelper() { + return this.codecHelper; + } + // TODO duplicate code private void addHAProxySupport(ChannelPipeline pipeline) { InetSocketAddress clientAddress = getFlag(BuiltinFlags.CLIENT_PROXIED_ADDRESS); diff --git a/core/src/main/java/org/geysermc/geyser/pack/ResourcePack.java b/core/src/main/java/org/geysermc/geyser/pack/ResourcePack.java index d9f1e36f5..08d6b5738 100644 --- a/core/src/main/java/org/geysermc/geyser/pack/ResourcePack.java +++ b/core/src/main/java/org/geysermc/geyser/pack/ResourcePack.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.pack; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.util.FileUtils; import java.io.File; import java.util.HashMap; diff --git a/core/src/main/java/org/geysermc/geyser/registry/PacketTranslatorRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/PacketTranslatorRegistry.java index 3f7d88031..bf412bfaf 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/PacketTranslatorRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/PacketTranslatorRegistry.java @@ -31,10 +31,10 @@ import com.nukkitx.protocol.bedrock.BedrockPacket; import io.netty.channel.EventLoop; import org.geysermc.common.PlatformType; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.loader.RegistryLoaders; -import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.translator.protocol.PacketTranslator; import java.util.Collections; import java.util.IdentityHashMap; diff --git a/core/src/main/java/org/geysermc/geyser/registry/Registries.java b/core/src/main/java/org/geysermc/geyser/registry/Registries.java index e98066305..9c370bc1c 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/Registries.java +++ b/core/src/main/java/org/geysermc/geyser/registry/Registries.java @@ -27,7 +27,7 @@ package org.geysermc.geyser.registry; import com.github.steveice10.mc.protocol.data.game.entity.type.EntityType; import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; -import com.github.steveice10.mc.protocol.data.game.level.event.SoundEvent; +import com.github.steveice10.mc.protocol.data.game.level.event.LevelEvent; import com.github.steveice10.mc.protocol.data.game.level.particle.ParticleType; import com.github.steveice10.mc.protocol.data.game.recipe.RecipeType; import com.github.steveice10.packetlib.packet.Packet; @@ -162,9 +162,9 @@ public final class Registries { public static final SimpleMappedRegistry SOUNDS = SimpleMappedRegistry.create("mappings/sounds.json", SoundRegistryLoader::new); /** - * A mapped registry holding {@link SoundEvent}s to their corresponding {@link LevelEventTranslator}. + * A mapped registry holding {@link LevelEvent}s to their corresponding {@link LevelEventTranslator}. */ - public static final SimpleMappedRegistry SOUND_EVENTS = SimpleMappedRegistry.create("mappings/effects.json", SoundEventsRegistryLoader::new); + public static final SimpleMappedRegistry SOUND_LEVEL_EVENTS = SimpleMappedRegistry.create("mappings/effects.json", SoundEventsRegistryLoader::new); /** * A mapped registry holding {@link SoundTranslator}s to their corresponding {@link SoundInteractionTranslator}. diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java index b74573a4e..69ad16743 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java @@ -34,12 +34,12 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.AllArgsConstructor; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.level.physics.BoundingBox; -import org.geysermc.geyser.translator.collision.CollisionRemapper; -import org.geysermc.geyser.translator.collision.BlockCollision; -import org.geysermc.geyser.translator.collision.OtherCollision; -import org.geysermc.geyser.translator.collision.SolidCollision; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.type.BlockMapping; +import org.geysermc.geyser.translator.collision.BlockCollision; +import org.geysermc.geyser.translator.collision.CollisionRemapper; +import org.geysermc.geyser.translator.collision.OtherCollision; +import org.geysermc.geyser.translator.collision.SolidCollision; import org.geysermc.geyser.util.FileUtils; import java.io.InputStream; diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java index 5bb78e8db..8d40edac3 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java @@ -26,10 +26,10 @@ package org.geysermc.geyser.registry.loader; import com.nukkitx.protocol.bedrock.data.inventory.PotionMixData; +import org.geysermc.geyser.inventory.item.Potion; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; -import org.geysermc.geyser.inventory.item.Potion; import java.util.ArrayList; import java.util.HashSet; diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/SoundEventsRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/SoundEventsRegistryLoader.java index fa7898f97..64d974bc3 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/SoundEventsRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/SoundEventsRegistryLoader.java @@ -26,7 +26,7 @@ package org.geysermc.geyser.registry.loader; import com.fasterxml.jackson.databind.JsonNode; -import com.github.steveice10.mc.protocol.data.game.level.event.SoundEvent; +import com.github.steveice10.mc.protocol.data.game.level.event.LevelEvent; import com.nukkitx.protocol.bedrock.data.LevelEventType; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.geysermc.geyser.GeyserImpl; @@ -41,37 +41,37 @@ import java.util.Map; /** * Loads sound effects from the given resource path. */ -public class SoundEventsRegistryLoader extends EffectRegistryLoader> { +public class SoundEventsRegistryLoader extends EffectRegistryLoader> { @Override - public Map load(String input) { + public Map load(String input) { this.loadFile(input); Iterator> effectsIterator = this.get(input).fields(); - Map soundEffects = new Object2ObjectOpenHashMap<>(); + Map soundEffects = new Object2ObjectOpenHashMap<>(); while (effectsIterator.hasNext()) { Map.Entry entry = effectsIterator.next(); JsonNode node = entry.getValue(); try { String type = node.get("type").asText(); - SoundEvent javaEffect = null; + LevelEvent javaEffect = null; LevelEventTranslator transformer = null; switch (type) { case "soundLevel" -> { - javaEffect = SoundEvent.valueOf(entry.getKey()); + javaEffect = LevelEvent.valueOf(entry.getKey()); LevelEventType levelEventType = LevelEventType.valueOf(node.get("name").asText()); int data = node.has("data") ? node.get("data").intValue() : 0; transformer = new SoundLevelEventTranslator(levelEventType, data); } case "soundEvent" -> { - javaEffect = SoundEvent.valueOf(entry.getKey()); + javaEffect = LevelEvent.valueOf(entry.getKey()); com.nukkitx.protocol.bedrock.data.SoundEvent soundEvent = com.nukkitx.protocol.bedrock.data.SoundEvent.valueOf(node.get("name").asText()); String identifier = node.has("identifier") ? node.get("identifier").asText() : ""; int extraData = node.has("extraData") ? node.get("extraData").intValue() : -1; transformer = new SoundEventEventTranslator(soundEvent, identifier, extraData); } case "playSound" -> { - javaEffect = SoundEvent.valueOf(entry.getKey()); + javaEffect = LevelEvent.valueOf(entry.getKey()); String name = node.get("name").asText(); float volume = node.has("volume") ? node.get("volume").floatValue() : 1.0f; boolean pitchSub = node.has("pitch_sub") && node.get("pitch_sub").booleanValue(); @@ -85,7 +85,7 @@ public class SoundEventsRegistryLoader extends EffectRegistryLoader next = soundsIterator.next(); JsonNode brMap = next.getValue(); - soundMappings.put(next.getKey(), new SoundMapping( - next.getKey(), + String javaSound = next.getKey(); + soundMappings.put(javaSound, new SoundMapping( + javaSound, brMap.has("bedrock_mapping") && brMap.get("bedrock_mapping").isTextual() ? brMap.get("bedrock_mapping").asText() : null, brMap.has("playsound_mapping") && brMap.get("playsound_mapping").isTextual() ? brMap.get("playsound_mapping").asText() : null, brMap.has("extra_data") && brMap.get("extra_data").isInt() ? brMap.get("extra_data").asInt() : -1, diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/SoundTranslatorRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/SoundTranslatorRegistryLoader.java index 359cd112e..558864b35 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/SoundTranslatorRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/SoundTranslatorRegistryLoader.java @@ -25,8 +25,8 @@ package org.geysermc.geyser.registry.loader; -import org.geysermc.geyser.translator.sound.SoundTranslator; import org.geysermc.geyser.translator.sound.SoundInteractionTranslator; +import org.geysermc.geyser.translator.sound.SoundTranslator; import java.util.function.Function; diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 412d7d779..25528a919 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -28,9 +28,7 @@ package org.geysermc.geyser.registry.populator; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; import com.nukkitx.nbt.*; -import com.nukkitx.protocol.bedrock.v475.Bedrock_v475; -import com.nukkitx.protocol.bedrock.v486.Bedrock_v486; -import com.nukkitx.protocol.bedrock.v503.Bedrock_v503; +import com.nukkitx.protocol.bedrock.v527.Bedrock_v527; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; import it.unimi.dsi.fastutil.objects.Object2IntMap; @@ -61,51 +59,9 @@ public class BlockRegistryPopulator { private static final ImmutableMap, BiFunction> BLOCK_MAPPERS; private static final BiFunction EMPTY_MAPPER = (bedrockIdentifier, statesBuilder) -> null; - private static final BiFunction V486_MAPPER = (bedrockIdentifier, statesBuilder) -> { - statesBuilder.remove("no_drop_bit"); // Used in skulls - if (bedrockIdentifier.equals("minecraft:glow_lichen")) { - // Moved around north, south, west - int bits = (int) statesBuilder.get("multi_face_direction_bits"); - boolean north = (bits & (1 << 2)) != 0; - boolean south = (bits & (1 << 3)) != 0; - boolean west = (bits & (1 << 4)) != 0; - if (north) { - bits |= 1 << 4; - } else { - bits &= ~(1 << 4); - } - if (south) { - bits |= 1 << 2; - } else { - bits &= ~(1 << 2); - } - if (west) { - bits |= 1 << 3; - } else { - bits &= ~(1 << 3); - } - statesBuilder.put("multi_face_direction_bits", bits); - } - return null; - }; - static { ImmutableMap.Builder, BiFunction> stateMapperBuilder = ImmutableMap., BiFunction>builder() - .put(ObjectIntPair.of("1_18_0", Bedrock_v475.V475_CODEC.getProtocolVersion()), EMPTY_MAPPER) - .put(ObjectIntPair.of("1_18_10", Bedrock_v486.V486_CODEC.getProtocolVersion()), V486_MAPPER) - .put(ObjectIntPair.of("1_18_30", Bedrock_v503.V503_CODEC.getProtocolVersion()), (bedrockIdentifier, statesBuilder) -> { - // Apply these fixes too - V486_MAPPER.apply(bedrockIdentifier, statesBuilder); - return switch (bedrockIdentifier) { - case "minecraft:pistonArmCollision" -> "minecraft:piston_arm_collision"; - case "minecraft:stickyPistonArmCollision" -> "minecraft:sticky_piston_arm_collision"; - case "minecraft:movingBlock" -> "minecraft:moving_block"; - case "minecraft:tripWire" -> "minecraft:trip_wire"; - case "minecraft:seaLantern" -> "minecraft:sea_lantern"; - case "minecraft:concretePowder" -> "minecraft:concrete_powder"; - default -> null; - }; - }); + .put(ObjectIntPair.of("1_19_0", Bedrock_v527.V527_CODEC.getProtocolVersion()), EMPTY_MAPPER); BLOCK_MAPPERS = stateMapperBuilder.build(); } @@ -294,7 +250,7 @@ public class BlockRegistryPopulator { builder.pickItem(pickItemNode.textValue().intern()); } - if (javaId.equals("minecraft:obsidian") || javaId.equals("minecraft:crying_obsidian") || javaId.startsWith("minecraft:respawn_anchor")) { + if (javaId.equals("minecraft:obsidian") || javaId.equals("minecraft:crying_obsidian") || javaId.startsWith("minecraft:respawn_anchor") || javaId.startsWith("minecraft:reinforced_deepslate")) { builder.pistonBehavior(PistonBehavior.BLOCK); } else { JsonNode pistonBehaviorNode = entry.getValue().get("piston_behavior"); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index 37b6c49f4..f3d936b2e 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -35,9 +35,7 @@ import com.nukkitx.protocol.bedrock.data.SoundEvent; import com.nukkitx.protocol.bedrock.data.inventory.ComponentItemData; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.packet.StartGamePacket; -import com.nukkitx.protocol.bedrock.v475.Bedrock_v475; -import com.nukkitx.protocol.bedrock.v486.Bedrock_v486; -import com.nukkitx.protocol.bedrock.v503.Bedrock_v503; +import com.nukkitx.protocol.bedrock.v527.Bedrock_v527; import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; @@ -66,9 +64,7 @@ public class ItemRegistryPopulator { public static void populate() { Map paletteVersions = new Object2ObjectOpenHashMap<>(); - paletteVersions.put("1_18_0", new PaletteVersion(Bedrock_v475.V475_CODEC.getProtocolVersion(), Collections.emptyMap())); - paletteVersions.put("1_18_10", new PaletteVersion(Bedrock_v486.V486_CODEC.getProtocolVersion(), Collections.emptyMap())); - paletteVersions.put("1_18_30", new PaletteVersion(Bedrock_v503.V503_CODEC.getProtocolVersion(), Collections.emptyMap())); + paletteVersions.put("1_19_0", new PaletteVersion(Bedrock_v527.V527_CODEC.getProtocolVersion(), Collections.emptyMap())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); @@ -230,18 +226,6 @@ public class ItemRegistryPopulator { mappingItem = entry.getValue(); } - String bedrockIdentifier; - if (javaIdentifier.equals("minecraft:globe_banner_pattern") && palette.getValue().protocolVersion() < Bedrock_v486.V486_CODEC.getProtocolVersion()) { - bedrockIdentifier = "minecraft:banner_pattern"; - } else { - bedrockIdentifier = mappingItem.getBedrockIdentifier(); - if (palette.getValue().protocolVersion() >= Bedrock_v503.V503_CODEC.getProtocolVersion()) { - if (bedrockIdentifier.equals("minecraft:sealantern")) { - bedrockIdentifier = "minecraft:sea_lantern"; - } - } - } - if (usingFurnaceMinecart && javaIdentifier.equals("minecraft:furnace_minecart")) { javaFurnaceMinecartId = itemIndex; itemIndex++; @@ -250,6 +234,7 @@ public class ItemRegistryPopulator { continue; } + String bedrockIdentifier = mappingItem.getBedrockIdentifier(); int bedrockId = bedrockIdentifierToId.getInt(bedrockIdentifier); if (bedrockId == Short.MIN_VALUE) { throw new RuntimeException("Missing Bedrock ID in mappings: " + bedrockIdentifier); diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java index 3fadcf5e5..cd91f64d1 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java @@ -27,8 +27,8 @@ package org.geysermc.geyser.registry.type; import lombok.Builder; import lombok.Value; -import org.geysermc.geyser.util.BlockUtils; import org.geysermc.geyser.level.physics.PistonBehavior; +import org.geysermc.geyser.util.BlockUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/SoundMapping.java b/core/src/main/java/org/geysermc/geyser/registry/type/SoundMapping.java index 4120b6eb5..27b5e631d 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/SoundMapping.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/SoundMapping.java @@ -38,10 +38,10 @@ public class SoundMapping { public SoundMapping(String java, String bedrock, String playsound, int extraData, String identifier, boolean levelEvent) { this.java = java; - this.bedrock = bedrock == null || bedrock.equalsIgnoreCase("") ? null : bedrock; - this.playsound = playsound == null || playsound.equalsIgnoreCase("") ? null : playsound; + this.bedrock = bedrock == null || bedrock.isEmpty() ? null : bedrock; + this.playsound = playsound == null || playsound.isEmpty() ? null : playsound; this.extraData = extraData; - this.identifier = identifier == null || identifier.equalsIgnoreCase("") ? ":" : identifier; + this.identifier = identifier == null || identifier.isEmpty() ? ":" : identifier; this.levelEvent = levelEvent; } } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index bf0360e1d..49261500b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -34,6 +34,7 @@ import com.github.steveice10.mc.auth.service.MojangAuthenticationService; import com.github.steveice10.mc.auth.service.MsaAuthenticationService; import com.github.steveice10.mc.protocol.MinecraftConstants; import com.github.steveice10.mc.protocol.MinecraftProtocol; +import com.github.steveice10.mc.protocol.codec.MinecraftCodecHelper; import com.github.steveice10.mc.protocol.data.ProtocolState; import com.github.steveice10.mc.protocol.data.UnexpectedEncryptionException; import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; @@ -47,6 +48,8 @@ import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; import com.github.steveice10.mc.protocol.data.game.statistic.CustomStatistic; import com.github.steveice10.mc.protocol.data.game.statistic.Statistic; import com.github.steveice10.mc.protocol.packet.handshake.serverbound.ClientIntentionPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatCommandPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientInformationPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerAbilitiesPacket; @@ -62,8 +65,6 @@ import com.github.steveice10.packetlib.tcp.TcpSession; import com.nukkitx.math.GenericMath; import com.nukkitx.math.vector.*; import com.nukkitx.nbt.NbtMap; -import com.nukkitx.nbt.NbtMapBuilder; -import com.nukkitx.nbt.NbtType; import com.nukkitx.protocol.bedrock.BedrockPacket; import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.data.*; @@ -72,7 +73,11 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.*; import io.netty.channel.Channel; import io.netty.channel.EventLoop; -import it.unimi.dsi.fastutil.ints.*; +import it.unimi.dsi.fastutil.bytes.ByteArrays; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -82,15 +87,17 @@ import lombok.Getter; import lombok.NonNull; import lombok.Setter; import lombok.experimental.Accessors; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.common.value.qual.IntRange; import org.geysermc.common.PlatformType; -import org.geysermc.cumulus.Form; -import org.geysermc.cumulus.util.FormBuilder; +import org.geysermc.cumulus.form.Form; +import org.geysermc.cumulus.form.util.FormBuilder; import org.geysermc.floodgate.crypto.FloodgateCipher; import org.geysermc.floodgate.util.BedrockData; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.connection.GeyserConnection; +import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.api.network.RemoteServer; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.configuration.EmoteOffhandWorkaroundOption; @@ -99,11 +106,11 @@ import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.ItemFrameEntity; import org.geysermc.geyser.entity.type.Tickable; import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; -import org.geysermc.geyser.entity.type.player.SkullPlayerEntity; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.PlayerInventory; import org.geysermc.geyser.inventory.recipe.GeyserRecipe; import org.geysermc.geyser.inventory.recipe.GeyserStonecutterData; +import org.geysermc.geyser.level.JavaDimension; import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.level.physics.CollisionManager; import org.geysermc.geyser.network.netty.LocalSession; @@ -112,27 +119,30 @@ import org.geysermc.geyser.registry.type.BlockMappings; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMappings; import org.geysermc.geyser.session.auth.AuthData; -import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.session.auth.BedrockClientData; import org.geysermc.geyser.session.cache.*; import org.geysermc.geyser.skin.FloodgateSkinUploader; +import org.geysermc.geyser.text.ChatTypeEntry; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.text.MessageTranslator; -import org.geysermc.geyser.util.*; +import org.geysermc.geyser.util.ChunkUtils; +import org.geysermc.geyser.util.DimensionUtils; +import org.geysermc.geyser.util.LoginEncryptionUtils; +import org.geysermc.geyser.util.MathUtils; import javax.annotation.Nonnull; import java.net.ConnectException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.charset.StandardCharsets; +import java.time.Instant; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; @Getter public class GeyserSession implements GeyserConnection, GeyserCommandSource { @@ -174,6 +184,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { private final LodestoneCache lodestoneCache; private final PistonCache pistonCache; private final PreferencesCache preferencesCache; + private final SkullCache skullCache; private final TagCache tagCache; private final WorldCache worldCache; @@ -221,7 +232,6 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Setter private ItemMappings itemMappings; - private final Map skullCache = new Object2ObjectOpenHashMap<>(); private final Long2ObjectMap storedMaps = new Long2ObjectOpenHashMap<>(); /** @@ -317,12 +327,15 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { */ @Setter private String dimension = DimensionUtils.OVERWORLD; - /** - * Whether piglins and hoglins are safe from conversion in this dimension. - * This controls if they have the shaking effect applied in the dimension. - */ + @MonotonicNonNull @Setter - private boolean dimensionPiglinSafe; + private JavaDimension dimensionType = null; + /** + * All dimensions that the client could possibly connect to. + */ + private final Map dimensions = new Object2ObjectOpenHashMap<>(3); + + private final Int2ObjectMap chatTypes = new Int2ObjectOpenHashMap<>(8); @Setter private int breakingBlock; @@ -479,15 +492,6 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Setter private boolean thunder = false; - /** - * Stores the last text inputted into a sign. - *

- * Bedrock sends packets every time you update the sign, Java only wants the final packet. - * Until we determine that the user has finished editing, we save the sign's current status. - */ - @Setter - private String lastSignMessage; - /** * Stores a map of all statistics sent from the server. * The server only sends new statistics back to us, so in order to show all statistics we need to cache existing ones. @@ -531,6 +535,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { this.lodestoneCache = new LodestoneCache(); this.pistonCache = new PistonCache(this); this.preferencesCache = new PreferencesCache(this); + this.skullCache = new SkullCache(this); this.tagCache = new TagCache(); this.worldCache = new WorldCache(this); @@ -541,6 +546,8 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { this.playerEntity = new SessionPlayerEntity(this); collisionManager.updatePlayerBoundingBox(this.playerEntity.getPosition()); + ChatTypeEntry.applyDefaults(chatTypes); + this.playerInventory = new PlayerInventory(); this.openInventory = null; this.craftingRecipes = new Int2ObjectOpenHashMap<>(); @@ -836,7 +843,8 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { if (geyser.getBootstrap().getSocketAddress() != null) { // We're going to connect through the JVM and not through TCP downstream = new LocalSession(this.remoteServer.address(), this.remoteServer.port(), - geyser.getBootstrap().getSocketAddress(), upstream.getAddress().getAddress().getHostAddress(), this.protocol); + geyser.getBootstrap().getSocketAddress(), upstream.getAddress().getAddress().getHostAddress(), + this.protocol, this.protocol.createHelper()); } else { downstream = new TcpClientSession(this.remoteServer.address(), this.remoteServer.port(), this.protocol); disableSrvResolving(); @@ -1008,7 +1016,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { setDaylightCycle(true); } - downstream.connect(); + downstream.connect(false); } public void disconnect(String reason) { @@ -1090,15 +1098,17 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { worldBorder.resize(); } - if (!worldBorder.isWithinWarningBoundaries()) { + boolean shouldShowFog = !worldBorder.isWithinWarningBoundaries(); + if (shouldShowFog || worldBorder.isCloseToBorderBoundaries()) { // Show particles representing where the world border is worldBorder.drawWall(); // Set the mood - if (!isInWorldBorderWarningArea) { + if (shouldShowFog && !isInWorldBorderWarningArea) { isInWorldBorderWarningArea = true; sendFog("minecraft:fog_crimson_forest"); } - } else if (isInWorldBorderWarningArea) { + } + if (!shouldShowFog && isInWorldBorderWarningArea) { // Clear fog as we are outside the world border now removeFog("minecraft:fog_crimson_forest"); isInWorldBorderWarningArea = false; @@ -1255,9 +1265,9 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { ServerboundUseItemPacket useItemPacket; if (playerInventory.getItemInHand().getJavaId() == shield.getJavaId()) { - useItemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND); + useItemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, getNextSequence()); } else if (playerInventory.getOffhand().getJavaId() == shield.getJavaId()) { - useItemPacket = new ServerboundUseItemPacket(Hand.OFF_HAND); + useItemPacket = new ServerboundUseItemPacket(Hand.OFF_HAND, getNextSequence()); } else { // No blocking return false; @@ -1286,7 +1296,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { private boolean disableBlocking() { if (playerEntity.getFlag(EntityFlag.BLOCKING)) { ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.RELEASE_USE_ITEM, - BlockUtils.POSITION_ZERO, Direction.DOWN); + Vector3i.ZERO, Direction.DOWN, getNextSequence()); sendDownstreamPacket(releaseItemPacket); playerEntity.setFlag(EntityFlag.BLOCKING, false); return true; @@ -1352,7 +1362,21 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Override public String locale() { return clientData.getLanguageCode(); - } + } + + /** + * Sends a chat message to the Java server. + */ + public void sendChat(String message) { + sendDownstreamPacket(new ServerboundChatPacket(message, Instant.now().toEpochMilli(), 0L, ByteArrays.EMPTY_ARRAY, false)); + } + + /** + * Sends a command to the Java server. + */ + public void sendCommand(String command) { + sendDownstreamPacket(new ServerboundChatCommandPacket(command, Instant.now().toEpochMilli(), 0L, Collections.emptyMap(), false)); + } public void setServerRenderDistance(int renderDistance) { renderDistance = GenericMath.ceil(++renderDistance * MathUtils.SQRT_OF_TWO); //square to circle @@ -1371,10 +1395,26 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { formCache.showForm(form); } - public void sendForm(FormBuilder formBuilder) { + public void sendForm(FormBuilder formBuilder) { formCache.showForm(formBuilder.build()); } + /** + * @deprecated since Cumulus version 1.1, and will be removed when Cumulus 2.0 releases. Please use the new forms instead. + */ + @Deprecated + public void sendForm(org.geysermc.cumulus.Form form) { + sendForm(form.newForm()); + } + + /** + * @deprecated since Cumulus version 1.1, and will be removed when Cumulus 2.0 releases. Please use the new forms instead. + */ + @Deprecated + public void sendForm(org.geysermc.cumulus.util.FormBuilder formBuilder) { + sendForm(formBuilder.build()); + } + private void startGame() { StartGamePacket startGamePacket = new StartGamePacket(); startGamePacket.setUniqueEntityId(playerEntity.getGeyserId()); @@ -1430,6 +1470,9 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { startGamePacket.setInventoriesServerAuthoritative(true); startGamePacket.setServerEngine(""); // Do we want to fill this in? + startGamePacket.setPlayerPropertyData(NbtMap.EMPTY); + startGamePacket.setWorldTemplateId(UUID.randomUUID()); + SyncedPlayerMovementSettings settings = new SyncedPlayerMovementSettings(); settings.setMovementMode(AuthoritativeMovementMode.CLIENT); settings.setRewindHistorySize(0); @@ -1631,6 +1674,10 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { sendDownstreamPacket(clientSettingsPacket); } + public int getNextSequence() { + return 0; + } + /** * Used for updating statistic values since we only get changes from the server * @@ -1707,4 +1754,8 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { packet.setExtraData(-1); sendUpstreamPacket(packet); } + + public MinecraftCodecHelper getCodecHelper() { + return (MinecraftCodecHelper) this.downstream.getCodecHelper(); + } } diff --git a/core/src/main/java/org/geysermc/geyser/session/UpstreamSession.java b/core/src/main/java/org/geysermc/geyser/session/UpstreamSession.java index 060dcc7fb..3250faf64 100644 --- a/core/src/main/java/org/geysermc/geyser/session/UpstreamSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/UpstreamSession.java @@ -33,12 +33,15 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; import java.net.InetSocketAddress; +import java.util.ArrayDeque; +import java.util.Queue; @RequiredArgsConstructor public class UpstreamSession { @Getter private final BedrockServerSession session; @Getter @Setter private boolean initialized = false; + private Queue postStartGamePackets = new ArrayDeque<>(); public void sendPacket(@NonNull BedrockPacket packet) { if (!isClosed()) { @@ -56,6 +59,25 @@ public class UpstreamSession { session.disconnect(reason); } + /** + * Queue a packet that must be delayed until after login. + */ + public void queuePostStartGamePacket(BedrockPacket packet) { + postStartGamePackets.add(packet); + } + + public void sendPostStartGamePackets() { + if (isClosed()) { + return; + } + + BedrockPacket packet; + while ((packet = postStartGamePackets.poll()) != null) { + session.sendPacket(packet); + } + postStartGamePackets = null; + } + public boolean isClosed() { return session.isClosed(); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java index f2b45ab48..00b186292 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java @@ -29,15 +29,15 @@ import com.github.steveice10.mc.protocol.data.game.advancement.Advancement; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSeenAdvancementsPacket; import lombok.Getter; import lombok.Setter; +import org.geysermc.cumulus.form.SimpleForm; +import org.geysermc.geyser.level.GeyserAdvancement; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.ChatColor; -import org.geysermc.geyser.translator.text.MessageTranslator; -import org.geysermc.geyser.level.GeyserAdvancement; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.MinecraftLocale; -import org.geysermc.cumulus.SimpleForm; -import org.geysermc.cumulus.response.SimpleFormResponse; +import org.geysermc.geyser.translator.text.MessageTranslator; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -76,38 +76,20 @@ public class AdvancementsCache { .translator(MinecraftLocale::getLocaleString, session.locale()) .title("gui.advancements"); - boolean hasAdvancements = false; + List rootAdvancementIds = new ArrayList<>(); for (Map.Entry advancement : storedAdvancements.entrySet()) { if (advancement.getValue().getParentId() == null) { // No parent means this is a root advancement - hasAdvancements = true; builder.button(MessageTranslator.convertMessage(advancement.getValue().getDisplayData().getTitle(), session.locale())); + rootAdvancementIds.add(advancement.getKey()); } } - if (!hasAdvancements) { + if (rootAdvancementIds.isEmpty()) { builder.content("advancements.empty"); } - builder.responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (!response.isCorrect()) { - return; - } - - String id = ""; - - int advancementIndex = 0; - for (Map.Entry advancement : storedAdvancements.entrySet()) { - if (advancement.getValue().getParentId() == null) { // Root advancement - if (advancementIndex == response.getClickedButtonId()) { - id = advancement.getKey(); - break; - } else { - advancementIndex++; - } - } - } - + builder.validResultHandler((response) -> { + String id = rootAdvancementIds.get(response.clickedButtonId()); if (!id.equals("")) { if (id.equals(currentAdvancementCategoryId)) { // The server thinks we are already on this tab @@ -136,12 +118,16 @@ public class AdvancementsCache { .title(MessageTranslator.convertMessage(categoryAdvancement.getDisplayData().getTitle(), language)) .content(MessageTranslator.convertMessage(categoryAdvancement.getDisplayData().getDescription(), language)); + List visibleAdvancements = new ArrayList<>(); if (currentAdvancementCategoryId != null) { for (GeyserAdvancement advancement : storedAdvancements.values()) { - if (advancement != null) { + boolean earned = isEarned(advancement); + if (earned || !advancement.getDisplayData().isHidden()) { if (advancement.getParentId() != null && currentAdvancementCategoryId.equals(advancement.getRootId(this))) { - boolean color = isEarned(advancement) || !advancement.getDisplayData().isShowToast(); - builder.button((color ? ChatColor.DARK_GREEN : "") + MessageTranslator.convertMessage(advancement.getDisplayData().getTitle()) + '\n'); + String color = earned ? advancement.getDisplayColor() : ""; + builder.button(color + MessageTranslator.convertMessage(advancement.getDisplayData().getTitle()) + '\n'); + + visibleAdvancements.add(advancement); } } } @@ -149,30 +135,13 @@ public class AdvancementsCache { builder.button(GeyserLocale.getPlayerLocaleString("gui.back", language)); - builder.responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (!response.isCorrect()) { - // Indicate that we have closed the current advancement tab - session.sendDownstreamPacket(new ServerboundSeenAdvancementsPacket()); - return; - } + builder.closedResultHandler(() -> { + // Indicate that we have closed the current advancement tab + session.sendDownstreamPacket(new ServerboundSeenAdvancementsPacket()); - GeyserAdvancement advancement = null; - int advancementIndex = 0; - // Loop around to find the advancement that the client pressed - for (GeyserAdvancement advancementEntry : storedAdvancements.values()) { - if (advancementEntry.getParentId() != null && - currentAdvancementCategoryId.equals(advancementEntry.getRootId(this))) { - if (advancementIndex == response.getClickedButtonId()) { - advancement = advancementEntry; - break; - } else { - advancementIndex++; - } - } - } - - if (advancement != null) { + }).validResultHandler((response) -> { + if (response.getClickedButtonId() < visibleAdvancements.size()) { + GeyserAdvancement advancement = visibleAdvancements.get(response.clickedButtonId()); buildAndShowInfoForm(advancement); } else { buildAndShowMenuForm(); @@ -220,12 +189,7 @@ public class AdvancementsCache { .title(MessageTranslator.convertMessage(advancement.getDisplayData().getTitle())) .content(content) .button(GeyserLocale.getPlayerLocaleString("gui.back", language)) - .responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (response.isCorrect()) { - buildAndShowListForm(); - } - }) + .validResultHandler((response) -> buildAndShowListForm()) ); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java index 91d6b33d6..d2c1415a3 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java @@ -30,10 +30,10 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import lombok.Getter; import lombok.Setter; -import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.chunk.GeyserChunk; -import org.geysermc.geyser.level.BedrockDimension; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.MathUtils; public class ChunkCache { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java index 965966ca4..24acebce0 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java @@ -31,39 +31,42 @@ import com.nukkitx.protocol.bedrock.packet.NetworkStackLatencyPacket; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import lombok.RequiredArgsConstructor; +import org.geysermc.cumulus.form.Form; +import org.geysermc.cumulus.form.SimpleForm; +import org.geysermc.cumulus.form.impl.FormDefinitions; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.cumulus.Form; -import org.geysermc.cumulus.SimpleForm; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; @RequiredArgsConstructor public class FormCache { - private final AtomicInteger formId = new AtomicInteger(0); + private final FormDefinitions formDefinitions = FormDefinitions.instance(); + private final AtomicInteger formIdCounter = new AtomicInteger(0); private final Int2ObjectMap

forms = new Int2ObjectOpenHashMap<>(); private final GeyserSession session; public int addForm(Form form) { - int windowId = formId.getAndIncrement(); - forms.put(windowId, form); - return windowId; + int formId = formIdCounter.getAndIncrement(); + forms.put(formId, form); + return formId; } public void showForm(Form form) { - int windowId = addForm(form); + int formId = addForm(form); if (session.getUpstream().isInitialized()) { - sendForm(windowId, form); + sendForm(formId, form); } } - private void sendForm(int windowId, Form form) { + private void sendForm(int formId, Form form) { + String jsonData = formDefinitions.codecFor(form).jsonData(form); + ModalFormRequestPacket formRequestPacket = new ModalFormRequestPacket(); - formRequestPacket.setFormId(windowId); - formRequestPacket.setFormData(form.getJsonData()); + formRequestPacket.setFormId(formId); + formRequestPacket.setFormData(jsonData); session.sendUpstreamPacket(formRequestPacket); // Hack to fix the (url) image loading bug @@ -71,8 +74,10 @@ public class FormCache { NetworkStackLatencyPacket latencyPacket = new NetworkStackLatencyPacket(); latencyPacket.setFromServer(true); latencyPacket.setTimestamp(-System.currentTimeMillis()); - session.scheduleInEventLoop(() -> session.sendUpstreamPacket(latencyPacket), - 500, TimeUnit.MILLISECONDS); + session.scheduleInEventLoop( + () -> session.sendUpstreamPacket(latencyPacket), + 500, TimeUnit.MILLISECONDS + ); } } @@ -88,17 +93,11 @@ public class FormCache { return; } - Consumer responseConsumer = form.getResponseHandler(); - if (responseConsumer != null) { - try { - responseConsumer.accept(response.getFormData()); - } catch (Exception e) { - GeyserImpl.getInstance().getLogger().error("Error while processing form response!", e); - } + try { + formDefinitions.definitionFor(form) + .handleFormResponse(form, response.getFormData()); + } catch (Exception e) { + GeyserImpl.getInstance().getLogger().error("Error while processing form response!", e); } } - - public boolean removeWindow(int id) { - return forms.remove(id) != null; - } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/PistonCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/PistonCache.java index 03785de16..07ccd6280 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/PistonCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/PistonCache.java @@ -34,10 +34,10 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.level.physics.BoundingBox; -import org.geysermc.geyser.translator.level.block.entity.PistonBlockEntity; import org.geysermc.geyser.level.physics.Axis; +import org.geysermc.geyser.level.physics.BoundingBox; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.level.block.entity.PistonBlockEntity; import java.util.Map; diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java new file mode 100644 index 000000000..f26e1cce3 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.cache; + +import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.math.vector.Vector3i; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.geysermc.geyser.entity.type.player.SkullPlayerEntity; +import org.geysermc.geyser.session.GeyserSession; + +import java.util.*; + +public class SkullCache { + private final int maxVisibleSkulls; + private final boolean cullingEnabled; + + private final int skullRenderDistanceSquared; + + /** + * The time in milliseconds before unused skull entities are despawned + */ + private static final long CLEANUP_PERIOD = 10000; + + @Getter + private final Map skulls = new Object2ObjectOpenHashMap<>(); + + private final List inRangeSkulls = new ArrayList<>(); + + private final Deque unusedSkullEntities = new ArrayDeque<>(); + private int totalSkullEntities = 0; + + private final GeyserSession session; + + private Vector3f lastPlayerPosition; + + private long lastCleanup = System.currentTimeMillis(); + + public SkullCache(GeyserSession session) { + this.session = session; + this.maxVisibleSkulls = session.getGeyser().getConfig().getMaxVisibleCustomSkulls(); + this.cullingEnabled = this.maxVisibleSkulls != -1; + + // Normal skulls are not rendered beyond 64 blocks + int distance = Math.min(session.getGeyser().getConfig().getCustomSkullRenderDistance(), 64); + this.skullRenderDistanceSquared = distance * distance; + } + + public void putSkull(Vector3i position, String texturesProperty, int blockState) { + Skull skull = skulls.computeIfAbsent(position, Skull::new); + skull.texturesProperty = texturesProperty; + skull.blockState = blockState; + + if (skull.entity != null) { + skull.entity.updateSkull(skull); + } else { + if (!cullingEnabled) { + assignSkullEntity(skull); + return; + } + if (lastPlayerPosition == null) { + return; + } + skull.distanceSquared = position.distanceSquared(lastPlayerPosition.getX(), lastPlayerPosition.getY(), lastPlayerPosition.getZ()); + if (skull.distanceSquared < skullRenderDistanceSquared) { + // Keep list in order + int i = Collections.binarySearch(inRangeSkulls, skull, Comparator.comparingInt(Skull::getDistanceSquared)); + if (i < 0) { // skull.distanceSquared is a new distance value + i = -i - 1; + } + inRangeSkulls.add(i, skull); + + if (i < maxVisibleSkulls) { + // Reassign entity from the farthest skull to this one + if (inRangeSkulls.size() > maxVisibleSkulls) { + freeSkullEntity(inRangeSkulls.get(maxVisibleSkulls)); + } + assignSkullEntity(skull); + } + } + } + } + + public void removeSkull(Vector3i position) { + Skull skull = skulls.remove(position); + if (skull != null) { + boolean hadEntity = skull.entity != null; + freeSkullEntity(skull); + + if (cullingEnabled) { + inRangeSkulls.remove(skull); + if (hadEntity && inRangeSkulls.size() >= maxVisibleSkulls) { + // Reassign entity to the closest skull without an entity + assignSkullEntity(inRangeSkulls.get(maxVisibleSkulls - 1)); + } + } + } + } + + public void updateVisibleSkulls() { + if (cullingEnabled) { + // No need to recheck skull visibility for small movements + if (lastPlayerPosition != null && session.getPlayerEntity().getPosition().distanceSquared(lastPlayerPosition) < 4) { + return; + } + lastPlayerPosition = session.getPlayerEntity().getPosition(); + + inRangeSkulls.clear(); + for (Skull skull : skulls.values()) { + skull.distanceSquared = skull.position.distanceSquared(lastPlayerPosition.getX(), lastPlayerPosition.getY(), lastPlayerPosition.getZ()); + if (skull.distanceSquared > skullRenderDistanceSquared) { + freeSkullEntity(skull); + } else { + inRangeSkulls.add(skull); + } + } + inRangeSkulls.sort(Comparator.comparingInt(Skull::getDistanceSquared)); + + for (int i = inRangeSkulls.size() - 1; i >= 0; i--) { + if (i < maxVisibleSkulls) { + assignSkullEntity(inRangeSkulls.get(i)); + } else { + freeSkullEntity(inRangeSkulls.get(i)); + } + } + } + + // Occasionally clean up unused entities as we want to keep skull + // entities around for later use, to reduce "player" pop-in + if ((System.currentTimeMillis() - lastCleanup) > CLEANUP_PERIOD) { + lastCleanup = System.currentTimeMillis(); + for (SkullPlayerEntity entity : unusedSkullEntities) { + entity.despawnEntity(); + totalSkullEntities--; + } + unusedSkullEntities.clear(); + } + } + + private void assignSkullEntity(Skull skull) { + if (skull.entity != null) { + return; + } + if (unusedSkullEntities.isEmpty()) { + if (!cullingEnabled || totalSkullEntities < maxVisibleSkulls) { + // Create a new entity + long geyserId = session.getEntityCache().getNextEntityId().incrementAndGet(); + skull.entity = new SkullPlayerEntity(session, geyserId); + skull.entity.spawnEntity(); + skull.entity.updateSkull(skull); + totalSkullEntities++; + } + } else { + // Reuse an entity + skull.entity = unusedSkullEntities.removeFirst(); + skull.entity.updateSkull(skull); + } + } + + private void freeSkullEntity(Skull skull) { + if (skull.entity != null) { + skull.entity.free(); + unusedSkullEntities.addFirst(skull.entity); + skull.entity = null; + } + } + + public void clear() { + skulls.clear(); + inRangeSkulls.clear(); + unusedSkullEntities.clear(); + totalSkullEntities = 0; + lastPlayerPosition = null; + } + + @RequiredArgsConstructor + @Data + public static class Skull { + private String texturesProperty; + private int blockState; + private SkullPlayerEntity entity; + + private final Vector3i position; + private int distanceSquared; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java b/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java index 66922ff0b..09e7e9234 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java @@ -139,6 +139,18 @@ public class WorldBorder { return position.getX() > minX && position.getX() < maxX && position.getZ() > minZ && position.getZ() < maxZ; } + private static final int CLOSE_TO_BORDER = 5; + + /** + * @return if the player is close to the border boundaries. Used to always indicate a border even if there is no + * warning blocks set. + */ + public boolean isCloseToBorderBoundaries() { + Vector3f position = session.getPlayerEntity().getPosition(); + return !(position.getX() > minX + CLOSE_TO_BORDER && position.getX() < maxX - CLOSE_TO_BORDER + && position.getZ() > minZ + CLOSE_TO_BORDER && position.getZ() < maxZ - CLOSE_TO_BORDER); + } + /** * Confirms that the entity is within world border boundaries when they move. * Otherwise, if {@code adjustPosition} is true, this function will push the player back. @@ -246,16 +258,16 @@ public class WorldBorder { float particlePosY = entityPosition.getY(); float particlePosZ = entityPosition.getZ(); - if (entityPosition.getX() > warningMaxX) { + if (entityPosition.getX() > Math.min(warningMaxX, maxX - CLOSE_TO_BORDER)) { drawWall(Vector3f.from(maxX, particlePosY, particlePosZ), true); } - if (entityPosition.getX() < warningMinX) { + if (entityPosition.getX() < Math.max(warningMinX, minX + CLOSE_TO_BORDER)) { drawWall(Vector3f.from(minX, particlePosY, particlePosZ), true); } - if (entityPosition.getZ() > warningMaxZ) { + if (entityPosition.getZ() > Math.min(warningMaxZ, maxZ - CLOSE_TO_BORDER)) { drawWall(Vector3f.from(particlePosX, particlePosY, maxZ), false); } - if (entityPosition.getZ() < warningMinZ) { + if (entityPosition.getZ() < Math.max(warningMinZ, minZ + CLOSE_TO_BORDER)) { drawWall(Vector3f.from(particlePosX, particlePosY, minZ), false); } } diff --git a/core/src/main/java/org/geysermc/geyser/skin/FloodgateSkinUploader.java b/core/src/main/java/org/geysermc/geyser/skin/FloodgateSkinUploader.java index 7a800890b..4d0e98444 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/FloodgateSkinUploader.java +++ b/core/src/main/java/org/geysermc/geyser/skin/FloodgateSkinUploader.java @@ -31,12 +31,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.Getter; import org.geysermc.floodgate.pluginmessage.PluginMessageChannels; +import org.geysermc.floodgate.util.WebsocketEventType; +import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.Constants; import org.geysermc.geyser.util.PluginMessageUtils; -import org.geysermc.floodgate.util.WebsocketEventType; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; diff --git a/core/src/main/java/org/geysermc/geyser/text/ChatTypeEntry.java b/core/src/main/java/org/geysermc/geyser/text/ChatTypeEntry.java new file mode 100644 index 000000000..800eb6c0f --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/text/ChatTypeEntry.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.text; + +import com.github.steveice10.mc.protocol.data.game.MessageType; +import com.nukkitx.protocol.bedrock.packet.TextPacket; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public record ChatTypeEntry(@Nonnull TextPacket.Type bedrockChatType, @Nullable TextDecoration textDecoration) { + private static final ChatTypeEntry CHAT = new ChatTypeEntry(TextPacket.Type.CHAT, null); + private static final ChatTypeEntry SYSTEM = new ChatTypeEntry(TextPacket.Type.CHAT, null); + private static final ChatTypeEntry TIP = new ChatTypeEntry(TextPacket.Type.CHAT, null); + private static final ChatTypeEntry RAW = new ChatTypeEntry(TextPacket.Type.CHAT, null); + + /** + * Apply defaults to a map so it isn't empty in the event a chat message is sent before the login packet. + */ + public static void applyDefaults(Int2ObjectMap chatTypes) { + // So the proper way to do this, probably, would be to dump the NBT data from vanilla and load it. + // But, the only way this happens is if a chat message is sent to us before the login packet, which is rare. + // So we'll just make sure chat ends up in the right place. + chatTypes.put(MessageType.CHAT.ordinal(), CHAT); + chatTypes.put(MessageType.SYSTEM.ordinal(), SYSTEM); + chatTypes.put(MessageType.GAME_INFO.ordinal(), TIP); + chatTypes.put(MessageType.SAY_COMMAND.ordinal(), RAW); + chatTypes.put(MessageType.MSG_COMMAND.ordinal(), RAW); + chatTypes.put(MessageType.TEAM_MSG_COMMAND.ordinal(), RAW); + chatTypes.put(MessageType.EMOTE_COMMAND.ordinal(), RAW); + chatTypes.put(MessageType.TELLRAW_COMMAND.ordinal(), RAW); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java b/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java index da6ea4dc0..86e015c0f 100644 --- a/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java +++ b/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.text; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.io.*; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.MessageFormat; import java.util.HashMap; import java.util.Locale; @@ -116,12 +116,22 @@ public class GeyserLocale { return locale; } + Properties localeProp = new Properties(); + + File localLanguage; + Path localFolder = bootstrap.getConfigFolder().resolve("languages"); + if (Files.exists(localFolder)) { + localLanguage = localFolder.resolve(locale + ".properties").toFile(); + } else { + localLanguage = null; + } + boolean validLocalLanguage = localLanguage != null && localLanguage.exists(); + InputStream localeStream = bootstrap.getResourceOrNull("languages/texts/" + locale + ".properties"); // Load the locale if (localeStream != null) { try { - Properties localeProp = new Properties(); try (InputStreamReader reader = new InputStreamReader(localeStream, StandardCharsets.UTF_8)) { localeProp.load(reader); } catch (Exception e) { @@ -130,18 +140,37 @@ public class GeyserLocale { // Insert the locale into the mappings LOCALE_MAPPINGS.put(locale, localeProp); - return locale; } finally { try { localeStream.close(); } catch (IOException ignored) {} } } else { - if (GeyserImpl.getInstance() != null) { + if (GeyserImpl.getInstance() != null && !validLocalLanguage) { + // Don't warn on missing locales if a local file has been found GeyserImpl.getInstance().getLogger().warning("Missing locale: " + locale); } - return null; } + + // Load any language overrides that exist after, to override any strings that we just added + // By loading both, we ensure that if a language string doesn't exist in the custom properties folder, + // it's loaded from our jar + if (validLocalLanguage) { + try (InputStream stream = new FileInputStream(localLanguage)) { + localeProp.load(stream); + } catch (IOException e) { + String message = "Unable to load custom language override!"; + if (GeyserImpl.getInstance() != null) { + GeyserImpl.getInstance().getLogger().error(message, e); + } else { + System.err.println(message); + e.printStackTrace(); + } + } + + LOCALE_MAPPINGS.putIfAbsent(locale, localeProp); + } + return localeProp.isEmpty() ? null : locale; } /** diff --git a/core/src/main/java/org/geysermc/geyser/text/TextDecoration.java b/core/src/main/java/org/geysermc/geyser/text/TextDecoration.java new file mode 100644 index 000000000..296cacaf5 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/text/TextDecoration.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.text; + +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; + +import java.util.EnumSet; +import java.util.Locale; +import java.util.Set; + +public final class TextDecoration { + private final String translationKey; + private final Style style; + private final Set parameters; + + public TextDecoration(CompoundTag tag) { + translationKey = (String) tag.get("translation_key").getValue(); + + CompoundTag styleTag = tag.get("style"); + Style.Builder builder = Style.style(); + StringTag color = styleTag.get("color"); + if (color != null) { + builder.color(NamedTextColor.NAMES.value(color.getValue())); + } + //TODO implement the rest + Tag italic = styleTag.get("italic"); + if (italic != null && ((Number) italic.getValue()).byteValue() == (byte) 1) { + builder.decorate(net.kyori.adventure.text.format.TextDecoration.ITALIC); + } + style = builder.build(); + + this.parameters = EnumSet.noneOf(Parameter.class); + ListTag parameters = tag.get("parameters"); + for (Tag parameter : parameters) { + this.parameters.add(Parameter.valueOf(((String) parameter.getValue()).toUpperCase(Locale.ROOT))); + } + } + + public String translationKey() { + return translationKey; + } + + public Style style() { + return style; + } + + public Set parameters() { + return parameters; + } + + @Override + public String toString() { + return "TextDecoration{" + + "translationKey='" + translationKey + '\'' + + ", style=" + style + + ", parameters=" + parameters + + '}'; + } + + public enum Parameter { + CONTENT, + SENDER, + TEAM_NAME + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java index 3d2cc563e..1dc6cd4e9 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java @@ -29,10 +29,10 @@ import com.nukkitx.math.vector.Vector3d; import com.nukkitx.math.vector.Vector3i; import lombok.EqualsAndHashCode; import lombok.Getter; -import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.level.physics.Axis; import org.geysermc.geyser.level.physics.BoundingBox; import org.geysermc.geyser.level.physics.CollisionManager; -import org.geysermc.geyser.level.physics.Axis; +import org.geysermc.geyser.session.GeyserSession; @EqualsAndHashCode public class BlockCollision { diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/DoorCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/DoorCollision.java index c101fcdfb..b47b187c4 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/DoorCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/DoorCollision.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.translator.collision; import lombok.EqualsAndHashCode; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.physics.BoundingBox; +import org.geysermc.geyser.session.GeyserSession; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "_door$", usesParams = true, passDefaultBoxes = true) diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/ScaffoldingCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/ScaffoldingCollision.java index 2aa74499a..dfbd1c8b8 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/ScaffoldingCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/ScaffoldingCollision.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.translator.collision; import lombok.EqualsAndHashCode; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.physics.BoundingBox; +import org.geysermc.geyser.session.GeyserSession; /** * In order for scaffolding to work on Bedrock, entity flags need to be sent to the player diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/SnowCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/SnowCollision.java index 998e15ded..fb83e357d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/SnowCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/SnowCollision.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.translator.collision; import lombok.EqualsAndHashCode; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.physics.BoundingBox; +import org.geysermc.geyser.session.GeyserSession; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "^snow$", passDefaultBoxes = true, usesParams = true) diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/TrapdoorCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/TrapdoorCollision.java index 0660c3cf6..836c05711 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/TrapdoorCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/TrapdoorCollision.java @@ -26,9 +26,9 @@ package org.geysermc.geyser.translator.collision; import lombok.EqualsAndHashCode; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.physics.BoundingBox; import org.geysermc.geyser.level.physics.CollisionManager; +import org.geysermc.geyser.session.GeyserSession; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "_trapdoor$", usesParams = true, passDefaultBoxes = true) diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/AbstractBlockInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/AbstractBlockInventoryTranslator.java index bf806bd06..c1fabcf0f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/AbstractBlockInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/AbstractBlockInventoryTranslator.java @@ -27,10 +27,10 @@ package org.geysermc.geyser.translator.inventory; import com.nukkitx.protocol.bedrock.data.inventory.ContainerType; import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.holder.BlockInventoryHolder; import org.geysermc.geyser.inventory.holder.InventoryHolder; import org.geysermc.geyser.inventory.updater.InventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; /** * Provided as a base for any inventory that requires a block for opening it diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/AnvilInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/AnvilInventoryTranslator.java index e56586b14..956fdeae0 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/AnvilInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/AnvilInventoryTranslator.java @@ -34,11 +34,11 @@ import com.nukkitx.protocol.bedrock.data.inventory.stackrequestactions.StackRequ import com.nukkitx.protocol.bedrock.data.inventory.stackrequestactions.StackRequestActionType; import com.nukkitx.protocol.bedrock.packet.ItemStackResponsePacket; import org.geysermc.geyser.inventory.AnvilContainer; +import org.geysermc.geyser.inventory.BedrockContainerSlot; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.PlayerInventory; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.inventory.BedrockContainerSlot; import org.geysermc.geyser.inventory.updater.AnvilInventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; import java.util.Objects; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/BaseInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/BaseInventoryTranslator.java index 8016ca24f..9b6e6df56 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/BaseInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/BaseInventoryTranslator.java @@ -28,12 +28,8 @@ package org.geysermc.geyser.translator.inventory; import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.data.inventory.StackRequestSlotInfoData; -import org.geysermc.geyser.inventory.Container; -import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.inventory.PlayerInventory; +import org.geysermc.geyser.inventory.*; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.inventory.BedrockContainerSlot; -import org.geysermc.geyser.inventory.SlotType; public abstract class BaseInventoryTranslator extends InventoryTranslator { public BaseInventoryTranslator(int size) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java index f194d0d3f..54dc533c6 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java @@ -48,6 +48,8 @@ import org.geysermc.geyser.inventory.updater.UIInventoryUpdater; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InventoryUtils; +import java.util.OptionalInt; + public class BeaconInventoryTranslator extends AbstractBlockInventoryTranslator { public BeaconInventoryTranslator() { super(1, new BlockInventoryHolder("minecraft:beacon", com.nukkitx.protocol.bedrock.data.inventory.ContainerType.BEACON) { @@ -111,11 +113,15 @@ public class BeaconInventoryTranslator extends AbstractBlockInventoryTranslator public ItemStackResponsePacket.Response translateSpecialRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) { // Input a beacon payment BeaconPaymentStackRequestActionData beaconPayment = (BeaconPaymentStackRequestActionData) request.getActions()[0]; - ServerboundSetBeaconPacket packet = new ServerboundSetBeaconPacket(beaconPayment.getPrimaryEffect(), beaconPayment.getSecondaryEffect()); + ServerboundSetBeaconPacket packet = new ServerboundSetBeaconPacket(toJava(beaconPayment.getPrimaryEffect()), toJava(beaconPayment.getSecondaryEffect())); session.sendDownstreamPacket(packet); return acceptRequest(request, makeContainerEntries(session, inventory, IntSets.emptySet())); } + private OptionalInt toJava(int effectChoice) { + return effectChoice == -1 ? OptionalInt.empty() : OptionalInt.of(effectChoice); + } + @Override public int bedrockSlotToJava(StackRequestSlotInfoData slotInfoData) { if (slotInfoData.getContainer() == ContainerSlotType.BEACON_PAYMENT) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/BrewingInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/BrewingInventoryTranslator.java index 0c4fe12e7..60e0e6973 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/BrewingInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/BrewingInventoryTranslator.java @@ -29,10 +29,10 @@ import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.data.inventory.ContainerType; import com.nukkitx.protocol.bedrock.data.inventory.StackRequestSlotInfoData; import com.nukkitx.protocol.bedrock.packet.ContainerSetDataPacket; -import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.BedrockContainerSlot; +import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.updater.ContainerInventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; public class BrewingInventoryTranslator extends AbstractBlockInventoryTranslator { public BrewingInventoryTranslator() { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/CartographyInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/CartographyInventoryTranslator.java index 226abe157..c796ab5e3 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/CartographyInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/CartographyInventoryTranslator.java @@ -28,13 +28,9 @@ package org.geysermc.geyser.translator.inventory; import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.data.inventory.StackRequestSlotInfoData; -import org.geysermc.geyser.inventory.CartographyContainer; -import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.inventory.PlayerInventory; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.inventory.BedrockContainerSlot; +import org.geysermc.geyser.inventory.*; import org.geysermc.geyser.inventory.updater.UIInventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; public class CartographyInventoryTranslator extends AbstractBlockInventoryTranslator { public CartographyInventoryTranslator() { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/Generic3X3InventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/Generic3X3InventoryTranslator.java index 23bab8c0e..df7796d0c 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/Generic3X3InventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/Generic3X3InventoryTranslator.java @@ -28,12 +28,12 @@ package org.geysermc.geyser.translator.inventory; import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket; +import org.geysermc.geyser.inventory.BedrockContainerSlot; import org.geysermc.geyser.inventory.Generic3X3Container; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.PlayerInventory; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.inventory.BedrockContainerSlot; import org.geysermc.geyser.inventory.updater.ContainerInventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; /** * Droppers and dispensers diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/LecternInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/LecternInventoryTranslator.java index fc4090c73..e08065a22 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/LecternInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/LecternInventoryTranslator.java @@ -39,8 +39,8 @@ import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.LecternContainer; import org.geysermc.geyser.inventory.PlayerInventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.updater.InventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; import org.geysermc.geyser.util.InventoryUtils; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/MerchantInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/MerchantInventoryTranslator.java index 248bd35b7..d4bac172c 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/MerchantInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/MerchantInventoryTranslator.java @@ -37,17 +37,12 @@ import com.nukkitx.protocol.bedrock.data.inventory.stackrequestactions.AutoCraft import com.nukkitx.protocol.bedrock.data.inventory.stackrequestactions.CraftRecipeStackRequestActionData; import com.nukkitx.protocol.bedrock.packet.ItemStackResponsePacket; import com.nukkitx.protocol.bedrock.packet.SetEntityLinkPacket; -import com.nukkitx.protocol.bedrock.v486.Bedrock_v486; -import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.EntityDefinitions; -import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.inventory.MerchantContainer; -import org.geysermc.geyser.inventory.PlayerInventory; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.inventory.BedrockContainerSlot; -import org.geysermc.geyser.inventory.SlotType; +import org.geysermc.geyser.entity.type.Entity; +import org.geysermc.geyser.inventory.*; import org.geysermc.geyser.inventory.updater.InventoryUpdater; import org.geysermc.geyser.inventory.updater.UIInventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InventoryUtils; import java.util.concurrent.TimeUnit; @@ -140,10 +135,6 @@ public class MerchantInventoryTranslator extends BaseInventoryTranslator { @Override public ItemStackResponsePacket.Response translateCraftingRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) { - if (session.getUpstream().getProtocolVersion() < Bedrock_v486.V486_CODEC.getProtocolVersion()) { - return super.translateCraftingRequest(session, inventory, request); - } - // Behavior as of 1.18.10. // We set the net ID to the trade index + 1. This doesn't appear to cause issues and means we don't have to // store a map of net ID to trade index on our end. @@ -153,12 +144,6 @@ public class MerchantInventoryTranslator extends BaseInventoryTranslator { @Override public ItemStackResponsePacket.Response translateAutoCraftingRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) { - if (session.getUpstream().getProtocolVersion() < Bedrock_v486.V486_CODEC.getProtocolVersion()) { - // We're not crafting here - // Called at least by consoles when pressing a trade option button - return translateRequest(session, inventory, request); - } - // 1.18.10 update - seems impossible to call without consoles/controller input // We set the net ID to the trade index + 1. This doesn't appear to cause issues and means we don't have to // store a map of net ID to trade index on our end. diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/ShulkerInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/ShulkerInventoryTranslator.java index f77ff2229..a055d3b5d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/ShulkerInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/ShulkerInventoryTranslator.java @@ -32,13 +32,13 @@ import com.nukkitx.nbt.NbtMapBuilder; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.data.inventory.ContainerType; import com.nukkitx.protocol.bedrock.packet.BlockEntityDataPacket; -import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.BedrockContainerSlot; +import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.holder.BlockInventoryHolder; import org.geysermc.geyser.inventory.updater.ContainerInventoryUpdater; -import org.geysermc.geyser.translator.level.block.entity.BlockEntityTranslator; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.level.block.entity.BlockEntityTranslator; public class ShulkerInventoryTranslator extends AbstractBlockInventoryTranslator { public ShulkerInventoryTranslator() { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/ChestInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/ChestInventoryTranslator.java index 65d789c0b..548e9e6e3 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/ChestInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/ChestInventoryTranslator.java @@ -26,12 +26,12 @@ package org.geysermc.geyser.translator.inventory.chest; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; -import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.BedrockContainerSlot; -import org.geysermc.geyser.translator.inventory.BaseInventoryTranslator; +import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.updater.ChestInventoryUpdater; import org.geysermc.geyser.inventory.updater.InventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.BaseInventoryTranslator; public abstract class ChestInventoryTranslator extends BaseInventoryTranslator { private final InventoryUpdater updater; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java index fc3279de1..94873eaf8 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java @@ -35,11 +35,11 @@ import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket; import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; import org.geysermc.geyser.inventory.Container; import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.block.DoubleChestValue; -import org.geysermc.geyser.translator.level.block.entity.DoubleChestBlockEntityTranslator; import org.geysermc.geyser.registry.BlockRegistries; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.level.block.entity.DoubleChestBlockEntityTranslator; public class DoubleChestInventoryTranslator extends ChestInventoryTranslator { private final int defaultJavaBlockState; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/SingleChestInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/SingleChestInventoryTranslator.java index 4d158c4fe..41e7bfb9f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/SingleChestInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/SingleChestInventoryTranslator.java @@ -27,9 +27,9 @@ package org.geysermc.geyser.translator.inventory.chest; import com.nukkitx.protocol.bedrock.data.inventory.ContainerType; import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.holder.BlockInventoryHolder; import org.geysermc.geyser.inventory.holder.InventoryHolder; +import org.geysermc.geyser.session.GeyserSession; public class SingleChestInventoryTranslator extends ChestInventoryTranslator { private final InventoryHolder holder; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/furnace/AbstractFurnaceInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/furnace/AbstractFurnaceInventoryTranslator.java index 472f92b4d..19e02ee4e 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/furnace/AbstractFurnaceInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/furnace/AbstractFurnaceInventoryTranslator.java @@ -28,12 +28,12 @@ package org.geysermc.geyser.translator.inventory.furnace; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.data.inventory.ContainerType; import com.nukkitx.protocol.bedrock.packet.ContainerSetDataPacket; -import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.inventory.BedrockContainerSlot; +import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.SlotType; -import org.geysermc.geyser.translator.inventory.AbstractBlockInventoryTranslator; import org.geysermc.geyser.inventory.updater.ContainerInventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.AbstractBlockInventoryTranslator; public abstract class AbstractFurnaceInventoryTranslator extends AbstractBlockInventoryTranslator { AbstractFurnaceInventoryTranslator(String javaBlockIdentifier, ContainerType containerType) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/AbstractHorseInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/AbstractHorseInventoryTranslator.java index 064793d29..0ad6ba137 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/AbstractHorseInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/AbstractHorseInventoryTranslator.java @@ -26,10 +26,10 @@ package org.geysermc.geyser.translator.inventory.horse; import org.geysermc.geyser.inventory.Inventory; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.inventory.BaseInventoryTranslator; import org.geysermc.geyser.inventory.updater.HorseInventoryUpdater; import org.geysermc.geyser.inventory.updater.InventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.BaseInventoryTranslator; public abstract class AbstractHorseInventoryTranslator extends BaseInventoryTranslator { private final InventoryUpdater updater; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java index 035f8efa2..6fee82e18 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java @@ -30,9 +30,9 @@ import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.data.inventory.StackRequestSlotInfoData; import com.nukkitx.protocol.bedrock.packet.InventoryContentPacket; +import org.geysermc.geyser.inventory.BedrockContainerSlot; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.inventory.BedrockContainerSlot; import java.util.Arrays; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/NbtItemStackTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/NbtItemStackTranslator.java index bfa7ebc2e..5f22668df 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/NbtItemStackTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/NbtItemStackTranslator.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.translator.inventory.item; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; public abstract class NbtItemStackTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/PotionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/PotionTranslator.java index 992e6182c..f12355ce6 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/PotionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/PotionTranslator.java @@ -30,8 +30,8 @@ import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.inventory.item.Potion; +import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMappings; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/TippedArrowTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/TippedArrowTranslator.java index fb58aacb9..5dc525e56 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/TippedArrowTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/TippedArrowTranslator.java @@ -30,8 +30,8 @@ import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.inventory.item.TippedArrowPotion; +import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMappings; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/AxolotlBucketTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/AxolotlBucketTranslator.java index 4a91110dc..19809c12f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/AxolotlBucketTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/AxolotlBucketTranslator.java @@ -28,11 +28,11 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.opennbt.tag.builtin.ByteTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; -import org.geysermc.geyser.text.MinecraftLocale; @ItemRemapper public class AxolotlBucketTranslator extends NbtItemStackTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BasicItemTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BasicItemTranslator.java index 72ef0cf0a..5dcc76b49 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BasicItemTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BasicItemTranslator.java @@ -26,11 +26,11 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.opennbt.tag.builtin.*; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; -import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.ItemUtils; import java.util.ArrayList; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BookPagesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BookPagesTranslator.java index ec741f261..652d804fe 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BookPagesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/BookPagesTranslator.java @@ -29,11 +29,11 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; import org.geysermc.geyser.translator.text.MessageTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java index 723798c89..0a4ca0686 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java @@ -28,11 +28,11 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.*; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; @ItemRemapper public class CrossbowTranslator extends NbtItemStackTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantedBookTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantedBookTranslator.java index 9b1d423c1..ad6c2e9f1 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantedBookTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantedBookTranslator.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; @ItemRemapper(priority = 1) public class EnchantedBookTranslator extends NbtItemStackTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java index cd6d5d6ff..204981965 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/EnchantmentTranslator.java @@ -27,11 +27,11 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.opennbt.tag.builtin.*; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.inventory.item.Enchantment; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.inventory.item.Enchantment; -import org.geysermc.geyser.registry.type.ItemMapping; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkBaseTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkBaseTranslator.java index 6a4438358..b74a4f61e 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkBaseTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkBaseTranslator.java @@ -29,8 +29,8 @@ import com.github.steveice10.opennbt.tag.builtin.ByteArrayTag; import com.github.steveice10.opennbt.tag.builtin.ByteTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntArrayTag; -import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; import org.geysermc.geyser.level.FireworkColor; +import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; import org.geysermc.geyser.util.MathUtils; /** diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkRocketTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkRocketTranslator.java index 566b0ac2b..fdf898273 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkRocketTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkRocketTranslator.java @@ -29,9 +29,9 @@ import com.github.steveice10.opennbt.tag.builtin.ByteTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; -import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.util.MathUtils; @ItemRemapper diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkStarTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkStarTranslator.java index c907375b9..eca3272d1 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkStarTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/FireworkStarTranslator.java @@ -29,9 +29,9 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntArrayTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; -import org.geysermc.geyser.registry.type.ItemMapping; @ItemRemapper public class FireworkStarTranslator extends FireworkBaseTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java index 9c74e7123..2fb5ec6cb 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java @@ -27,10 +27,10 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; import java.util.Arrays; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LodestoneCompassTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LodestoneCompassTranslator.java index f4b91165d..8025817f7 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LodestoneCompassTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LodestoneCompassTranslator.java @@ -25,11 +25,14 @@ package org.geysermc.geyser.translator.inventory.item.nbt; -import com.github.steveice10.opennbt.tag.builtin.*; +import com.github.steveice10.opennbt.tag.builtin.ByteTag; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.IntTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; @ItemRemapper public class LodestoneCompassTranslator extends NbtItemStackTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/MapItemTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/MapItemTranslator.java index 80b22dafb..8fd44ef65 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/MapItemTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/MapItemTranslator.java @@ -26,10 +26,10 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.opennbt.tag.builtin.*; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; @ItemRemapper public class MapItemTranslator extends NbtItemStackTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/PlayerHeadTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/PlayerHeadTranslator.java index 44308aeee..d4975f81a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/PlayerHeadTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/PlayerHeadTranslator.java @@ -28,11 +28,11 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import org.geysermc.geyser.registry.type.ItemMapping; -import org.geysermc.geyser.text.MinecraftLocale; @ItemRemapper public class PlayerHeadTranslator extends NbtItemStackTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/ShulkerBoxItemTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/ShulkerBoxItemTranslator.java index 1b9acdb96..f95c54e18 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/ShulkerBoxItemTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/ShulkerBoxItemTranslator.java @@ -27,9 +27,9 @@ package org.geysermc.geyser.translator.inventory.item.nbt; import com.github.steveice10.mc.protocol.data.game.Identifier; import com.github.steveice10.opennbt.tag.builtin.*; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; -import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; import org.geysermc.geyser.util.MathUtils; diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/TropicalFishBucketTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/TropicalFishBucketTranslator.java index 5fd101e8b..6313dc362 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/TropicalFishBucketTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/TropicalFishBucketTranslator.java @@ -31,12 +31,12 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextDecoration; import org.geysermc.geyser.entity.type.living.animal.TropicalFishEntity; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.inventory.item.ItemRemapper; -import org.geysermc.geyser.translator.text.MessageTranslator; -import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.MinecraftLocale; +import org.geysermc.geyser.translator.inventory.item.ItemRemapper; +import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; +import org.geysermc.geyser.translator.text.MessageTranslator; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/BiomeTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/BiomeTranslator.java index ac9a0517a..3e47bfc37 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/BiomeTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/BiomeTranslator.java @@ -30,18 +30,22 @@ import com.github.steveice10.mc.protocol.data.game.chunk.DataPalette; import com.github.steveice10.mc.protocol.data.game.chunk.palette.GlobalPalette; import com.github.steveice10.mc.protocol.data.game.chunk.palette.Palette; import com.github.steveice10.mc.protocol.data.game.chunk.palette.SingletonPalette; -import com.github.steveice10.opennbt.tag.builtin.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.IntTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntLists; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.chunk.BlockStorage; import org.geysermc.geyser.level.chunk.GeyserChunkSection; import org.geysermc.geyser.level.chunk.bitarray.BitArray; import org.geysermc.geyser.level.chunk.bitarray.BitArrayVersion; import org.geysermc.geyser.level.chunk.bitarray.SingletonBitArray; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.JavaCodecEntry; import org.geysermc.geyser.util.MathUtils; // Array index formula by https://wiki.vg/Chunk_Format @@ -55,27 +59,26 @@ public class BiomeTranslator { ListTag serverBiomes = worldGen.get("value"); session.setBiomeGlobalPalette(MathUtils.getGlobalPaletteForSize(serverBiomes.size())); - for (Tag tag : serverBiomes) { - CompoundTag biomeTag = (CompoundTag) tag; - + for (CompoundTag biomeTag : JavaCodecEntry.iterateAsTag(worldGen)) { String javaIdentifier = ((StringTag) biomeTag.get("name")).getValue(); - int bedrockId = Registries.BIOME_IDENTIFIERS.get().getOrDefault(javaIdentifier, -1); + int bedrockId = Registries.BIOME_IDENTIFIERS.get().getOrDefault(javaIdentifier, 0); int javaId = ((IntTag) biomeTag.get("id")).getValue(); - if (bedrockId == -1) { - // There is no matching Bedrock variation for this biome; let's set the closest match based on biome category - String category = ((StringTag) ((CompoundTag) biomeTag.get("element")).get("category")).getValue(); - String replacementBiome = switch (category) { - case "extreme_hills" -> "minecraft:mountains"; - case "icy" -> "minecraft:ice_spikes"; - case "mesa" -> "minecraft:badlands"; - case "mushroom" -> "minecraft:mushroom_fields"; - case "nether" -> "minecraft:nether_wastes"; - default -> "minecraft:ocean"; // Typically ID 0 so a good default - case "taiga", "jungle", "plains", "savanna", "the_end", "beach", "ocean", "desert", "river", "swamp" -> "minecraft:" + category; - }; - bedrockId = Registries.BIOME_IDENTIFIERS.get().getInt(replacementBiome); - } + // TODO - the category tag no longer exists - find a better replacement option +// if (bedrockId == -1) { +// // There is no matching Bedrock variation for this biome; let's set the closest match based on biome category +// String category = ((StringTag) ((CompoundTag) biomeTag.get("element")).get("category")).getValue(); +// String replacementBiome = switch (category) { +// case "extreme_hills" -> "minecraft:mountains"; +// case "icy" -> "minecraft:ice_spikes"; +// case "mesa" -> "minecraft:badlands"; +// case "mushroom" -> "minecraft:mushroom_fields"; +// case "nether" -> "minecraft:nether_wastes"; +// default -> "minecraft:ocean"; // Typically ID 0 so a good default +// case "taiga", "jungle", "plains", "savanna", "the_end", "beach", "ocean", "desert", "river", "swamp" -> "minecraft:" + category; +// }; +// bedrockId = Registries.BIOME_IDENTIFIERS.get().getInt(replacementBiome); +// } // When we see the Java ID, we should instead apply the Bedrock ID biomeTranslations.put(javaId, bedrockId); diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DoubleChestBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DoubleChestBlockEntityTranslator.java index f5ec3607c..0836b1e59 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DoubleChestBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DoubleChestBlockEntityTranslator.java @@ -29,9 +29,9 @@ import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NbtMapBuilder; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.block.DoubleChestValue; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; /** diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/FlowerPotBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/FlowerPotBlockEntityTranslator.java index 845e2e429..ed1a9e82b 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/FlowerPotBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/FlowerPotBlockEntityTranslator.java @@ -29,8 +29,8 @@ import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NbtMap; import com.nukkitx.nbt.NbtMapBuilder; import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; public class FlowerPotBlockEntityTranslator implements BedrockOnlyBlockEntity { diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/PistonBlockEntity.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/PistonBlockEntity.java index f6561ccbe..28e30d6be 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/PistonBlockEntity.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/PistonBlockEntity.java @@ -37,16 +37,18 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import lombok.Getter; import org.geysermc.common.PlatformType; +import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.physics.Axis; -import org.geysermc.geyser.level.physics.Direction; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.cache.PistonCache; import org.geysermc.geyser.level.physics.BoundingBox; import org.geysermc.geyser.level.physics.CollisionManager; -import org.geysermc.geyser.translator.collision.BlockCollision; -import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.level.physics.Direction; import org.geysermc.geyser.registry.Registries; -import org.geysermc.geyser.util.*; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.PistonCache; +import org.geysermc.geyser.translator.collision.BlockCollision; +import org.geysermc.geyser.util.BlockEntityUtils; +import org.geysermc.geyser.util.BlockUtils; +import org.geysermc.geyser.util.ChunkUtils; import java.util.LinkedList; import java.util.Map; diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java index 50d79c10f..94e2d4767 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java @@ -29,19 +29,14 @@ import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; -import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NbtMapBuilder; -import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; -import org.geysermc.geyser.entity.type.player.SkullPlayerEntity; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.skin.SkinProvider; -import org.geysermc.geyser.skin.SkullSkinManager; import java.util.LinkedHashMap; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; @BlockEntity(type = BlockEntityType.SKULL) public class SkullBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState { @@ -74,65 +69,18 @@ public class SkullBlockEntityTranslator extends BlockEntityTranslator implements return CompletableFuture.completedFuture(null); } - public static void spawnPlayer(GeyserSession session, CompoundTag tag, int posX, int posY, int posZ, int blockState) { - float x = posX + .5f; - float y = posY - .01f; - float z = posZ + .5f; - float rotation; - - byte floorRotation = BlockStateValues.getSkullRotation(blockState); - if (floorRotation == -1) { - // Wall skull - y += 0.25f; - rotation = BlockStateValues.getSkullWallDirections().get(blockState); - switch ((int) rotation) { - case 180 -> z += 0.24f; // North - case 0 -> z -= 0.24f; // South - case 90 -> x += 0.24f; // West - case 270 -> x -= 0.24f; // East - } - } else { - rotation = (180f + (floorRotation * 22.5f)) % 360; - } - + public static void translateSkull(GeyserSession session, CompoundTag tag, int posX, int posY, int posZ, int blockState) { Vector3i blockPosition = Vector3i.from(posX, posY, posZ); - Vector3f entityPosition = Vector3f.from(x, y, z); - getTextures(tag).whenComplete((texturesProperty, throwable) -> { if (texturesProperty == null) { session.getGeyser().getLogger().debug("Custom skull with invalid SkullOwner tag: " + blockPosition + " " + tag); return; } - if (session.getEventLoop().inEventLoop()) { - spawnPlayer(session, texturesProperty, blockPosition, entityPosition, rotation, blockState); + session.getSkullCache().putSkull(blockPosition, texturesProperty, blockState); } else { - session.executeInEventLoop(() -> spawnPlayer(session, texturesProperty, blockPosition, entityPosition, rotation, blockState)); + session.executeInEventLoop(() -> session.getSkullCache().putSkull(blockPosition, texturesProperty, blockState)); } }); } - - private static void spawnPlayer(GeyserSession session, String texturesProperty, Vector3i blockPosition, - Vector3f entityPosition, float rotation, int blockState) { - long geyserId = session.getEntityCache().getNextEntityId().incrementAndGet(); - - SkullPlayerEntity existingSkull = session.getSkullCache().get(blockPosition); - if (existingSkull != null) { - // Ensure that two skulls can't spawn on the same point - existingSkull.despawnEntity(blockPosition); - } - - SkullPlayerEntity player = new SkullPlayerEntity(session, geyserId, entityPosition, rotation, blockState, texturesProperty); - - // Cache entity - session.getSkullCache().put(blockPosition, player); - - player.spawnEntity(); - - SkullSkinManager.requestAndHandleSkin(player, session, (skin -> session.scheduleInEventLoop(() -> { - // Delay to minimize split-second "player" pop-in - player.setFlag(EntityFlag.INVISIBLE, false); - player.updateBedrockMetadata(); - }, 250, TimeUnit.MILLISECONDS))); - } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/event/SoundEventEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/event/SoundEventEventTranslator.java index 049870114..1cb3670fb 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/event/SoundEventEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/event/SoundEventEventTranslator.java @@ -40,7 +40,7 @@ public record SoundEventEventTranslator(SoundEvent soundEvent, levelSoundEvent.setIdentifier(identifier); levelSoundEvent.setExtraData(extraData); levelSoundEvent.setRelativeVolumeDisabled(packet.isBroadcast()); - levelSoundEvent.setPosition(Vector3f.from(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()).add(0.5f, 0.5f, 0.5f)); + levelSoundEvent.setPosition(Vector3f.from(packet.getPosition().getX() + 0.5f, packet.getPosition().getY() + 0.5f, packet.getPosition().getZ() + 0.5f)); levelSoundEvent.setBabySound(false); session.sendUpstreamPacket(levelSoundEvent); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java index 1f2f29ea5..67f0d0d59 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java @@ -25,12 +25,11 @@ package org.geysermc.geyser.translator.protocol.bedrock; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetJigsawBlockPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundSignUpdatePacket; +import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NbtMap; import com.nukkitx.protocol.bedrock.packet.BlockEntityDataPacket; -import com.nukkitx.protocol.bedrock.v503.Bedrock_v503; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; @@ -45,16 +44,8 @@ public class BedrockBlockEntityDataTranslator extends PacketTranslator { + case BOAT, CHEST_BOAT -> { // Include type of boat in the name int variant = ((BoatEntity) entity).getVariant(); String typeOfBoat = switch (variant) { @@ -61,9 +61,10 @@ public class BedrockEntityPickRequestTranslator extends PacketTranslator "jungle"; case 4 -> "acacia"; case 5 -> "dark_oak"; + case 6 -> "mangrove"; default -> "oak"; }; - itemName = typeOfBoat + "_boat"; + itemName = typeOfBoat + "_" + entity.getDefinition().entityType().name().toLowerCase(Locale.ROOT); } case LEASH_KNOT -> itemName = "lead"; case CHEST_MINECART, COMMAND_BLOCK_MINECART, FURNACE_MINECART, HOPPER_MINECART, TNT_MINECART -> diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java index a5787c1c6..243b1cede 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.translator.protocol.bedrock; import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; @@ -121,8 +120,9 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator { - ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND); + ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, session.getNextSequence()); session.sendDownstreamPacket(itemPacket); }, 5, TimeUnit.MILLISECONDS)); } @@ -336,7 +337,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator legacySlots = packet.getLegacySlots(); @@ -417,8 +418,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator session.sendDownstreamPacket(new ServerboundUseItemPacket(Hand.MAIN_HAND)), + session.scheduleInEventLoop(() -> session.sendDownstreamPacket(new ServerboundUseItemPacket(Hand.MAIN_HAND, session.getNextSequence())), 50, TimeUnit.MILLISECONDS); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockMoveEntityAbsoluteTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockMoveEntityAbsoluteTranslator.java index 0bb3df071..e6390bdba 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockMoveEntityAbsoluteTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockMoveEntityAbsoluteTranslator.java @@ -28,9 +28,9 @@ package org.geysermc.geyser.translator.protocol.bedrock; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundMoveVehiclePacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; +import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.entity.type.BoatEntity; import org.geysermc.geyser.entity.type.Entity; -import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockNetworkStackLatencyTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockNetworkStackLatencyTranslator.java index 0cbaa9e99..876395114 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockNetworkStackLatencyTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockNetworkStackLatencyTranslator.java @@ -29,11 +29,11 @@ import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundKe import com.nukkitx.protocol.bedrock.data.AttributeData; import com.nukkitx.protocol.bedrock.packet.NetworkStackLatencyPacket; import com.nukkitx.protocol.bedrock.packet.UpdateAttributesPacket; +import org.geysermc.floodgate.util.DeviceOs; import org.geysermc.geyser.entity.attribute.GeyserAttributeType; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.floodgate.util.DeviceOs; import java.util.Collections; import java.util.concurrent.TimeUnit; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockPlayerInputTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockPlayerInputTranslator.java index fb2435cea..88cfcdff7 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockPlayerInputTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockPlayerInputTranslator.java @@ -29,9 +29,9 @@ import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.Serverb import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundPlayerInputPacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.PlayerInputPacket; +import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.entity.type.BoatEntity; import org.geysermc.geyser.entity.type.Entity; -import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.entity.type.living.animal.horse.AbstractHorseEntity; import org.geysermc.geyser.entity.type.living.animal.horse.LlamaEntity; import org.geysermc.geyser.session.GeyserSession; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockServerSettingsRequestTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockServerSettingsRequestTranslator.java index ccf68ac53..6cc60dd45 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockServerSettingsRequestTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockServerSettingsRequestTranslator.java @@ -27,26 +27,31 @@ package org.geysermc.geyser.translator.protocol.bedrock; import com.nukkitx.protocol.bedrock.packet.ServerSettingsRequestPacket; import com.nukkitx.protocol.bedrock.packet.ServerSettingsResponsePacket; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.form.impl.FormDefinitions; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.SettingsUtils; -import org.geysermc.cumulus.CustomForm; import java.util.concurrent.TimeUnit; @Translator(packet = ServerSettingsRequestPacket.class) public class BedrockServerSettingsRequestTranslator extends PacketTranslator { + private final FormDefinitions formDefinitions = FormDefinitions.instance(); + @Override public void translate(GeyserSession session, ServerSettingsRequestPacket packet) { - CustomForm window = SettingsUtils.buildForm(session); - int windowId = session.getFormCache().addForm(window); + CustomForm form = SettingsUtils.buildForm(session); + int formId = session.getFormCache().addForm(form); + + String jsonData = formDefinitions.codecFor(form).jsonData(form); // Fixes https://bugs.mojang.com/browse/MCPE-94012 because of the delay session.scheduleInEventLoop(() -> { ServerSettingsResponsePacket serverSettingsResponsePacket = new ServerSettingsResponsePacket(); - serverSettingsResponsePacket.setFormData(window.getJsonData()); - serverSettingsResponsePacket.setFormId(windowId); + serverSettingsResponsePacket.setFormData(jsonData); + serverSettingsResponsePacket.setFormId(formId); session.sendUpstreamPacket(serverSettingsResponsePacket); }, 1, TimeUnit.SECONDS); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockShowCreditsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockShowCreditsTranslator.java index ca6ac09dd..6fa271010 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockShowCreditsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockShowCreditsTranslator.java @@ -25,13 +25,12 @@ package org.geysermc.geyser.translator.protocol.bedrock; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.protocol.PacketTranslator; -import org.geysermc.geyser.translator.protocol.Translator; - import com.github.steveice10.mc.protocol.data.game.ClientCommand; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket; import com.nukkitx.protocol.bedrock.packet.ShowCreditsPacket; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; @Translator(packet = ShowCreditsPacket.class) public class BedrockShowCreditsTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java index 91ed5aa2b..e52fac371 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.translator.protocol.bedrock; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket; import com.nukkitx.protocol.bedrock.packet.TextPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.ChatColor; @@ -63,7 +62,6 @@ public class BedrockTextTranslator extends PacketTranslator { return; } - ServerboundChatPacket chatPacket = new ServerboundChatPacket(message); - session.sendDownstreamPacket(chatPacket); + session.sendChat(message); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java index 5429899fa..fe519c329 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.translator.protocol.bedrock.entity.player; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; import com.github.steveice10.mc.protocol.data.game.entity.player.*; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundInteractPacket; @@ -129,8 +128,8 @@ public class BedrockActionTranslator extends PacketTranslator { @@ -43,8 +43,8 @@ public class BedrockEmoteTranslator extends PacketTranslator { public void translate(GeyserSession session, EmotePacket packet) { if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() != EmoteOffhandWorkaroundOption.DISABLED) { // Activate the workaround - we should trigger the offhand now - ServerboundPlayerActionPacket swapHandsPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, BlockUtils.POSITION_ZERO, - Direction.DOWN); + ServerboundPlayerActionPacket swapHandsPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, Vector3i.ZERO, + Direction.DOWN, session.getNextSequence()); session.sendDownstreamPacket(swapHandsPacket); if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() == EmoteOffhandWorkaroundOption.NO_EMOTES) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java index 471668492..fed8f5ce6 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.translator.protocol.bedrock.entity.player; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerState; +import com.github.steveice10.mc.protocol.data.game.entity.type.EntityType; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundInteractPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerCommandPacket; import com.nukkitx.protocol.bedrock.data.entity.EntityData; -import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.inventory.ContainerType; import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket; import com.nukkitx.protocol.bedrock.packet.InteractPacket; @@ -96,12 +96,10 @@ public class BedrockInteractTranslator extends PacketTranslator case OPEN_INVENTORY: if (session.getOpenInventory() == null) { Entity ridingEntity = session.getPlayerEntity().getVehicle(); - if (ridingEntity instanceof AbstractHorseEntity) { - if (ridingEntity.getFlag(EntityFlag.TAMED)) { - // We should request to open the horse inventory instead - ServerboundPlayerCommandPacket openHorseWindowPacket = new ServerboundPlayerCommandPacket(session.getPlayerEntity().getEntityId(), PlayerState.OPEN_HORSE_INVENTORY); - session.sendDownstreamPacket(openHorseWindowPacket); - } + if (ridingEntity instanceof AbstractHorseEntity || (ridingEntity != null && ridingEntity.getDefinition().entityType() == EntityType.CHEST_BOAT)) { + // This mob has an inventory of its own that we should open instead. + ServerboundPlayerCommandPacket openVehicleWindowPacket = new ServerboundPlayerCommandPacket(session.getPlayerEntity().getEntityId(), PlayerState.OPEN_VEHICLE_INVENTORY); + session.sendDownstreamPacket(openVehicleWindowPacket); } else { session.setOpenInventory(session.getPlayerInventory()); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockMovePlayerTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockMovePlayerTranslator.java index 8732b7909..6926d33d2 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockMovePlayerTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockMovePlayerTranslator.java @@ -35,9 +35,9 @@ import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket; import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; +import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.ChatColor; -import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; @@ -140,6 +140,8 @@ public class BedrockMovePlayerTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaChangeDifficultyTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaChangeDifficultyTranslator.java index fdc2fa2fb..6504959dc 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaChangeDifficultyTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaChangeDifficultyTranslator.java @@ -26,10 +26,10 @@ package org.geysermc.geyser.translator.protocol.java; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundChangeDifficultyPacket; +import com.nukkitx.protocol.bedrock.packet.SetDifficultyPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import com.nukkitx.protocol.bedrock.packet.SetDifficultyPacket; @Translator(packet = ClientboundChangeDifficultyPacket.class) public class JavaChangeDifficultyTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java index 440a3b14e..54ffa0e6d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java @@ -47,12 +47,12 @@ import net.kyori.adventure.text.format.NamedTextColor; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.event.downstream.ServerDefineCommandsEvent; import org.geysermc.geyser.command.GeyserCommandManager; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.protocol.PacketTranslator; -import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.inventory.item.Enchantment; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.EntityUtils; import java.util.*; @@ -228,7 +228,7 @@ public class JavaCommandsTranslator extends PacketTranslator CommandParam.BLOCK_POSITION; case COLUMN_POS, VEC3 -> CommandParam.POSITION; case MESSAGE -> CommandParam.MESSAGE; - case NBT, NBT_COMPOUND_TAG, NBT_TAG, NBT_PATH -> CommandParam.JSON; + case NBT_COMPOUND_TAG, NBT_TAG, NBT_PATH -> CommandParam.JSON; //TODO NBT was removed case RESOURCE_LOCATION, FUNCTION -> CommandParam.FILE_PATH; case BOOL -> ENUM_BOOLEAN; case OPERATION -> CommandParam.OPERATOR; // ">=", "==", etc @@ -323,15 +323,21 @@ public class JavaCommandsTranslator extends PacketTranslator // So if paramNode.getName() == "value" and enumData.getName() == "bool": - children.add(new ParamInfo(paramNode, new CommandParamData(paramNode.getName(), this.paramNode.isExecutable(), enumData, type, null, Collections.emptyList()))); + children.add(new ParamInfo(paramNode, new CommandParamData(paramNode.getName(), optional, enumData, type, null, Collections.emptyList()))); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCustomPayloadTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCustomPayloadTranslator.java index 094cc3979..2c52ac5a5 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCustomPayloadTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCustomPayloadTranslator.java @@ -25,10 +25,16 @@ package org.geysermc.geyser.translator.protocol.java; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCustomPayloadPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundCustomPayloadPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCustomPayloadPacket; import com.google.common.base.Charsets; import com.nukkitx.protocol.bedrock.packet.TransferPacket; +import com.nukkitx.protocol.bedrock.packet.UnknownPacket; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.geysermc.cumulus.Forms; +import org.geysermc.cumulus.form.Form; +import org.geysermc.cumulus.form.util.FormType; import org.geysermc.floodgate.pluginmessage.PluginMessageChannels; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; @@ -36,9 +42,6 @@ import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.cumulus.Form; -import org.geysermc.cumulus.Forms; -import org.geysermc.cumulus.util.FormType; import java.nio.charset.StandardCharsets; @@ -61,16 +64,14 @@ public class JavaCustomPayloadTranslator extends PacketTranslator { + Form form = Forms.fromJson(dataString, type, (ignored, response) -> { byte[] raw = response.getBytes(StandardCharsets.UTF_8); byte[] finalData = new byte[raw.length + 2]; @@ -85,8 +86,7 @@ public class JavaCustomPayloadTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java index 4e6718c10..1c83bf2cc 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java @@ -25,53 +25,99 @@ package org.geysermc.geyser.translator.protocol.java; +import com.github.steveice10.mc.protocol.data.game.MessageType; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCustomPayloadPacket; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.IntTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.nukkitx.protocol.bedrock.data.GameRuleData; import com.nukkitx.protocol.bedrock.data.PlayerPermission; import com.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket; import com.nukkitx.protocol.bedrock.packet.GameRulesChangedPacket; import com.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket; +import com.nukkitx.protocol.bedrock.packet.TextPacket; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.geysermc.floodgate.pluginmessage.PluginMessageChannels; -import org.geysermc.geyser.entity.type.player.PlayerEntity; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.api.network.AuthType; +import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; +import org.geysermc.geyser.level.JavaDimension; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.ChatTypeEntry; +import org.geysermc.geyser.text.TextDecoration; import org.geysermc.geyser.translator.level.BiomeTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.ChunkUtils; import org.geysermc.geyser.util.DimensionUtils; +import org.geysermc.geyser.util.JavaCodecEntry; import org.geysermc.geyser.util.PluginMessageUtils; +import java.util.Map; + @Translator(packet = ClientboundLoginPacket.class) public class JavaLoginTranslator extends PacketTranslator { @Override public void translate(GeyserSession session, ClientboundLoginPacket packet) { - PlayerEntity entity = session.getPlayerEntity(); + SessionPlayerEntity entity = session.getPlayerEntity(); entity.setEntityId(packet.getEntityId()); + Map dimensions = session.getDimensions(); + dimensions.clear(); + + JavaDimension.load(packet.getRegistry(), dimensions); + + Int2ObjectMap chatTypes = session.getChatTypes(); + chatTypes.clear(); + for (CompoundTag tag : JavaCodecEntry.iterateAsTag(packet.getRegistry().get("minecraft:chat_type"))) { + // The ID is NOT ALWAYS THE SAME! ViaVersion as of 1.19 adds two registry entries that do NOT match vanilla. + int id = ((IntTag) tag.get("id")).getValue(); + CompoundTag element = tag.get("element"); + CompoundTag chat = element.get("chat"); + TextDecoration textDecoration = null; + if (chat != null) { + CompoundTag decorationTag = chat.get("decoration"); + if (decorationTag != null) { + textDecoration = new TextDecoration(decorationTag); + } + } + MessageType type = MessageType.from(((StringTag) tag.get("name")).getValue()); + // TODO new types? + TextPacket.Type bedrockType = switch (type) { + case CHAT -> TextPacket.Type.CHAT; + case SYSTEM -> TextPacket.Type.SYSTEM; + case GAME_INFO -> TextPacket.Type.TIP; + default -> TextPacket.Type.RAW; + }; + chatTypes.put(id, new ChatTypeEntry(bedrockType, textDecoration)); + } + // If the player is already initialized and a join game packet is sent, they // are swapping servers - String newDimension = DimensionUtils.getNewDimension(packet.getDimension()); if (session.isSpawned()) { - String fakeDim = DimensionUtils.getTemporaryDimension(session.getDimension(), newDimension); + String fakeDim = DimensionUtils.getTemporaryDimension(session.getDimension(), packet.getDimension()); DimensionUtils.switchDimension(session, fakeDim); session.getWorldCache().removeScoreboard(); } session.setWorldName(packet.getWorldName()); - BiomeTranslator.loadServerBiomes(session, packet.getDimensionCodec()); + BiomeTranslator.loadServerBiomes(session, packet.getRegistry()); session.getTagCache().clear(); session.setGameMode(packet.getGameMode()); + String newDimension = packet.getDimension(); + boolean needsSpawnPacket = !session.isSentSpawnPacket(); if (needsSpawnPacket) { // The player has yet to spawn so let's do that using some of the information in this Java packet session.setDimension(newDimension); session.connect(); + + // It is now safe to send these packets + session.getUpstream().sendPostStartGamePackets(); } AdventureSettingsPacket bedrockPacket = new AdventureSettingsPacket(); @@ -85,6 +131,8 @@ public class JavaLoginTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ClientboundPlayerChatPacket packet) { + ChatTypeEntry entry = session.getChatTypes().get(packet.getTypeId()); + + TextPacket textPacket = new TextPacket(); + textPacket.setPlatformChatId(""); + textPacket.setSourceName(""); + textPacket.setXuid(session.getAuthData().xuid()); + textPacket.setType(entry.bedrockChatType()); + + textPacket.setNeedsTranslation(false); + Component message = packet.getUnsignedContent() == null ? packet.getSignedContent() : packet.getUnsignedContent(); + + TextDecoration decoration = entry.textDecoration(); + if (decoration != null) { + // As of 1.19 - do this to apply all the styling for signed messages + // Though, Bedrock cannot care about the signed stuff. + TranslatableComponent.Builder withDecoration = Component.translatable() + .key(decoration.translationKey()) + .style(decoration.style()); + Set parameters = decoration.parameters(); + List args = new ArrayList<>(3); + if (parameters.contains(TextDecoration.Parameter.TEAM_NAME)) { + args.add(packet.getSenderTeamName()); + } + if (parameters.contains(TextDecoration.Parameter.SENDER)) { + args.add(packet.getSenderName()); + } + if (parameters.contains(TextDecoration.Parameter.CONTENT)) { + args.add(message); + } + withDecoration.args(args); + textPacket.setMessage(MessageTranslator.convertMessage(withDecoration.build(), session.locale())); + } else { + textPacket.setMessage(MessageTranslator.convertMessage(message, session.locale())); + } + + session.sendUpstreamPacket(textPacket); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaRespawnTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaRespawnTranslator.java index 03d006a50..3471ce576 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaRespawnTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaRespawnTranslator.java @@ -33,9 +33,9 @@ import com.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket; import org.geysermc.geyser.entity.attribute.GeyserAttributeType; import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.util.ChunkUtils; import org.geysermc.geyser.util.DimensionUtils; @@ -55,6 +55,9 @@ public class JavaRespawnTranslator extends PacketTranslator { +@Translator(packet = ClientboundSystemChatPacket.class) +public class JavaSystemChatTranslator extends PacketTranslator { @Override - public void translate(GeyserSession session, ClientboundChatPacket packet) { + public void translate(GeyserSession session, ClientboundSystemChatPacket packet) { TextPacket textPacket = new TextPacket(); textPacket.setPlatformChatId(""); textPacket.setSourceName(""); textPacket.setXuid(session.getAuthData().xuid()); - textPacket.setType(switch (packet.getType()) { - case CHAT -> TextPacket.Type.CHAT; - case SYSTEM -> TextPacket.Type.SYSTEM; - case NOTIFICATION -> TextPacket.Type.TIP; - default -> TextPacket.Type.RAW; - }); + textPacket.setType(session.getChatTypes().get(packet.getTypeId()).bedrockChatType()); textPacket.setNeedsTranslation(false); - textPacket.setMessage(MessageTranslator.convertMessage(packet.getMessage(), session.locale())); + textPacket.setMessage(MessageTranslator.convertMessage(packet.getContent(), session.locale())); - session.sendUpstreamPacket(textPacket); + if (session.isSentSpawnPacket()) { + session.sendUpstreamPacket(textPacket); + } else { + session.getUpstream().queuePostStartGamePacket(textPacket); + } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java index a7733f211..94bac62bf 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java @@ -27,16 +27,16 @@ package org.geysermc.geyser.translator.protocol.java; import com.github.steveice10.mc.protocol.data.game.advancement.Advancement; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundUpdateAdvancementsPacket; -import com.nukkitx.protocol.bedrock.packet.SetTitlePacket; +import com.nukkitx.protocol.bedrock.packet.ToastRequestPacket; +import org.geysermc.geyser.level.GeyserAdvancement; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.AdvancementsCache; +import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.translator.text.MessageTranslator; -import org.geysermc.geyser.session.cache.AdvancementsCache; -import org.geysermc.geyser.level.GeyserAdvancement; -import org.geysermc.geyser.text.MinecraftLocale; -import java.util.Map; +import java.util.Locale; @Translator(packet = ClientboundUpdateAdvancementsPacket.class) public class JavaUpdateAdvancementsTranslator extends PacketTranslator { @@ -56,48 +56,39 @@ public class JavaUpdateAdvancementsTranslator extends PacketTranslator> progress : packet.getProgress().entrySet()) { - GeyserAdvancement advancement = session.getAdvancementsCache().getStoredAdvancements().get(progress.getKey()); + for (String advancementId : packet.getProgress().keySet()) { + GeyserAdvancement advancement = session.getAdvancementsCache().getStoredAdvancements().get(advancementId); if (advancement != null && advancement.getDisplayData() != null) { - if (session.getAdvancementsCache().isEarned(advancement)) { - // Java uses some pink color for toast challenge completes - String color = advancement.getDisplayData().getFrameType() == Advancement.DisplayData.FrameType.CHALLENGE ? - "§d" : "§a"; + if (advancement.getDisplayData().isShowToast() && session.getAdvancementsCache().isEarned(advancement)) { + String frameType = advancement.getDisplayData().getFrameType().toString().toLowerCase(Locale.ROOT); + String frameTitle = advancement.getDisplayColor() + MinecraftLocale.getLocaleString("advancements.toast." + frameType, session.locale()); String advancementName = MessageTranslator.convertMessage(advancement.getDisplayData().getTitle(), session.locale()); - // Send an action bar message stating they earned an achievement - // Sent for instances where broadcasting advancements through chat are disabled - SetTitlePacket titlePacket = new SetTitlePacket(); - titlePacket.setText(color + "[" + MinecraftLocale.getLocaleString("advancements.toast." + - advancement.getDisplayData().getFrameType().toString().toLowerCase(), session.locale()) + "]§f " + advancementName); - titlePacket.setType(SetTitlePacket.Type.ACTIONBAR); - titlePacket.setFadeOutTime(3); - titlePacket.setFadeInTime(3); - titlePacket.setStayTime(3); - titlePacket.setXuid(""); - titlePacket.setPlatformOnlineId(""); - session.sendUpstreamPacket(titlePacket); + ToastRequestPacket toastRequestPacket = new ToastRequestPacket(); + toastRequestPacket.setTitle(frameTitle); + toastRequestPacket.setContent(advancementName); + session.sendUpstreamPacket(toastRequestPacket); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java index 1c5a15b0b..4c72a359a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java @@ -38,20 +38,22 @@ import com.nukkitx.nbt.NbtMap; import com.nukkitx.protocol.bedrock.data.inventory.CraftingData; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.packet.CraftingDataPacket; -import com.nukkitx.protocol.bedrock.v486.Bedrock_v486; -import it.unimi.dsi.fastutil.ints.*; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import org.geysermc.geyser.inventory.recipe.GeyserRecipe; import org.geysermc.geyser.inventory.recipe.GeyserShapedRecipe; import org.geysermc.geyser.inventory.recipe.GeyserShapelessRecipe; import org.geysermc.geyser.inventory.recipe.GeyserStonecutterData; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.protocol.PacketTranslator; -import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.translator.inventory.item.ItemTranslator; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.item.ItemTranslator; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.InventoryUtils; import java.util.*; @@ -82,8 +84,6 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator= Bedrock_v486.V486_CODEC.getProtocolVersion(); - Int2ObjectMap recipeMap = new Int2ObjectOpenHashMap<>(Registries.RECIPES.forVersion(session.getUpstream().getProtocolVersion())); Int2ObjectMap> unsortedStonecutterData = new Int2ObjectOpenHashMap<>(); CraftingDataPacket craftingDataPacket = new CraftingDataPacket(); @@ -138,10 +138,6 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator { // Required to translate these as of 1.18.10, or else they cannot be crafted - if (!applySmithingRecipes) { - continue; - } - SmithingRecipeData recipeData = (SmithingRecipeData) recipe.getData(); ItemData output = ItemTranslator.translateToBedrock(session, recipeData.getResult()); for (ItemStack base : recipeData.getBase().getOptions()) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java index b9cbebb22..559964f63 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java @@ -36,6 +36,8 @@ import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.DimensionUtils; +import java.util.Optional; + @Translator(packet = ClientboundAnimatePacket.class) public class JavaAnimateTranslator extends PacketTranslator { @@ -77,6 +79,7 @@ public class JavaAnimateTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddPaintingTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaSoundEntityTranslator.java similarity index 59% rename from core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddPaintingTranslator.java rename to core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaSoundEntityTranslator.java index 6f11640c7..06f141aa6 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddPaintingTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaSoundEntityTranslator.java @@ -23,27 +23,23 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.translator.protocol.java.entity.spawn; +package org.geysermc.geyser.translator.protocol.java.entity; -import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddPaintingPacket; -import com.nukkitx.math.vector.Vector3f; -import org.geysermc.geyser.entity.type.PaintingEntity; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundSoundEntityPacket; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.level.PaintingType; - -@Translator(packet = ClientboundAddPaintingPacket.class) -public class JavaAddPaintingTranslator extends PacketTranslator { +import org.geysermc.geyser.util.SoundUtils; +@Translator(packet = ClientboundSoundEntityPacket.class) +public class JavaSoundEntityTranslator extends PacketTranslator { @Override - public void translate(GeyserSession session, ClientboundAddPaintingPacket packet) { - Vector3f position = Vector3f.from(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()); - - PaintingEntity entity = new PaintingEntity(session, packet.getEntityId(), - session.getEntityCache().getNextEntityId().incrementAndGet(), packet.getUuid(), - position, PaintingType.getByPaintingType(packet.getPaintingType()), packet.getDirection().getHorizontalIndex()); - - session.getEntityCache().spawnEntity(entity); + public void translate(GeyserSession session, ClientboundSoundEntityPacket packet) { + Entity entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId()); + if (entity == null) { + return; + } + SoundUtils.playBuiltinSound(session, packet.getSound(), entity.getPosition(), packet.getVolume(), packet.getPitch()); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaBlockBreakAckTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaBlockChangedAckTranslator.java similarity index 57% rename from core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaBlockBreakAckTranslator.java rename to core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaBlockChangedAckTranslator.java index 634d4d424..6afb0b3ef 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaBlockBreakAckTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaBlockChangedAckTranslator.java @@ -25,30 +25,16 @@ package org.geysermc.geyser.translator.protocol.java.entity.player; -import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction; -import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundBlockBreakAckPacket; -import com.nukkitx.math.vector.Vector3f; -import com.nukkitx.protocol.bedrock.data.LevelEventType; -import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundBlockChangedAckPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.level.block.BlockStateValues; -import org.geysermc.geyser.util.ChunkUtils; -@Translator(packet = ClientboundBlockBreakAckPacket.class) -public class JavaBlockBreakAckTranslator extends PacketTranslator { +@Translator(packet = ClientboundBlockChangedAckPacket.class) +public class JavaBlockChangedAckTranslator extends PacketTranslator { @Override - public void translate(GeyserSession session, ClientboundBlockBreakAckPacket packet) { - ChunkUtils.updateBlock(session, packet.getNewState(), packet.getPosition()); - if (packet.getAction() == PlayerAction.START_DIGGING && !packet.isSuccessful()) { - LevelEventPacket stopBreak = new LevelEventPacket(); - stopBreak.setType(LevelEventType.BLOCK_STOP_BREAK); - stopBreak.setPosition(Vector3f.from(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ())); - stopBreak.setData(0); - session.setBreakingBlock(BlockStateValues.JAVA_AIR_ID); - session.sendUpstreamPacket(stopBreak); - } + public void translate(GeyserSession session, ClientboundBlockChangedAckPacket packet) { + // TODO } } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerInfoTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerInfoTranslator.java index 993da7746..1cefb9731 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerInfoTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerInfoTranslator.java @@ -34,9 +34,9 @@ import com.nukkitx.protocol.bedrock.packet.PlayerListPacket; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.skin.SkinManager; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.skin.SkinManager; @Translator(packet = ClientboundPlayerInfoPacket.class) public class JavaPlayerInfoTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaSetHealthTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaSetHealthTranslator.java index d989fe964..67047d00e 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaSetHealthTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaSetHealthTranslator.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.translator.protocol.java.entity.player; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundSetHealthPacket; import com.nukkitx.protocol.bedrock.data.AttributeData; +import com.nukkitx.protocol.bedrock.packet.RespawnPacket; import com.nukkitx.protocol.bedrock.packet.UpdateAttributesPacket; import org.geysermc.geyser.entity.attribute.GeyserAttributeType; import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; @@ -43,6 +44,18 @@ public class JavaSetHealthTranslator extends PacketTranslator 0f) { + // Needed as of 1.18.30 (tested with a totem of undying on SPIGOT 1.12.2 + // This shouldn't be triggered on a proper respawn because JavaSetHealthTranslator sets the health back to 20 + // https://github.com/GeyserMC/Geyser/issues/2957 + RespawnPacket respawnPacket = new RespawnPacket(); + respawnPacket.setRuntimeEntityId(0); + respawnPacket.setPosition(entity.getPosition()); + respawnPacket.setState(RespawnPacket.State.SERVER_READY); + session.sendUpstreamPacket(respawnPacket); + } + entity.setHealth(packet.getHealth()); UpdateAttributesPacket attributesPacket = new UpdateAttributesPacket(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java index 33a347658..49cca79d2 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java @@ -32,10 +32,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.type.EntityType; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddEntityPacket; import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.entity.type.Entity; -import org.geysermc.geyser.entity.type.FallingBlockEntity; -import org.geysermc.geyser.entity.type.FishingHookEntity; -import org.geysermc.geyser.entity.type.ItemFrameEntity; +import org.geysermc.geyser.entity.type.*; import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.session.GeyserSession; @@ -52,6 +49,7 @@ public class JavaAddEntityTranslator extends PacketTranslator definition = Registries.ENTITY_DEFINITIONS.get(packet.getType()); if (definition == null) { @@ -62,11 +60,14 @@ public class JavaAddEntityTranslator extends PacketTranslator { - - @Override - public void translate(GeyserSession session, ClientboundAddMobPacket packet) { - Vector3f position = Vector3f.from(packet.getX(), packet.getY(), packet.getZ()); - Vector3f motion = Vector3f.from(packet.getMotionX(), packet.getMotionY(), packet.getMotionZ()); - - EntityDefinition definition = Registries.ENTITY_DEFINITIONS.get(packet.getType()); - if (definition == null) { - session.getGeyser().getLogger().warning(GeyserLocale.getLocaleStringLog("geyser.entity.type_null", packet.getType())); - return; - } - - Entity entity = definition.factory().create(session, packet.getEntityId(), session.getEntityCache().getNextEntityId().incrementAndGet(), - packet.getUuid(), definition, position, motion, packet.getYaw(), packet.getPitch(), packet.getHeadYaw() - ); - session.getEntityCache().spawnEntity(entity); - } -} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddPlayerTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddPlayerTranslator.java index c54b75f4f..c4b5aae2d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddPlayerTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddPlayerTranslator.java @@ -30,10 +30,10 @@ import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.skin.SkinManager; +import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.skin.SkinManager; @Translator(packet = ClientboundAddPlayerPacket.class) public class JavaAddPlayerTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetContentTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetContentTranslator.java index f905cd661..0775028fe 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetContentTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetContentTranslator.java @@ -30,9 +30,9 @@ import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.util.InventoryUtils; @Translator(packet = ClientboundContainerSetContentPacket.class) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetDataTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetDataTranslator.java index 30c2abe25..923b10a26 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetDataTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetDataTranslator.java @@ -28,9 +28,9 @@ package org.geysermc.geyser.translator.protocol.java.inventory; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundContainerSetDataPacket; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.util.InventoryUtils; @Translator(packet = ClientboundContainerSetDataPacket.class) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java index 727a17785..46b138076 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java @@ -36,12 +36,12 @@ import org.geysermc.geyser.entity.type.living.animal.horse.ChestedHorseEntity; import org.geysermc.geyser.entity.type.living.animal.horse.LlamaEntity; import org.geysermc.geyser.inventory.Container; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.protocol.PacketTranslator; -import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.inventory.horse.DonkeyInventoryTranslator; import org.geysermc.geyser.translator.inventory.horse.HorseInventoryTranslator; import org.geysermc.geyser.translator.inventory.horse.LlamaInventoryTranslator; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.InventoryUtils; import java.util.ArrayList; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java index 7c4bd561f..84d7f766d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java @@ -27,14 +27,13 @@ package org.geysermc.geyser.translator.protocol.java.level; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundBlockDestructionPacket; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; -import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.LevelEventType; import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; +import org.geysermc.geyser.registry.BlockRegistries; +import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.registry.BlockRegistries; -import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.util.BlockUtils; @Translator(packet = ClientboundBlockDestructionPacket.class) @@ -45,11 +44,7 @@ public class JavaBlockDestructionTranslator extends PacketTranslator= 2 && session.getGameMode() == GameMode.CREATIVE && packet.getNbt() != null && packet.getNbt().size() > 5) { ContainerOpenPacket openPacket = new ContainerOpenPacket(); - openPacket.setBlockPosition(Vector3i.from(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ())); + openPacket.setBlockPosition(position); openPacket.setId((byte) 1); openPacket.setType(ContainerType.COMMAND_BLOCK); openPacket.setUniqueEntityId(-1); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java index 6adf1e00f..8824f88c4 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.translator.protocol.java.level; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.level.block.value.*; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundBlockEventPacket; import com.nukkitx.math.vector.Vector3i; @@ -49,9 +48,8 @@ public class JavaBlockEventTranslator extends PacketTranslator 0 ? 1 : 0); @@ -78,20 +76,20 @@ public class JavaBlockEventTranslator extends PacketTranslator new PistonBlockEntity(session, pos, direction, true, true)); + PistonBlockEntity blockEntity = pistonCache.getPistons().computeIfAbsent(position, pos -> new PistonBlockEntity(session, pos, direction, true, true)); if (blockEntity.getAction() != action) { blockEntity.setAction(action, Object2IntMaps.emptyMap()); } } } else { - PistonBlockEntity blockEntity = pistonCache.getPistons().computeIfAbsent(vector, pos -> { + PistonBlockEntity blockEntity = pistonCache.getPistons().computeIfAbsent(position, pos -> { int blockId = session.getGeyser().getWorldManager().getBlockAt(session, position); boolean sticky = BlockStateValues.isStickyPiston(blockId); boolean extended = action != PistonValueType.PUSHING; @@ -108,7 +106,7 @@ public class JavaBlockEventTranslator extends PacketTranslator { @Override public void translate(GeyserSession session, ClientboundCustomSoundPacket packet) { - String packetSound; - if (packet.getSound() instanceof BuiltinSound) { - packetSound = ((BuiltinSound) packet.getSound()).getName(); - } else if (packet.getSound() instanceof CustomSound) { - packetSound = ((CustomSound) packet.getSound()).getName(); - } else { - session.getGeyser().getLogger().debug("Unknown sound packet, we were unable to map this. " + packet.toString()); - return; - } - - SoundMapping soundMapping = Registries.SOUNDS.get(packetSound.replace("minecraft:", "")); - String playsound; - if (soundMapping == null || soundMapping.getPlaysound() == null) { - // no mapping - session.getGeyser().getLogger() - .debug("[PlaySound] Defaulting to sound server gave us for " + packet.toString()); - playsound = packetSound.replace("minecraft:", ""); - } else { - playsound = soundMapping.getPlaysound(); - } - PlaySoundPacket playSoundPacket = new PlaySoundPacket(); - playSoundPacket.setSound(playsound); + playSoundPacket.setSound(SoundUtils.translatePlaySound(packet.getSound())); playSoundPacket.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ())); playSoundPacket.setVolume(packet.getVolume()); playSoundPacket.setPitch(packet.getPitch()); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java index e8fcbeec1..d5ac1abba 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.translator.protocol.java.level; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundExplodePacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3i; @@ -34,10 +33,10 @@ import com.nukkitx.protocol.bedrock.data.SoundEvent; import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; import com.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket; import com.nukkitx.protocol.bedrock.packet.SetEntityMotionPacket; +import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.util.ChunkUtils; @Translator(packet = ClientboundExplodePacket.class) @@ -45,7 +44,7 @@ public class JavaExplodeTranslator extends PacketTranslator { @@ -41,19 +43,18 @@ public class JavaForgetLevelChunkTranslator extends PacketTranslator iterator = session.getSkullCache().keySet().iterator(); - while (iterator.hasNext()) { - Vector3i position = iterator.next(); + // Checks if a skull is in an unloaded chunk then removes it + List removedSkulls = new ArrayList<>(); + for (Vector3i position : session.getSkullCache().getSkulls().keySet()) { if ((position.getX() >> 4) == packet.getX() && (position.getZ() >> 4) == packet.getZ()) { - session.getSkullCache().get(position).despawnEntity(); - iterator.remove(); + removedSkulls.add(position); } } + removedSkulls.forEach(session.getSkullCache()::removeSkull); if (!session.getGeyser().getWorldManager().shouldExpectLecternHandled()) { // Do the same thing with lecterns - iterator = session.getLecternCache().iterator(); + Iterator iterator = session.getLecternCache().iterator(); while (iterator.hasNext()) { Vector3i position = iterator.next(); if ((position.getX() >> 4) == packet.getX() && (position.getZ() >> 4) == packet.getZ()) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java index 41366586d..05e14c41b 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java @@ -31,8 +31,8 @@ import com.github.steveice10.mc.protocol.data.game.level.notify.EnterCreditsValu import com.github.steveice10.mc.protocol.data.game.level.notify.RainStrengthValue; import com.github.steveice10.mc.protocol.data.game.level.notify.RespawnScreenValue; import com.github.steveice10.mc.protocol.data.game.level.notify.ThunderStrengthValue; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundGameEventPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.GameRuleData; import com.nukkitx.protocol.bedrock.data.LevelEventType; @@ -40,10 +40,10 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityEventType; import com.nukkitx.protocol.bedrock.packet.*; import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.MinecraftLocale; +import org.geysermc.geyser.translator.inventory.PlayerInventoryTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.translator.inventory.PlayerInventoryTranslator; -import org.geysermc.geyser.text.MinecraftLocale; @Translator(packet = ClientboundGameEventPacket.class) public class JavaGameEventTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java index 3855b1139..5c7b2dd95 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java @@ -35,23 +35,22 @@ import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityInfo; import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundLevelChunkWithLightPacket; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; -import com.github.steveice10.packetlib.io.NetInput; -import com.github.steveice10.packetlib.io.stream.StreamNetInput; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NBTOutputStream; import com.nukkitx.nbt.NbtMap; import com.nukkitx.nbt.NbtUtils; import com.nukkitx.network.VarInts; import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket; -import com.nukkitx.protocol.bedrock.v503.Bedrock_v503; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufOutputStream; +import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntLists; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.geysermc.geyser.entity.type.ItemFrameEntity; +import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.chunk.BlockStorage; import org.geysermc.geyser.level.chunk.GeyserChunkSection; @@ -60,7 +59,6 @@ import org.geysermc.geyser.level.chunk.bitarray.BitArrayVersion; import org.geysermc.geyser.level.chunk.bitarray.SingletonBitArray; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.translator.level.BiomeTranslator; import org.geysermc.geyser.translator.level.block.entity.BedrockOnlyBlockEntity; import org.geysermc.geyser.translator.level.block.entity.BlockEntityTranslator; @@ -70,13 +68,13 @@ import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.BlockEntityUtils; import org.geysermc.geyser.util.ChunkUtils; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.BitSet; import java.util.List; import java.util.Map; -import static org.geysermc.geyser.util.ChunkUtils.*; +import static org.geysermc.geyser.util.ChunkUtils.SERIALIZED_CHUNK_DATA; +import static org.geysermc.geyser.util.ChunkUtils.indexYZXtoXZY; @Translator(packet = ClientboundLevelChunkWithLightPacket.class) public class JavaLevelChunkWithLightTranslator extends PacketTranslator { @@ -110,9 +108,9 @@ public class JavaLevelChunkWithLightTranslator extends PacketTranslator> 4))]; try { - NetInput in = new StreamNetInput(new ByteArrayInputStream(packet.getChunkData())); + ByteBuf in = Unpooled.wrappedBuffer(packet.getChunkData()); for (int sectionY = 0; sectionY < chunkSize; sectionY++) { - ChunkSection javaSection = ChunkSection.read(in, biomeGlobalPalette); + ChunkSection javaSection = session.getCodecHelper().readChunkSection(in, biomeGlobalPalette); javaChunks[sectionY] = javaSection.getChunkData(); javaBiomes[sectionY] = javaSection.getBiomeData(); @@ -275,7 +273,7 @@ public class JavaLevelChunkWithLightTranslator extends PacketTranslator= Bedrock_v503.V503_CODEC.getProtocolVersion(); - int biomeCount = isNewVersion ? bedrockDimension.height() >> 4 : 25; + // As of 1.18.30, the amount of biomes read is dependent on how high Bedrock thinks the dimension is + int biomeCount = bedrockDimension.height() >> 4; int dimensionOffset = bedrockDimension.minY() >> 4; for (int i = 0; i < biomeCount; i++) { int biomeYOffset = dimensionOffset + i; @@ -326,13 +322,8 @@ public class JavaLevelChunkWithLightTranslator extends PacketTranslator= (chunkSize + yOffset)) { // This biome section goes above the height of the Java world - if (isNewVersion) { - // A header that says to carry on the biome data from the previous chunk - // This notably fixes biomes in the End - byteBuf.writeByte((127 << 1) | 1); - } else { - byteBuf.writeBytes(ChunkUtils.EMPTY_BIOME_DATA); - } + // The byte written here is a header that says to carry on the biome data from the previous chunk + byteBuf.writeByte((127 << 1) | 1); continue; } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java index 517aa683f..b9fccc80a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java @@ -25,14 +25,15 @@ package org.geysermc.geyser.translator.protocol.java.level; +import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; import com.github.steveice10.mc.protocol.data.game.level.event.*; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundLevelEventPacket; import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.math.vector.Vector3i; +import com.nukkitx.nbt.NbtMap; import com.nukkitx.protocol.bedrock.data.LevelEventType; import com.nukkitx.protocol.bedrock.data.SoundEvent; -import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; -import com.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket; -import com.nukkitx.protocol.bedrock.packet.TextPacket; +import com.nukkitx.protocol.bedrock.packet.*; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.session.GeyserSession; @@ -43,6 +44,7 @@ import org.geysermc.geyser.translator.protocol.Translator; import java.util.Collections; import java.util.Locale; +import java.util.Set; @Translator(packet = ClientboundLevelEventPacket.class) public class JavaLevelEventTranslator extends PacketTranslator { @@ -50,10 +52,11 @@ public class JavaLevelEventTranslator extends PacketTranslator { + effectPacket.setType(LevelEventType.PARTICLE_CROP_GROWTH); + + ComposterEventData composterEventData = (ComposterEventData) packet.getData(); + LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); + switch (composterEventData) { + case FILL -> soundEventPacket.setSound(SoundEvent.COMPOSTER_FILL); + case FILL_SUCCESS -> soundEventPacket.setSound(SoundEvent.COMPOSTER_FILL_LAYER); + } + soundEventPacket.setPosition(pos); + soundEventPacket.setIdentifier(""); + soundEventPacket.setExtraData(-1); + soundEventPacket.setBabySound(false); + soundEventPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundEventPacket); } - GeyserImpl.getInstance().getLogger().debug("Unhandled sound event: " + soundEvent.name()); - } else if (packet.getEvent() instanceof ParticleEvent particleEvent) { - Vector3f pos = Vector3f.from(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()).add(0.5f, 0.5f, 0.5f); + case BLOCK_LAVA_EXTINGUISH -> { + effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE); + effectPacket.setPosition(pos.add(-0.5f, 0.7f, -0.5f)); - LevelEventPacket effectPacket = new LevelEventPacket(); - effectPacket.setPosition(pos); - effectPacket.setData(0); - switch (particleEvent) { - case COMPOSTER -> { - effectPacket.setType(LevelEventType.PARTICLE_CROP_GROWTH); + LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); + soundEventPacket.setSound(SoundEvent.EXTINGUISH_FIRE); + soundEventPacket.setPosition(pos); + soundEventPacket.setIdentifier(""); + soundEventPacket.setExtraData(-1); + soundEventPacket.setBabySound(false); + soundEventPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundEventPacket); + } + case BLOCK_REDSTONE_TORCH_BURNOUT -> { + effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE); + effectPacket.setPosition(pos.add(-0.5f, 0, -0.5f)); - ComposterEventData composterEventData = (ComposterEventData) packet.getData(); - LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); - switch (composterEventData) { - case FILL -> soundEventPacket.setSound(SoundEvent.COMPOSTER_FILL); - case FILL_SUCCESS -> soundEventPacket.setSound(SoundEvent.COMPOSTER_FILL_LAYER); + LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); + soundEventPacket.setSound(SoundEvent.EXTINGUISH_FIRE); + soundEventPacket.setPosition(pos); + soundEventPacket.setIdentifier(""); + soundEventPacket.setExtraData(-1); + soundEventPacket.setBabySound(false); + soundEventPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundEventPacket); + } + case BLOCK_END_PORTAL_FRAME_FILL -> { + effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE); + effectPacket.setPosition(pos.add(-0.5f, 0.3125f, -0.5f)); + + LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); + soundEventPacket.setSound(SoundEvent.BLOCK_END_PORTAL_FRAME_FILL); + soundEventPacket.setPosition(pos); + soundEventPacket.setIdentifier(""); + soundEventPacket.setExtraData(-1); + soundEventPacket.setBabySound(false); + soundEventPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundEventPacket); + } + case SMOKE -> { + effectPacket.setType(LevelEventType.PARTICLE_SHOOT); + + SmokeEventData smokeEventData = (SmokeEventData) packet.getData(); + int data = 0; + switch (smokeEventData) { + case DOWN -> { + data = 4; + pos = pos.add(0, -0.9f, 0); } - soundEventPacket.setPosition(pos); - soundEventPacket.setIdentifier(""); - soundEventPacket.setExtraData(-1); - soundEventPacket.setBabySound(false); - soundEventPacket.setRelativeVolumeDisabled(false); - session.sendUpstreamPacket(soundEventPacket); - } - case BLOCK_LAVA_EXTINGUISH -> { - effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE); - effectPacket.setPosition(pos.add(-0.5f, 0.7f, -0.5f)); - - LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); - soundEventPacket.setSound(SoundEvent.EXTINGUISH_FIRE); - soundEventPacket.setPosition(pos); - soundEventPacket.setIdentifier(""); - soundEventPacket.setExtraData(-1); - soundEventPacket.setBabySound(false); - soundEventPacket.setRelativeVolumeDisabled(false); - session.sendUpstreamPacket(soundEventPacket); - } - case BLOCK_REDSTONE_TORCH_BURNOUT -> { - effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE); - effectPacket.setPosition(pos.add(-0.5f, 0, -0.5f)); - - LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); - soundEventPacket.setSound(SoundEvent.EXTINGUISH_FIRE); - soundEventPacket.setPosition(pos); - soundEventPacket.setIdentifier(""); - soundEventPacket.setExtraData(-1); - soundEventPacket.setBabySound(false); - soundEventPacket.setRelativeVolumeDisabled(false); - session.sendUpstreamPacket(soundEventPacket); - } - case BLOCK_END_PORTAL_FRAME_FILL -> { - effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE); - effectPacket.setPosition(pos.add(-0.5f, 0.3125f, -0.5f)); - - LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); - soundEventPacket.setSound(SoundEvent.BLOCK_END_PORTAL_FRAME_FILL); - soundEventPacket.setPosition(pos); - soundEventPacket.setIdentifier(""); - soundEventPacket.setExtraData(-1); - soundEventPacket.setBabySound(false); - soundEventPacket.setRelativeVolumeDisabled(false); - session.sendUpstreamPacket(soundEventPacket); - } - case SMOKE -> { - effectPacket.setType(LevelEventType.PARTICLE_SHOOT); - - SmokeEventData smokeEventData = (SmokeEventData) packet.getData(); - int data = 0; - switch (smokeEventData) { - case DOWN -> { - data = 4; - pos = pos.add(0, -0.9f, 0); - } - case UP -> { - data = 4; - pos = pos.add(0, 0.5f, 0); - } - case NORTH -> { - data = 1; - pos = pos.add(0, -0.2f, -0.7f); - } - case SOUTH -> { - data = 7; - pos = pos.add(0, -0.2f, 0.7f); - } - case WEST -> { - data = 3; - pos = pos.add(-0.7f, -0.2f, 0); - } - case EAST -> { - data = 5; - pos = pos.add(0.7f, -0.2f, 0); - } + case UP -> { + data = 4; + pos = pos.add(0, 0.5f, 0); } - effectPacket.setPosition(pos); - effectPacket.setData(data); - } - - //TODO: Block break particles when under fire - case BREAK_BLOCK -> { - effectPacket.setType(LevelEventType.PARTICLE_DESTROY_BLOCK); - - BreakBlockEventData breakBlockEventData = (BreakBlockEventData) packet.getData(); - effectPacket.setData(session.getBlockMappings().getBedrockBlockId(breakBlockEventData.getBlockState())); - } - case BREAK_SPLASH_POTION -> { - effectPacket.setType(LevelEventType.PARTICLE_POTION_SPLASH); - effectPacket.setPosition(pos.add(0, -0.5f, 0)); - - BreakPotionEventData splashPotionData = (BreakPotionEventData) packet.getData(); - effectPacket.setData(splashPotionData.getPotionId()); - - LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); - soundEventPacket.setSound(SoundEvent.GLASS); - soundEventPacket.setPosition(pos); - soundEventPacket.setIdentifier(""); - soundEventPacket.setExtraData(-1); - soundEventPacket.setBabySound(false); - soundEventPacket.setRelativeVolumeDisabled(false); - session.sendUpstreamPacket(soundEventPacket); - } - case BREAK_EYE_OF_ENDER -> effectPacket.setType(LevelEventType.PARTICLE_EYE_OF_ENDER_DEATH); - case MOB_SPAWN -> effectPacket.setType(LevelEventType.PARTICLE_MOB_BLOCK_SPAWN); // TODO: Check, but I don't think I really verified this ever went into effect on Java - case BONEMEAL_GROW_WITH_SOUND, BONEMEAL_GROW -> { - effectPacket.setType(particleEvent == ParticleEvent.BONEMEAL_GROW ? LevelEventType.PARTICLE_TURTLE_EGG : LevelEventType.PARTICLE_CROP_GROWTH); - - BonemealGrowEventData growEventData = (BonemealGrowEventData) packet.getData(); - effectPacket.setData(growEventData.getParticleCount()); - } - case ENDERDRAGON_FIREBALL_EXPLODE -> { - effectPacket.setType(LevelEventType.PARTICLE_EYE_OF_ENDER_DEATH); // TODO - - DragonFireballEventData fireballEventData = (DragonFireballEventData) packet.getData(); - if (fireballEventData == DragonFireballEventData.HAS_SOUND) { - LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); - soundEventPacket.setSound(SoundEvent.EXPLODE); - soundEventPacket.setPosition(pos); - soundEventPacket.setIdentifier(""); - soundEventPacket.setExtraData(-1); - soundEventPacket.setBabySound(false); - soundEventPacket.setRelativeVolumeDisabled(false); - session.sendUpstreamPacket(soundEventPacket); + case NORTH -> { + data = 1; + pos = pos.add(0, -0.2f, -0.7f); + } + case SOUTH -> { + data = 7; + pos = pos.add(0, -0.2f, 0.7f); + } + case WEST -> { + data = 3; + pos = pos.add(-0.7f, -0.2f, 0); + } + case EAST -> { + data = 5; + pos = pos.add(0.7f, -0.2f, 0); } } - case EXPLOSION -> { - effectPacket.setType(LevelEventType.PARTICLE_GENERIC_SPAWN); - effectPacket.setData(61); - } - case EVAPORATE -> { - effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE_WATER); - effectPacket.setPosition(pos.add(-0.5f, 0.5f, -0.5f)); - } - case END_GATEWAY_SPAWN -> { - effectPacket.setType(LevelEventType.PARTICLE_EXPLOSION); + effectPacket.setPosition(pos); + effectPacket.setData(data); + } + //TODO: Block break particles when under fire + case BREAK_BLOCK -> { + effectPacket.setType(LevelEventType.PARTICLE_DESTROY_BLOCK); + + BreakBlockEventData breakBlockEventData = (BreakBlockEventData) packet.getData(); + effectPacket.setData(session.getBlockMappings().getBedrockBlockId(breakBlockEventData.getBlockState())); + } + case BREAK_SPLASH_POTION, BREAK_SPLASH_POTION2 -> { + effectPacket.setType(LevelEventType.PARTICLE_POTION_SPLASH); + effectPacket.setPosition(pos.add(0, -0.5f, 0)); + + BreakPotionEventData splashPotionData = (BreakPotionEventData) packet.getData(); + effectPacket.setData(splashPotionData.getPotionId()); + + LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); + soundEventPacket.setSound(SoundEvent.GLASS); + soundEventPacket.setPosition(pos); + soundEventPacket.setIdentifier(""); + soundEventPacket.setExtraData(-1); + soundEventPacket.setBabySound(false); + soundEventPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundEventPacket); + } + case BREAK_EYE_OF_ENDER -> effectPacket.setType(LevelEventType.PARTICLE_EYE_OF_ENDER_DEATH); + case MOB_SPAWN -> effectPacket.setType(LevelEventType.PARTICLE_MOB_BLOCK_SPAWN); // TODO: Check, but I don't think I really verified this ever went into effect on Java + case BONEMEAL_GROW_WITH_SOUND, BONEMEAL_GROW -> { + effectPacket.setType(packet.getEvent() == LevelEvent.BONEMEAL_GROW ? LevelEventType.PARTICLE_TURTLE_EGG : LevelEventType.PARTICLE_CROP_GROWTH); + + BonemealGrowEventData growEventData = (BonemealGrowEventData) packet.getData(); + effectPacket.setData(growEventData.getParticleCount()); + } + case ENDERDRAGON_FIREBALL_EXPLODE -> { + effectPacket.setType(LevelEventType.PARTICLE_EYE_OF_ENDER_DEATH); // TODO + + DragonFireballEventData fireballEventData = (DragonFireballEventData) packet.getData(); + if (fireballEventData == DragonFireballEventData.HAS_SOUND) { LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); soundEventPacket.setSound(SoundEvent.EXPLODE); soundEventPacket.setPosition(pos); @@ -250,17 +232,110 @@ public class JavaLevelEventTranslator extends PacketTranslator effectPacket.setType(LevelEventType.PARTICLE_DRIPSTONE_DRIP); - case ELECTRIC_SPARK -> effectPacket.setType(LevelEventType.PARTICLE_ELECTRIC_SPARK); // Matches with a Bedrock server but doesn't seem to match up with Java - case WAX_ON -> effectPacket.setType(LevelEventType.PARTICLE_WAX_ON); - case WAX_OFF -> effectPacket.setType(LevelEventType.PARTICLE_WAX_OFF); - case SCRAPE -> effectPacket.setType(LevelEventType.PARTICLE_SCRAPE); - default -> { - GeyserImpl.getInstance().getLogger().debug("Unhandled particle event: " + particleEvent.name()); - return; - } } - session.sendUpstreamPacket(effectPacket); + case EXPLOSION -> { + effectPacket.setType(LevelEventType.PARTICLE_GENERIC_SPAWN); + effectPacket.setData(61); + } + case EVAPORATE -> { + effectPacket.setType(LevelEventType.PARTICLE_EVAPORATE_WATER); + effectPacket.setPosition(pos.add(-0.5f, 0.5f, -0.5f)); + } + case END_GATEWAY_SPAWN -> { + effectPacket.setType(LevelEventType.PARTICLE_EXPLOSION); + + LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); + soundEventPacket.setSound(SoundEvent.EXPLODE); + soundEventPacket.setPosition(pos); + soundEventPacket.setIdentifier(""); + soundEventPacket.setExtraData(-1); + soundEventPacket.setBabySound(false); + soundEventPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundEventPacket); + } + case DRIPSTONE_DRIP -> effectPacket.setType(LevelEventType.PARTICLE_DRIPSTONE_DRIP); + case ELECTRIC_SPARK -> effectPacket.setType(LevelEventType.PARTICLE_ELECTRIC_SPARK); // Matches with a Bedrock server but doesn't seem to match up with Java + case WAX_ON -> effectPacket.setType(LevelEventType.PARTICLE_WAX_ON); + case WAX_OFF -> effectPacket.setType(LevelEventType.PARTICLE_WAX_OFF); + case SCRAPE -> effectPacket.setType(LevelEventType.PARTICLE_SCRAPE); + case SCULK_BLOCK_CHARGE -> { + SculkBlockChargeEventData eventData = (SculkBlockChargeEventData) packet.getData(); + LevelEventGenericPacket levelEventPacket = new LevelEventGenericPacket(); + // TODO add SCULK_BLOCK_CHARGE sound + if (eventData.getCharge() > 0) { + levelEventPacket.setEventId(2037); + levelEventPacket.setTag( + NbtMap.builder() + .putInt("x", packet.getPosition().getX()) + .putInt("y", packet.getPosition().getY()) + .putInt("z", packet.getPosition().getZ()) + .putShort("charge", (short) eventData.getCharge()) + .putShort("facing", encodeFacing(eventData.getBlockFaces())) // TODO check if this is actually correct + .build() + ); + } else { + levelEventPacket.setEventId(2038); + levelEventPacket.setTag( + NbtMap.builder() + .putInt("x", packet.getPosition().getX()) + .putInt("y", packet.getPosition().getY()) + .putInt("z", packet.getPosition().getZ()) + .build() + ); + } + session.sendUpstreamPacket(levelEventPacket); + return; + } + case SCULK_SHRIEKER_SHRIEK -> { + LevelEventGenericPacket levelEventPacket = new LevelEventGenericPacket(); + levelEventPacket.setEventId(2035); + levelEventPacket.setTag( + NbtMap.builder() + .putInt("originX", packet.getPosition().getX()) + .putInt("originY", packet.getPosition().getY()) + .putInt("originZ", packet.getPosition().getZ()) + .build() + ); + session.sendUpstreamPacket(levelEventPacket); + + LevelSoundEventPacket soundEventPacket = new LevelSoundEventPacket(); + soundEventPacket.setSound(SoundEvent.SCULK_SHRIEKER_SHRIEK); + soundEventPacket.setPosition(packet.getPosition().toFloat()); + soundEventPacket.setExtraData(-1); + soundEventPacket.setIdentifier(""); + soundEventPacket.setBabySound(false); + soundEventPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundEventPacket); + return; + } + default -> { + GeyserImpl.getInstance().getLogger().debug("Unhandled level event: " + packet.getEvent()); + return; + } } + session.sendUpstreamPacket(effectPacket); + } + + private short encodeFacing(Set blockFaces) { + short facing = 0; + if (blockFaces.contains(Direction.DOWN)) { + facing |= 1; + } + if (blockFaces.contains(Direction.UP)) { + facing |= 1 << 1; + } + if (blockFaces.contains(Direction.SOUTH)) { + facing |= 1 << 2; + } + if (blockFaces.contains(Direction.WEST)) { + facing |= 1 << 3; + } + if (blockFaces.contains(Direction.NORTH)) { + facing |= 1 << 4; + } + if (blockFaces.contains(Direction.EAST)) { + facing |= 1 << 5; + } + return facing; } } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java index 4da91fcd6..c77caadee 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java @@ -27,21 +27,27 @@ package org.geysermc.geyser.translator.protocol.java.level; import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.level.particle.*; +import com.github.steveice10.mc.protocol.data.game.level.particle.positionsource.BlockPositionSource; +import com.github.steveice10.mc.protocol.data.game.level.particle.positionsource.EntityPositionSource; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundLevelParticlesPacket; import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.nbt.NbtMap; import com.nukkitx.protocol.bedrock.BedrockPacket; import com.nukkitx.protocol.bedrock.data.LevelEventType; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; +import com.nukkitx.protocol.bedrock.packet.LevelEventGenericPacket; import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; import com.nukkitx.protocol.bedrock.packet.SpawnParticleEffectPacket; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.protocol.PacketTranslator; -import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.translator.inventory.item.ItemTranslator; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ParticleMapping; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.item.ItemTranslator; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.DimensionUtils; +import java.util.Optional; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import java.util.function.Function; @@ -130,6 +136,39 @@ public class JavaLevelParticlesTranslator extends PacketTranslator { + VibrationParticleData data = (VibrationParticleData) particle.getData(); + + Vector3f target; + if (data.getPositionSource() instanceof BlockPositionSource blockPositionSource) { + target = blockPositionSource.getPosition().toFloat().add(0.5f, 0.5f, 0.5f); + } else if (data.getPositionSource() instanceof EntityPositionSource entityPositionSource) { + Entity entity = session.getEntityCache().getEntityByJavaId(entityPositionSource.getEntityId()); + if (entity != null) { + target = entity.getPosition().up(entityPositionSource.getYOffset()); + } else { + session.getGeyser().getLogger().debug("Unable to find entity with Java Id: " + entityPositionSource.getEntityId() + " for vibration particle."); + return null; + } + } else { + session.getGeyser().getLogger().debug("Unknown position source " + data.getPositionSource() + " for vibration particle."); + return null; + } + + return (position) -> { + LevelEventGenericPacket packet = new LevelEventGenericPacket(); + packet.setEventId(2027); + packet.setTag( + NbtMap.builder() + .putCompound("origin", buildVec3PositionTag(position)) + .putCompound("target", buildVec3PositionTag(target)) // There is a way to target an entity but that takes an attachPos instead of a y offset + .putFloat("speed", 20f) + .putFloat("timeToLive", data.getArrivalTicks() / 20f) + .build() + ); + return packet; + }; + } default -> { ParticleMapping particleMapping = Registries.PARTICLES.get(particle.getType()); if (particleMapping == null) { //TODO ensure no particle can be null @@ -150,6 +189,7 @@ public class JavaLevelParticlesTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetChunkCacheCenterTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetChunkCacheCenterTranslator.java index 7b7223316..13e8cd62b 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetChunkCacheCenterTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetChunkCacheCenterTranslator.java @@ -26,11 +26,11 @@ package org.geysermc.geyser.translator.protocol.java.level; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundSetChunkCacheCenterPacket; +import com.nukkitx.math.vector.Vector3i; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.ChunkUtils; -import com.nukkitx.math.vector.Vector3i; @Translator(packet = ClientboundSetChunkCacheCenterPacket.class) public class JavaSetChunkCacheCenterTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java index 079fdc37e..09335b790 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.translator.protocol.java.level; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundSetDefaultSpawnPositionPacket; -import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.packet.SetSpawnPositionPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; @@ -39,8 +38,7 @@ public class JavaSetDefaultSpawnPositionTranslator extends PacketTranslator { @Override public void translate(GeyserSession session, ClientboundSoundPacket packet) { - String packetSound = packet.getSound().getName(); - - SoundMapping soundMapping = Registries.SOUNDS.get(packetSound); - if (soundMapping == null) { - session.getGeyser().getLogger().debug("[Builtin] Sound mapping " + packetSound + " not found - " + packet.toString()); - return; - } - - if (soundMapping.isLevelEvent()) { - LevelEventPacket levelEventPacket = new LevelEventPacket(); - levelEventPacket.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ())); - levelEventPacket.setData(0); - levelEventPacket.setType(LevelEventType.valueOf(soundMapping.getBedrock())); - session.sendUpstreamPacket(levelEventPacket); - return; - } - LevelSoundEventPacket soundPacket = new LevelSoundEventPacket(); - SoundEvent sound = SoundUtils.toSoundEvent(soundMapping.getBedrock()); - if (sound == null) { - sound = SoundUtils.toSoundEvent(soundMapping.getBedrock()); - } - if (sound == null) { - sound = SoundUtils.toSoundEvent(packetSound); - } - if (sound == null) { - session.getGeyser().getLogger().debug("[Builtin] Sound for original " + packetSound + " to mappings " + soundPacket - + " was not a playable level sound, or has yet to be mapped to an enum in " - + "NukkitX SoundEvent "); - return; - } - - soundPacket.setSound(sound); - soundPacket.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ())); - soundPacket.setIdentifier(soundMapping.getIdentifier()); - if (sound == SoundEvent.NOTE) { - // Minecraft Wiki: 2^(x/12) = Java pitch where x is -12 to 12 - // Java sends the note value as above starting with -12 and ending at 12 - // Bedrock has a number for each type of note, then proceeds up the scale by adding to that number - soundPacket.setExtraData(soundMapping.getExtraData() + (int)(Math.round((Math.log10(packet.getPitch()) / Math.log10(2)) * 12)) + 12); - } else if (sound == SoundEvent.PLACE && soundMapping.getExtraData() == -1) { - if (!soundMapping.getIdentifier().equals(":")) { - soundPacket.setExtraData(session.getBlockMappings().getBedrockBlockId( - BlockRegistries.JAVA_IDENTIFIERS.getOrDefault(soundMapping.getIdentifier(), BlockStateValues.JAVA_AIR_ID))); - } else { - session.getGeyser().getLogger().debug("PLACE sound mapping identifier was invalid! Please report: " + packet.toString()); - } - soundPacket.setIdentifier(":"); - } else { - soundPacket.setExtraData(soundMapping.getExtraData()); - } - - - soundPacket.setBabySound(false); // might need to adjust this in the future - soundPacket.setRelativeVolumeDisabled(false); - session.sendUpstreamPacket(soundPacket); + Vector3f position = Vector3f.from(packet.getX(), packet.getY(), packet.getZ()); + SoundUtils.playBuiltinSound(session, packet.getSound(), position, packet.getVolume(), packet.getPitch()); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaStopSoundTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaStopSoundTranslator.java index d9750ad7e..e5bc7999f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaStopSoundTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaStopSoundTranslator.java @@ -25,15 +25,12 @@ package org.geysermc.geyser.translator.protocol.java.level; -import com.github.steveice10.mc.protocol.data.game.level.sound.BuiltinSound; -import com.github.steveice10.mc.protocol.data.game.level.sound.CustomSound; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundStopSoundPacket; import com.nukkitx.protocol.bedrock.packet.StopSoundPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.registry.Registries; -import org.geysermc.geyser.registry.type.SoundMapping; +import org.geysermc.geyser.util.SoundUtils; @Translator(packet = ClientboundStopSoundPacket.class) public class JavaStopSoundTranslator extends PacketTranslator { @@ -49,36 +46,11 @@ public class JavaStopSoundTranslator extends PacketTranslator " - + soundMapping + (soundMapping == null ? "[not found]" : "") - + " - " + packet.toString()); - String playsound; - if (soundMapping == null || soundMapping.getPlaysound() == null) { - // no mapping - session.getGeyser().getLogger() - .debug("[StopSound] Defaulting to sound server gave us."); - playsound = packetSound; - } else { - playsound = soundMapping.getPlaysound(); - } - StopSoundPacket stopSoundPacket = new StopSoundPacket(); - stopSoundPacket.setSoundName(playsound); - // packet not mapped in the library + stopSoundPacket.setSoundName(SoundUtils.translatePlaySound(packet.getSound())); stopSoundPacket.setStoppingAllSound(false); session.sendUpstreamPacket(stopSoundPacket); - session.getGeyser().getLogger().debug("[StopSound] Packet sent - " + packet.toString() + " --> " + stopSoundPacket); + session.getGeyser().getLogger().debug("[StopSound] Stopped " + packet.getSound() + " -> " + stopSoundPacket.getSoundName()); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetDisplayObjectiveTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetDisplayObjectiveTranslator.java index b34e54db6..74f063e44 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetDisplayObjectiveTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetDisplayObjectiveTranslator.java @@ -26,12 +26,12 @@ package org.geysermc.geyser.translator.protocol.java.scoreboard; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.scoreboard.ClientboundSetDisplayObjectivePacket; +import org.geysermc.geyser.scoreboard.Scoreboard; +import org.geysermc.geyser.scoreboard.ScoreboardUpdater; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.WorldCache; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.scoreboard.Scoreboard; -import org.geysermc.geyser.scoreboard.ScoreboardUpdater; @Translator(packet = ClientboundSetDisplayObjectivePacket.class) public class JavaSetDisplayObjectiveTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java index 33da27a88..3b009a2a5 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java @@ -31,15 +31,15 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.scoreboard.Cl import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.entity.type.player.PlayerEntity; +import org.geysermc.geyser.scoreboard.Objective; +import org.geysermc.geyser.scoreboard.Scoreboard; +import org.geysermc.geyser.scoreboard.ScoreboardUpdater; +import org.geysermc.geyser.scoreboard.UpdateType; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.WorldCache; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.translator.text.MessageTranslator; -import org.geysermc.geyser.scoreboard.Objective; -import org.geysermc.geyser.scoreboard.Scoreboard; -import org.geysermc.geyser.scoreboard.ScoreboardUpdater; -import org.geysermc.geyser.scoreboard.UpdateType; @Translator(packet = ClientboundSetObjectivePacket.class) public class JavaSetObjectiveTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetPlayerTeamTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetPlayerTeamTranslator.java index 8cc08871d..f942b6f09 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetPlayerTeamTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetPlayerTeamTranslator.java @@ -31,14 +31,14 @@ import com.github.steveice10.mc.protocol.data.game.scoreboard.TeamColor; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.scoreboard.ClientboundSetPlayerTeamPacket; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.protocol.PacketTranslator; -import org.geysermc.geyser.translator.protocol.Translator; -import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.scoreboard.Scoreboard; import org.geysermc.geyser.scoreboard.ScoreboardUpdater; import org.geysermc.geyser.scoreboard.Team; import org.geysermc.geyser.scoreboard.UpdateType; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.geyser.translator.text.MessageTranslator; import java.util.Arrays; import java.util.Set; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java index 41e9a38a2..41b978a86 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java @@ -33,14 +33,14 @@ import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.entity.type.player.PlayerEntity; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.cache.WorldCache; -import org.geysermc.geyser.translator.protocol.PacketTranslator; -import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.scoreboard.Objective; import org.geysermc.geyser.scoreboard.Scoreboard; import org.geysermc.geyser.scoreboard.ScoreboardUpdater; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.WorldCache; import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; @Translator(packet = ClientboundSetScorePacket.class) public class JavaSetScoreTranslator extends PacketTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/BlockSoundInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/BlockSoundInteractionTranslator.java index 14f708153..ff21be3e8 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/BlockSoundInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/BlockSoundInteractionTranslator.java @@ -32,8 +32,8 @@ import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.nukkitx.math.vector.Vector3f; import org.geysermc.geyser.inventory.GeyserItemStack; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockUtils; import java.util.Map; diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/SoundInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/SoundInteractionTranslator.java index 536d5e188..9cb6e40d2 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/SoundInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/SoundInteractionTranslator.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.translator.sound; import com.nukkitx.math.vector.Vector3f; - import org.geysermc.geyser.session.GeyserSession; /** diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/block/GrassPathInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/block/GrassPathInteractionTranslator.java index 98f460dd7..aff4b5562 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/block/GrassPathInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/block/GrassPathInteractionTranslator.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.translator.sound.block; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.SoundEvent; import com.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket; +import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator; import org.geysermc.geyser.translator.sound.SoundTranslator; -import org.geysermc.geyser.registry.BlockRegistries; @SoundTranslator(blocks = "grass_path", items = "shovel", ignoreSneakingWhileHolding = true) public class GrassPathInteractionTranslator implements BlockSoundInteractionTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/block/HoeInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/block/HoeInteractionTranslator.java index 0e1aae95c..7d81e5fb0 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/block/HoeInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/block/HoeInteractionTranslator.java @@ -28,10 +28,10 @@ package org.geysermc.geyser.translator.sound.block; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.SoundEvent; import com.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket; +import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator; import org.geysermc.geyser.translator.sound.SoundTranslator; -import org.geysermc.geyser.registry.BlockRegistries; @SoundTranslator(blocks = "farmland", items = "hoe", ignoreSneakingWhileHolding = true) public class HoeInteractionTranslator implements BlockSoundInteractionTranslator { diff --git a/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java b/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java index ff283d08f..af059cbdd 100644 --- a/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.util; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NbtMap; @@ -84,10 +83,6 @@ public class BlockEntityUtils { return Registries.BLOCK_ENTITIES.get(type); } - public static void updateBlockEntity(GeyserSession session, @Nonnull NbtMap blockEntity, Position position) { - updateBlockEntity(session, blockEntity, Vector3i.from(position.getX(), position.getY(), position.getZ())); - } - public static void updateBlockEntity(GeyserSession session, @Nonnull NbtMap blockEntity, Vector3i position) { BlockEntityDataPacket blockEntityPacket = new BlockEntityDataPacket(); blockEntityPacket.setBlockPosition(position); diff --git a/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java b/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java index 0b63f3c88..7059c9a8b 100644 --- a/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java @@ -25,23 +25,18 @@ package org.geysermc.geyser.util; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.nukkitx.math.vector.Vector3i; import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.PlayerInventory; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.translator.collision.BlockCollision; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.BlockMapping; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.collision.BlockCollision; -public class BlockUtils { - /** - * A static constant of {@link Position} with all values being zero. - */ - public static final Position POSITION_ZERO = new Position(0, 0, 0); +public final class BlockUtils { private static boolean correctTool(GeyserSession session, BlockMapping blockMapping, String itemToolType) { switch (itemToolType) { @@ -241,4 +236,7 @@ public class BlockUtils { public static BlockCollision getCollisionAt(GeyserSession session, int x, int y, int z) { return getCollision(session.getGeyser().getWorldManager().getBlockAt(session, x, y, z)); } + + private BlockUtils() { + } } diff --git a/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java b/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java index 445ffb882..d1ee9f165 100644 --- a/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java @@ -25,9 +25,6 @@ package org.geysermc.geyser.util; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; -import com.github.steveice10.opennbt.tag.builtin.CompoundTag; -import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.nukkitx.math.vector.Vector2i; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket; @@ -38,7 +35,8 @@ import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntLists; import lombok.experimental.UtilityClass; import org.geysermc.geyser.entity.type.ItemFrameEntity; -import org.geysermc.geyser.entity.type.player.SkullPlayerEntity; +import org.geysermc.geyser.level.BedrockDimension; +import org.geysermc.geyser.level.JavaDimension; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.chunk.BlockStorage; import org.geysermc.geyser.level.chunk.GeyserChunkSection; @@ -46,7 +44,6 @@ import org.geysermc.geyser.level.chunk.bitarray.SingletonBitArray; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.translator.level.block.entity.BedrockOnlyBlockEntity; import static org.geysermc.geyser.level.block.BlockStateValues.JAVA_AIR_ID; @@ -119,19 +116,7 @@ public class ChunkUtils { } /** - * Sends a block update to the Bedrock client. If chunk caching is enabled and the platform is not Spigot, this also - * adds that block to the cache. - * @param session the Bedrock session to send/register the block to - * @param blockState the Java block state of the block - * @param position the position of the block - */ - public static void updateBlock(GeyserSession session, int blockState, Position position) { - Vector3i pos = Vector3i.from(position.getX(), position.getY(), position.getZ()); - updateBlock(session, blockState, pos); - } - - /** - * Sends a block update to the Bedrock client. If chunk caching is enabled and the platform is not Spigot, this also + * Sends a block update to the Bedrock client. If the platform is not Spigot, this also * adds that block to the cache. * @param session the Bedrock session to send/register the block to * @param blockState the Java block state of the block @@ -150,10 +135,9 @@ public class ChunkUtils { // Otherwise, let's still store our reference to the item frame, but let the new block take precedence for now } - SkullPlayerEntity skull = session.getSkullCache().get(position); - if (skull != null && blockState != skull.getBlockState()) { + if (BlockStateValues.getSkullVariant(blockState) == -1) { // Skull is gone - skull.despawnEntity(position); + session.getSkullCache().removeSkull(position); } // Prevent moving_piston from being placed @@ -227,10 +211,10 @@ public class ChunkUtils { * Process the minimum and maximum heights for this dimension, and processes the world coordinate scale. * This must be done after the player has switched dimensions so we know what their dimension is */ - public static void loadDimensionTag(GeyserSession session, CompoundTag dimensionTag) { - int minY = ((IntTag) dimensionTag.get("min_y")).getValue(); - int maxY = ((IntTag) dimensionTag.get("height")).getValue(); - // Logical height can be ignored probably - seems to be for artificial limits like the Nether. + public static void loadDimension(GeyserSession session) { + JavaDimension dimension = session.getDimensionType(); + int minY = dimension.minY(); + int maxY = dimension.maxY(); if (minY % 16 != 0) { throw new RuntimeException("Minimum Y must be a multiple of 16!"); @@ -259,11 +243,6 @@ public class ChunkUtils { session.getChunkCache().setMinY(minY); session.getChunkCache().setHeightY(maxY); - // Load world coordinate scale for the world border - double coordinateScale = ((Number) dimensionTag.get("coordinate_scale").getValue()).doubleValue(); - session.getWorldBorder().setWorldCoordinateScale(coordinateScale); - - // Set if piglins/hoglins should shake - session.setDimensionPiglinSafe(((Number) dimensionTag.get("piglin_safe").getValue()).byteValue() != (byte) 0); + session.getWorldBorder().setWorldCoordinateScale(dimension.worldCoordinateScale()); } } diff --git a/core/src/main/java/org/geysermc/geyser/util/CpuUtils.java b/core/src/main/java/org/geysermc/geyser/util/CpuUtils.java new file mode 100644 index 000000000..622722e5a --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/util/CpuUtils.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.util; + +import java.io.File; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.regex.Pattern; + +public final class CpuUtils { + + public static String tryGetProcessorName() { + try { + if (new File("/proc/cpuinfo").canRead()) { + return getLinuxProcessorName(); + } else { + return getWindowsProcessorName(); + } + } catch (Exception e) { + return e.getMessage(); + } + } + + /** + * Much of the code here was copied from the OSHI project. This is simply stripped down to only get the CPU model. + * https://github.com/oshi/oshi/ + */ + private static String getLinuxProcessorName() throws Exception { + List lines = Files.readAllLines(Paths.get("/proc/cpuinfo"), StandardCharsets.UTF_8); + Pattern whitespaceColonWhitespace = Pattern.compile("\\s+:\\s"); // From ParseUtil + for (String line : lines) { + String[] splitLine = whitespaceColonWhitespace.split(line); + if ("model name".equals(splitLine[0]) || "Processor".equals(splitLine[0])) { + return splitLine[1]; + } + } + return "unknown"; + } + + /** + * https://stackoverflow.com/a/6327663 + */ + private static String getWindowsProcessorName() throws Exception { + final String cpuNameCmd = "reg query \"HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\" /v ProcessorNameString"; + final String regstrToken = "REG_SZ"; + + Process process = Runtime.getRuntime().exec(cpuNameCmd); + process.waitFor(); + InputStream is = process.getInputStream(); + + StringBuilder sb = new StringBuilder(); + while (is.available() != 0) { + sb.append((char) is.read()); + } + + String result = sb.toString(); + int p = result.indexOf(regstrToken); + + if (p == -1) { + return null; + } + + return result.substring(p + regstrToken.length()).trim(); + } + + private CpuUtils() { + } +} diff --git a/core/src/main/java/org/geysermc/geyser/util/DimensionUtils.java b/core/src/main/java/org/geysermc/geyser/util/DimensionUtils.java index f1aca63e8..fbc891131 100644 --- a/core/src/main/java/org/geysermc/geyser/util/DimensionUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/DimensionUtils.java @@ -26,13 +26,10 @@ package org.geysermc.geyser.util; import com.github.steveice10.mc.protocol.data.game.entity.Effect; -import com.github.steveice10.opennbt.tag.builtin.CompoundTag; -import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket; import com.nukkitx.protocol.bedrock.packet.MobEffectPacket; import com.nukkitx.protocol.bedrock.packet.StopSoundPacket; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.session.GeyserSession; @@ -131,25 +128,6 @@ public class DimensionUtils { }; } - /** - * Determines the new dimension based on the {@link CompoundTag} sent by either the {@link com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket} - * or {@link com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundRespawnPacket}. - * - * @param dimensionTag the packet's dimension tag. - * @return the dimension identifier. - */ - public static String getNewDimension(CompoundTag dimensionTag) { - if (dimensionTag == null || dimensionTag.isEmpty()) { - GeyserImpl.getInstance().getLogger().debug("Dimension tag was null or empty."); - return OVERWORLD; - } - if (dimensionTag.getValue().get("effects") != null) { - return ((StringTag) dimensionTag.getValue().get("effects")).getValue(); - } - GeyserImpl.getInstance().getLogger().debug("Effects portion of the tag was null or empty."); - return OVERWORLD; - } - /** * The Nether dimension in Bedrock does not permit building above Y128 - the Bedrock above the dimension. * This workaround sets the Nether as the End dimension to ignore this limit. diff --git a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java index aafbbf66e..43ccff5e0 100644 --- a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java @@ -32,6 +32,7 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinitions; +import org.geysermc.geyser.entity.type.BoatEntity; import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.living.ArmorStandEntity; import org.geysermc.geyser.entity.type.living.animal.AnimalEntity; @@ -72,6 +73,7 @@ public final class EntityUtils { case SLOW_FALLING -> 27; case BAD_OMEN -> 28; case HERO_OF_THE_VILLAGE -> 29; + case DARKNESS -> 30; default -> effect.ordinal() + 1; }; } @@ -85,7 +87,7 @@ public final class EntityUtils { case TRADER_LLAMA, LLAMA -> mountedHeightOffset = height * 0.6f; case MINECART, HOPPER_MINECART, TNT_MINECART, CHEST_MINECART, FURNACE_MINECART, SPAWNER_MINECART, COMMAND_BLOCK_MINECART -> mountedHeightOffset = 0; - case BOAT -> mountedHeightOffset = -0.1f; + case BOAT, CHEST_BOAT -> mountedHeightOffset = -0.1f; case HOGLIN, ZOGLIN -> { boolean isBaby = mount.getFlag(EntityFlag.BABY); mountedHeightOffset = height - (isBaby ? 0.2f : 0.15f); @@ -160,13 +162,14 @@ public final class EntityUtils { xOffset = -0.6f; } } + case CHEST_BOAT -> xOffset = 0.15F; case CHICKEN -> zOffset = -0.1f; case TRADER_LLAMA, LLAMA -> zOffset = -0.3f; } if (passenger.getDefinition().entityType() == EntityType.SHULKER) { switch (mount.getDefinition().entityType()) { case MINECART, HOPPER_MINECART, TNT_MINECART, CHEST_MINECART, FURNACE_MINECART, SPAWNER_MINECART, - COMMAND_BLOCK_MINECART, BOAT -> yOffset = 0.1875f; + COMMAND_BLOCK_MINECART, BOAT, CHEST_BOAT -> yOffset = 0.1875f; } } /* @@ -182,7 +185,7 @@ public final class EntityUtils { } switch (mount.getDefinition().entityType()) { case MINECART, HOPPER_MINECART, TNT_MINECART, CHEST_MINECART, FURNACE_MINECART, SPAWNER_MINECART, - COMMAND_BLOCK_MINECART, BOAT -> yOffset -= mount.getDefinition().height() * 0.5f; + COMMAND_BLOCK_MINECART, BOAT, CHEST_BOAT -> yOffset -= mount.getDefinition().height() * 0.5f; } Vector3f offset = Vector3f.from(xOffset, yOffset, zOffset); passenger.setRiderSeatPosition(offset); @@ -190,7 +193,7 @@ public final class EntityUtils { } public static void updateRiderRotationLock(Entity passenger, Entity mount, boolean isRiding) { - if (isRiding && mount.getDefinition() == EntityDefinitions.BOAT) { + if (isRiding && mount instanceof BoatEntity) { // Head rotation is locked while riding in a boat passenger.getDirtyMetadata().put(EntityData.RIDER_ROTATION_LOCKED, (byte) 1); passenger.getDirtyMetadata().put(EntityData.RIDER_MAX_ROTATION, 90f); diff --git a/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java b/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java index 1e8795478..9607ac61e 100644 --- a/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java +++ b/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java @@ -69,7 +69,8 @@ public enum InteractiveTag { EQUIP_ARMOR_STAND("armorstand.equip"), READ, WAKE_VILLAGER("wakevillager"), - BARTER; + BARTER, + GIVE_ITEM_TO_ALLAY("allay"); /** * The full string that should be passed on to the client. diff --git a/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java b/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java index 37c4609fe..92967a10b 100644 --- a/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java @@ -25,7 +25,10 @@ package org.geysermc.geyser.util; -import com.github.steveice10.opennbt.tag.builtin.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import it.unimi.dsi.fastutil.ints.Int2IntMap; import org.geysermc.geyser.session.GeyserSession; diff --git a/core/src/main/java/org/geysermc/geyser/util/JavaCodecEntry.java b/core/src/main/java/org/geysermc/geyser/util/JavaCodecEntry.java new file mode 100644 index 000000000..45be5bf99 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/util/JavaCodecEntry.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.util; + +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; + +import javax.annotation.Nonnull; +import java.util.Iterator; + +public record JavaCodecEntry() { + + /** + * Iterate over a Java Edition codec and return each entry as a CompoundTag + */ + public static Iterable iterateAsTag(CompoundTag tag) { + ListTag value = tag.get("value"); + Iterator originalIterator = value.iterator(); + return new Iterable<>() { + @Nonnull + @Override + public Iterator iterator() { + return new Iterator<>() { + @Override + public boolean hasNext() { + return originalIterator.hasNext(); + } + + @Override + public CompoundTag next() { + return (CompoundTag) originalIterator.next(); + } + }; + } + }; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java b/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java index d8d3e3c49..abc95839d 100644 --- a/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java @@ -37,17 +37,17 @@ import com.nukkitx.network.util.Preconditions; import com.nukkitx.protocol.bedrock.packet.LoginPacket; import com.nukkitx.protocol.bedrock.packet.ServerToClientHandshakePacket; import com.nukkitx.protocol.bedrock.util.EncryptionUtils; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.form.ModalForm; +import org.geysermc.cumulus.form.SimpleForm; +import org.geysermc.cumulus.response.SimpleFormResponse; +import org.geysermc.cumulus.response.result.FormResponseResult; +import org.geysermc.cumulus.response.result.ValidFormResponseResult; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.auth.AuthData; import org.geysermc.geyser.session.auth.BedrockClientData; -import org.geysermc.cumulus.CustomForm; -import org.geysermc.cumulus.ModalForm; -import org.geysermc.cumulus.SimpleForm; -import org.geysermc.cumulus.response.CustomFormResponse; -import org.geysermc.cumulus.response.ModalFormResponse; -import org.geysermc.cumulus.response.SimpleFormResponse; import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; @@ -61,6 +61,7 @@ import java.security.interfaces.ECPublicKey; import java.security.spec.ECGenParameterSpec; import java.util.Iterator; import java.util.UUID; +import java.util.function.BiConsumer; public class LoginEncryptionUtils { private static final ObjectMapper JSON_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); @@ -235,28 +236,22 @@ public class LoginEncryptionUtils { .optionalButton("geyser.auth.login.form.notice.btn_login.mojang", isPasswordAuthEnabled) .button("geyser.auth.login.form.notice.btn_login.microsoft") .button("geyser.auth.login.form.notice.btn_disconnect") - .responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (!response.isCorrect()) { - buildAndShowLoginWindow(session); - return; - } - - if (isPasswordAuthEnabled && response.getClickedButtonId() == 0) { + .closedOrInvalidResultHandler(() -> buildAndShowLoginWindow(session)) + .validResultHandler((response) -> { + if (response.clickedButtonId() == 0) { session.setMicrosoftAccount(false); buildAndShowLoginDetailsWindow(session); return; } - if (isPasswordAuthEnabled && response.getClickedButtonId() == 1) { - session.setMicrosoftAccount(true); - buildAndShowMicrosoftAuthenticationWindow(session); - return; - } - - if (response.getClickedButtonId() == 0) { - // Just show the OAuth code - session.authenticateWithMicrosoftCode(); + if (response.clickedButtonId() == 1) { + if (isPasswordAuthEnabled) { + session.setMicrosoftAccount(true); + buildAndShowMicrosoftAuthenticationWindow(session); + } else { + // Just show the OAuth code + session.authenticateWithMicrosoftCode(); + } return; } @@ -269,41 +264,46 @@ public class LoginEncryptionUtils { */ public static void buildAndShowConsentWindow(GeyserSession session) { String locale = session.locale(); + session.sendForm( SimpleForm.builder() + .translator(LoginEncryptionUtils::translate, locale) .title("%gui.signIn") - .content(GeyserLocale.getPlayerLocaleString("geyser.auth.login.save_token.warning", locale) + - "\n\n" + - GeyserLocale.getPlayerLocaleString("geyser.auth.login.save_token.proceed", locale)) + .content(""" + geyser.auth.login.save_token.warning + + geyser.auth.login.save_token.proceed""") .button("%gui.ok") .button("%gui.decline") - .responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (response.isCorrect() && response.getClickedButtonId() == 0) { - session.authenticateWithMicrosoftCode(true); - } else { - session.disconnect("%disconnect.quitting"); - } - })); + .resultHandler(authenticateOrKickHandler(session)) + ); } public static void buildAndShowTokenExpiredWindow(GeyserSession session) { String locale = session.locale(); + session.sendForm( SimpleForm.builder() - .title(GeyserLocale.getPlayerLocaleString("geyser.auth.login.form.expired", locale)) - .content(GeyserLocale.getPlayerLocaleString("geyser.auth.login.save_token.expired", locale) + - "\n\n" + - GeyserLocale.getPlayerLocaleString("geyser.auth.login.save_token.proceed", locale)) + .translator(LoginEncryptionUtils::translate, locale) + .title("geyser.auth.login.form.expired") + .content(""" + geyser.auth.login.save_token.expired + + geyser.auth.login.save_token.proceed""") .button("%gui.ok") - .responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (response.isCorrect()) { - session.authenticateWithMicrosoftCode(true); - } else { - session.disconnect("%disconnect.quitting"); - } - })); + .resultHandler(authenticateOrKickHandler(session)) + ); + } + + private static BiConsumer> authenticateOrKickHandler(GeyserSession session) { + return (form, genericResult) -> { + if (genericResult instanceof ValidFormResponseResult result && + result.response().clickedButtonId() == 0) { + session.authenticateWithMicrosoftCode(true); + } else { + session.disconnect("%disconnect.quitting"); + } + }; } public static void buildAndShowLoginDetailsWindow(GeyserSession session) { @@ -314,15 +314,8 @@ public class LoginEncryptionUtils { .label("geyser.auth.login.form.details.desc") .input("geyser.auth.login.form.details.email", "account@geysermc.org", "") .input("geyser.auth.login.form.details.pass", "123456", "") - .responseHandler((form, responseData) -> { - CustomFormResponse response = form.parseResponse(responseData); - if (!response.isCorrect()) { - buildAndShowLoginDetailsWindow(session); - return; - } - - session.authenticate(response.next(), response.next()); - })); + .closedOrInvalidResultHandler(() -> buildAndShowLoginDetailsWindow(session)) + .validResultHandler((response) -> session.authenticate(response.next(), response.next()))); } /** @@ -336,16 +329,11 @@ public class LoginEncryptionUtils { .button("geyser.auth.login.method.browser") .button("geyser.auth.login.method.password") .button("geyser.auth.login.form.notice.btn_disconnect") - .responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (!response.isCorrect()) { - buildAndShowLoginWindow(session); - return; - } - - if (response.getClickedButtonId() == 0) { + .closedOrInvalidResultHandler(() -> buildAndShowLoginWindow(session)) + .validResultHandler((response) -> { + if (response.clickedButtonId() == 0) { session.authenticateWithMicrosoftCode(); - } else if (response.getClickedButtonId() == 1) { + } else if (response.clickedButtonId() == 1) { buildAndShowLoginDetailsWindow(session); } else { session.disconnect(GeyserLocale.getPlayerLocaleString("geyser.auth.login.form.disconnect", session.locale())); @@ -357,6 +345,8 @@ public class LoginEncryptionUtils { * Shows the code that a user must input into their browser */ public static void buildAndShowMicrosoftCodeWindow(GeyserSession session, MsaAuthenticationService.MsCodeResponse msCode) { + String locale = session.locale(); + StringBuilder message = new StringBuilder("%xbox.signin.website\n") .append(ChatColor.AQUA) .append("%xbox.signin.url") @@ -370,23 +360,45 @@ public class LoginEncryptionUtils { .append(ChatColor.RESET) .append(GeyserLocale.getPlayerLocaleString("geyser.auth.login.timeout", session.locale(), String.valueOf(timeout))); } + session.sendForm( ModalForm.builder() .title("%xbox.signin") .content(message.toString()) .button1("%gui.done") .button2("%menu.disconnect") - .responseHandler((form, responseData) -> { - ModalFormResponse response = form.parseResponse(responseData); - if (!response.isCorrect()) { - buildAndShowMicrosoftAuthenticationWindow(session); - return; - } - - if (response.getClickedButtonId() == 1) { - session.disconnect(GeyserLocale.getPlayerLocaleString("geyser.auth.login.form.disconnect", session.locale())); + .closedOrInvalidResultHandler(() -> buildAndShowMicrosoftAuthenticationWindow(session)) + .validResultHandler((response) -> { + if (response.clickedButtonId() == 1) { + session.disconnect(GeyserLocale.getPlayerLocaleString("geyser.auth.login.form.disconnect", locale)); } }) ); } + + /* + This checks per line if there is something to be translated, and it skips Bedrock translation keys (%) + */ + private static String translate(String key, String locale) { + StringBuilder newValue = new StringBuilder(); + int previousIndex = 0; + while (previousIndex < key.length()) { + int nextIndex = key.indexOf('\n', previousIndex); + int endIndex = nextIndex == -1 ? key.length() : nextIndex; + + // if there is more to this line than just a new line char + if (endIndex - previousIndex > 1) { + String substring = key.substring(previousIndex, endIndex); + if (key.charAt(previousIndex) != '%') { + newValue.append(GeyserLocale.getPlayerLocaleString(substring, locale)); + } else { + newValue.append(substring); + } + } + newValue.append('\n'); + + previousIndex = endIndex + 1; + } + return newValue.toString(); + } } diff --git a/core/src/main/java/org/geysermc/geyser/util/MathUtils.java b/core/src/main/java/org/geysermc/geyser/util/MathUtils.java index 50cfa001e..f1e262bc6 100644 --- a/core/src/main/java/org/geysermc/geyser/util/MathUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/MathUtils.java @@ -101,6 +101,25 @@ public class MathUtils { return num; } + /** + * Clamps the value between the low and high boundaries + * Copied from {@link com.nukkitx.math.GenericMath} with floats instead. + * + * @param value The value to clamp + * @param low The low bound of the clamp + * @param high The high bound of the clamp + * @return the clamped value + */ + public static float clamp(float value, float low, float high) { + if (value < low) { + return low; + } + if (value > high) { + return high; + } + return value; + } + /** * Ensures the resulting object is a byte. Java Edition does not care whether a byte is encoded as an integer or not; * it converts it into a byte anyway. diff --git a/core/src/main/java/org/geysermc/geyser/util/NewsHandler.java b/core/src/main/java/org/geysermc/geyser/util/NewsHandler.java index 31e3116d5..71e7c99c1 100644 --- a/core/src/main/java/org/geysermc/geyser/util/NewsHandler.java +++ b/core/src/main/java/org/geysermc/geyser/util/NewsHandler.java @@ -29,15 +29,15 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonSyntaxException; -import org.geysermc.geyser.Constants; -import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.GeyserLogger; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.floodgate.news.NewsItem; import org.geysermc.floodgate.news.NewsItemAction; import org.geysermc.floodgate.news.data.AnnouncementData; import org.geysermc.floodgate.news.data.BuildSpecificData; import org.geysermc.floodgate.news.data.CheckAfterData; +import org.geysermc.geyser.Constants; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.GeyserLogger; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.ChatColor; import java.util.*; diff --git a/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java b/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java index 37741adba..483a4372f 100644 --- a/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java @@ -27,13 +27,12 @@ package org.geysermc.geyser.util; import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.data.game.setting.Difficulty; +import org.geysermc.cumulus.component.DropdownComponent; +import org.geysermc.cumulus.form.CustomForm; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.level.GameRule; -import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.level.WorldManager; -import org.geysermc.cumulus.CustomForm; -import org.geysermc.cumulus.component.DropdownComponent; -import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.MinecraftLocale; @@ -115,12 +114,7 @@ public class SettingsUtils { } } - builder.responseHandler((form, responseData) -> { - CustomFormResponse response = form.parseResponse(responseData); - if (response.isClosed() || response.isInvalid()) { - return; - } - + builder.validResultHandler((response) -> { if (showClientSettings) { // Client can only see its coordinates if reducedDebugInfo is disabled and coordinates are enabled in geyser config. if (session.getPreferencesCache().isAllowShowCoordinates()) { diff --git a/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java b/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java index d2675f13e..15348939c 100644 --- a/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java @@ -25,9 +25,25 @@ package org.geysermc.geyser.util; +import com.github.steveice10.mc.protocol.data.game.level.sound.BuiltinSound; +import com.github.steveice10.mc.protocol.data.game.level.sound.CustomSound; +import com.github.steveice10.mc.protocol.data.game.level.sound.Sound; +import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.protocol.bedrock.data.LevelEventType; import com.nukkitx.protocol.bedrock.data.SoundEvent; +import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; +import com.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket; +import com.nukkitx.protocol.bedrock.packet.PlaySoundPacket; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.level.block.BlockStateValues; +import org.geysermc.geyser.registry.BlockRegistries; +import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.registry.type.SoundMapping; +import org.geysermc.geyser.session.GeyserSession; -public class SoundUtils { +import java.util.Locale; + +public final class SoundUtils { /** * Maps a sound name to a sound event, null if one @@ -36,11 +52,118 @@ public class SoundUtils { * @param sound the sound name * @return a sound event from the given sound */ - public static SoundEvent toSoundEvent(String sound) { + private static SoundEvent toSoundEvent(String sound) { try { - return SoundEvent.valueOf(sound.toUpperCase().replaceAll("\\.", "_")); + return SoundEvent.valueOf(sound.toUpperCase(Locale.ROOT).replace(".", "_")); } catch (Exception ex) { return null; } } + + /** + * Translates a Java Custom or Builtin Sound to its Bedrock equivalent + * + * @param sound the sound to translate + * @return a Bedrock sound + */ + public static String translatePlaySound(Sound sound) { + String packetSound; + if (sound instanceof BuiltinSound builtinSound) { + packetSound = builtinSound.getName(); + } else if (sound instanceof CustomSound customSound) { + packetSound = customSound.getName(); + } else { + GeyserImpl.getInstance().getLogger().debug("Unknown sound, we were unable to map this. " + sound); + return ""; + } + + // Drop the Minecraft namespace if applicable + if (packetSound.startsWith("minecraft:")) { + packetSound = packetSound.substring("minecraft:".length()); + } + + SoundMapping soundMapping = Registries.SOUNDS.get(packetSound); + if (soundMapping == null || soundMapping.getPlaysound() == null) { + // no mapping + GeyserImpl.getInstance().getLogger().debug("[PlaySound] Defaulting to sound server gave us for " + sound); + return packetSound; + } + return soundMapping.getPlaysound(); + } + + /** + * Translates and plays a Java Builtin Sound for a Bedrock client + * + * @param session the Bedrock client session. + * @param javaSound the builtin sound to play + * @param position the position + * @param pitch the pitch + */ + public static void playBuiltinSound(GeyserSession session, BuiltinSound javaSound, Vector3f position, float volume, float pitch) { + String packetSound = javaSound.getName(); + + SoundMapping soundMapping = Registries.SOUNDS.get(packetSound); + if (soundMapping == null) { + session.getGeyser().getLogger().debug("[Builtin] Sound mapping for " + packetSound + " not found"); + return; + } + + if (soundMapping.getPlaysound() != null) { + // We always prefer the PlaySound mapping because we can control volume and pitch + PlaySoundPacket playSoundPacket = new PlaySoundPacket(); + playSoundPacket.setSound(soundMapping.getPlaysound()); + playSoundPacket.setPosition(position); + playSoundPacket.setVolume(volume); + playSoundPacket.setPitch(pitch); + session.sendUpstreamPacket(playSoundPacket); + return; + } + + if (soundMapping.isLevelEvent()) { + LevelEventPacket levelEventPacket = new LevelEventPacket(); + levelEventPacket.setPosition(position); + levelEventPacket.setData(0); + levelEventPacket.setType(LevelEventType.valueOf(soundMapping.getBedrock())); + session.sendUpstreamPacket(levelEventPacket); + return; + } + + LevelSoundEventPacket soundPacket = new LevelSoundEventPacket(); + SoundEvent sound = SoundUtils.toSoundEvent(soundMapping.getBedrock()); + if (sound == null) { + sound = SoundUtils.toSoundEvent(packetSound); + } + if (sound == null) { + session.getGeyser().getLogger().debug("[Builtin] Sound for original '" + packetSound + "' to mappings '" + soundMapping.getBedrock() + + "' was not a playable level sound, or has yet to be mapped to an enum in SoundEvent."); + return; + } + + soundPacket.setSound(sound); + soundPacket.setPosition(position); + soundPacket.setIdentifier(soundMapping.getIdentifier()); + if (sound == SoundEvent.NOTE) { + // Minecraft Wiki: 2^(x/12) = Java pitch where x is -12 to 12 + // Java sends the note value as above starting with -12 and ending at 12 + // Bedrock has a number for each type of note, then proceeds up the scale by adding to that number + soundPacket.setExtraData(soundMapping.getExtraData() + (int)(Math.round((Math.log10(pitch) / Math.log10(2)) * 12)) + 12); + } else if (sound == SoundEvent.PLACE && soundMapping.getExtraData() == -1) { + if (!soundMapping.getIdentifier().equals(":")) { + int javaId = BlockRegistries.JAVA_IDENTIFIERS.getOrDefault(soundMapping.getIdentifier(), BlockStateValues.JAVA_AIR_ID); + soundPacket.setExtraData(session.getBlockMappings().getBedrockBlockId(javaId)); + } else { + session.getGeyser().getLogger().debug("PLACE sound mapping identifier was invalid! Please report: " + soundMapping); + } + soundPacket.setIdentifier(":"); + } else { + soundPacket.setExtraData(soundMapping.getExtraData()); + } + + soundPacket.setBabySound(false); // might need to adjust this in the future + soundPacket.setRelativeVolumeDisabled(false); + session.sendUpstreamPacket(soundPacket); + } + + private SoundUtils() { + } } diff --git a/core/src/main/java/org/geysermc/geyser/util/StatisticsUtils.java b/core/src/main/java/org/geysermc/geyser/util/StatisticsUtils.java index 3324ec577..f01670106 100644 --- a/core/src/main/java/org/geysermc/geyser/util/StatisticsUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/StatisticsUtils.java @@ -26,12 +26,11 @@ package org.geysermc.geyser.util; import com.github.steveice10.mc.protocol.data.game.statistic.*; -import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.cumulus.form.SimpleForm; +import org.geysermc.cumulus.util.FormImage; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.type.ItemMappings; -import org.geysermc.cumulus.SimpleForm; -import org.geysermc.cumulus.response.SimpleFormResponse; -import org.geysermc.cumulus.util.FormImage; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.MinecraftLocale; @@ -68,12 +67,7 @@ public class StatisticsUtils { .button("stat.itemsButton - stat_type.minecraft.dropped", FormImage.Type.PATH, "textures/ui/trash_default") .button("stat.mobsButton - geyser.statistics.killed", FormImage.Type.PATH, "textures/items/diamond_sword") .button("stat.mobsButton - geyser.statistics.killed_by", FormImage.Type.PATH, "textures/ui/wither_heart_flash") - .responseHandler((form, responseData) -> { - SimpleFormResponse response = form.parseResponse(responseData); - if (!response.isCorrect()) { - return; - } - + .validResultHandler((response) -> { SimpleForm.Builder builder = SimpleForm.builder() .translator(StatisticsUtils::translate, language); @@ -81,7 +75,7 @@ public class StatisticsUtils { List content = new ArrayList<>(); ItemMappings mappings = session.getItemMappings(); - switch (response.getClickedButtonId()) { + switch (response.clickedButtonId()) { case 0: builder.title("stat.generalButton"); @@ -202,12 +196,7 @@ public class StatisticsUtils { session.sendForm( builder.content(assembledContent.toString()) .button("gui.back", FormImage.Type.PATH, "textures/gui/newgui/undo") - .responseHandler((form1, subFormResponseData) -> { - SimpleFormResponse response1 = form.parseResponse(subFormResponseData); - if (response1.isCorrect()) { - buildAndSendStatisticsMenu(session); - } - })); + .validResultHandler((response1) -> buildAndSendStatisticsMenu(session))); })); } diff --git a/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java b/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java index 73cb68df1..913ea44d5 100644 --- a/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java +++ b/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java @@ -27,9 +27,9 @@ package org.geysermc.geyser.util.collection; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.nbt.NbtMap; +import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator; -import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.util.BlockEntityUtils; /** diff --git a/core/src/main/resources/bedrock/biome_definitions.dat b/core/src/main/resources/bedrock/biome_definitions.dat index 1bd332601..0520c61e2 100644 Binary files a/core/src/main/resources/bedrock/biome_definitions.dat and b/core/src/main/resources/bedrock/biome_definitions.dat differ diff --git a/core/src/main/resources/bedrock/block_palette.1_18_0.nbt b/core/src/main/resources/bedrock/block_palette.1_18_0.nbt deleted file mode 100644 index 0415c135a..000000000 Binary files a/core/src/main/resources/bedrock/block_palette.1_18_0.nbt and /dev/null differ diff --git a/core/src/main/resources/bedrock/block_palette.1_18_10.nbt b/core/src/main/resources/bedrock/block_palette.1_18_10.nbt deleted file mode 100644 index 637bfc952..000000000 Binary files a/core/src/main/resources/bedrock/block_palette.1_18_10.nbt and /dev/null differ diff --git a/core/src/main/resources/bedrock/block_palette.1_18_30.nbt b/core/src/main/resources/bedrock/block_palette.1_18_30.nbt deleted file mode 100644 index bf7690970..000000000 Binary files a/core/src/main/resources/bedrock/block_palette.1_18_30.nbt and /dev/null differ diff --git a/core/src/main/resources/bedrock/block_palette.1_19_0.nbt b/core/src/main/resources/bedrock/block_palette.1_19_0.nbt new file mode 100644 index 000000000..8c095ad02 Binary files /dev/null and b/core/src/main/resources/bedrock/block_palette.1_19_0.nbt differ diff --git a/core/src/main/resources/bedrock/creative_items.1_18_0.json b/core/src/main/resources/bedrock/creative_items.1_18_0.json deleted file mode 100644 index d32ba0cbf..000000000 --- a/core/src/main/resources/bedrock/creative_items.1_18_0.json +++ /dev/null @@ -1,5206 +0,0 @@ -{ - "items" : [ - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5797 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5798 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5799 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5800 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5801 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5802 - }, - { - "id" : "minecraft:crimson_planks", - "blockRuntimeId" : 3840 - }, - { - "id" : "minecraft:warped_planks", - "blockRuntimeId" : 7598 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1319 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1320 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1321 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1322 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1323 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1324 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1331 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1326 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1327 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1325 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1328 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1332 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1329 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1330 - }, - { - "id" : "minecraft:blackstone_wall", - "blockRuntimeId" : 507 - }, - { - "id" : "minecraft:polished_blackstone_wall", - "blockRuntimeId" : 6041 - }, - { - "id" : "minecraft:polished_blackstone_brick_wall", - "blockRuntimeId" : 5838 - }, - { - "id" : "minecraft:cobbled_deepslate_wall", - "blockRuntimeId" : 1156 - }, - { - "id" : "minecraft:deepslate_tile_wall", - "blockRuntimeId" : 4298 - }, - { - "id" : "minecraft:polished_deepslate_wall", - "blockRuntimeId" : 6216 - }, - { - "id" : "minecraft:deepslate_brick_wall", - "blockRuntimeId" : 4115 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4774 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4775 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4776 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4777 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4778 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4779 - }, - { - "id" : "minecraft:nether_brick_fence", - "blockRuntimeId" : 5689 - }, - { - "id" : "minecraft:crimson_fence", - "blockRuntimeId" : 3818 - }, - { - "id" : "minecraft:warped_fence", - "blockRuntimeId" : 7576 - }, - { - "id" : "minecraft:fence_gate", - "blockRuntimeId" : 4780 - }, - { - "id" : "minecraft:spruce_fence_gate", - "blockRuntimeId" : 7010 - }, - { - "id" : "minecraft:birch_fence_gate", - "blockRuntimeId" : 400 - }, - { - "id" : "minecraft:jungle_fence_gate", - "blockRuntimeId" : 5253 - }, - { - "id" : "minecraft:acacia_fence_gate", - "blockRuntimeId" : 44 - }, - { - "id" : "minecraft:dark_oak_fence_gate", - "blockRuntimeId" : 3981 - }, - { - "id" : "minecraft:crimson_fence_gate", - "blockRuntimeId" : 3819 - }, - { - "id" : "minecraft:warped_fence_gate", - "blockRuntimeId" : 7577 - }, - { - "id" : "minecraft:normal_stone_stairs", - "blockRuntimeId" : 5708 - }, - { - "id" : "minecraft:stone_stairs", - "blockRuntimeId" : 7281 - }, - { - "id" : "minecraft:mossy_cobblestone_stairs", - "blockRuntimeId" : 5668 - }, - { - "id" : "minecraft:oak_stairs", - "blockRuntimeId" : 5717 - }, - { - "id" : "minecraft:spruce_stairs", - "blockRuntimeId" : 7042 - }, - { - "id" : "minecraft:birch_stairs", - "blockRuntimeId" : 432 - }, - { - "id" : "minecraft:jungle_stairs", - "blockRuntimeId" : 5285 - }, - { - "id" : "minecraft:acacia_stairs", - "blockRuntimeId" : 76 - }, - { - "id" : "minecraft:dark_oak_stairs", - "blockRuntimeId" : 4013 - }, - { - "id" : "minecraft:stone_brick_stairs", - "blockRuntimeId" : 7187 - }, - { - "id" : "minecraft:mossy_stone_brick_stairs", - "blockRuntimeId" : 5676 - }, - { - "id" : "minecraft:sandstone_stairs", - "blockRuntimeId" : 6710 - }, - { - "id" : "minecraft:smooth_sandstone_stairs", - "blockRuntimeId" : 6903 - }, - { - "id" : "minecraft:red_sandstone_stairs", - "blockRuntimeId" : 6637 - }, - { - "id" : "minecraft:smooth_red_sandstone_stairs", - "blockRuntimeId" : 6895 - }, - { - "id" : "minecraft:granite_stairs", - "blockRuntimeId" : 4989 - }, - { - "id" : "minecraft:polished_granite_stairs", - "blockRuntimeId" : 6386 - }, - { - "id" : "minecraft:diorite_stairs", - "blockRuntimeId" : 4476 - }, - { - "id" : "minecraft:polished_diorite_stairs", - "blockRuntimeId" : 6378 - }, - { - "id" : "minecraft:andesite_stairs", - "blockRuntimeId" : 144 - }, - { - "id" : "minecraft:polished_andesite_stairs", - "blockRuntimeId" : 5814 - }, - { - "id" : "minecraft:brick_stairs", - "blockRuntimeId" : 876 - }, - { - "id" : "minecraft:nether_brick_stairs", - "blockRuntimeId" : 5690 - }, - { - "id" : "minecraft:red_nether_brick_stairs", - "blockRuntimeId" : 6625 - }, - { - "id" : "minecraft:end_brick_stairs", - "blockRuntimeId" : 4720 - }, - { - "id" : "minecraft:quartz_stairs", - "blockRuntimeId" : 6559 - }, - { - "id" : "minecraft:smooth_quartz_stairs", - "blockRuntimeId" : 6887 - }, - { - "id" : "minecraft:purpur_stairs", - "blockRuntimeId" : 6537 - }, - { - "id" : "minecraft:prismarine_stairs", - "blockRuntimeId" : 6449 - }, - { - "id" : "minecraft:dark_prismarine_stairs", - "blockRuntimeId" : 4037 - }, - { - "id" : "minecraft:prismarine_bricks_stairs", - "blockRuntimeId" : 6441 - }, - { - "id" : "minecraft:crimson_stairs", - "blockRuntimeId" : 3860 - }, - { - "id" : "minecraft:warped_stairs", - "blockRuntimeId" : 7618 - }, - { - "id" : "minecraft:blackstone_stairs", - "blockRuntimeId" : 499 - }, - { - "id" : "minecraft:polished_blackstone_stairs", - "blockRuntimeId" : 6033 - }, - { - "id" : "minecraft:polished_blackstone_brick_stairs", - "blockRuntimeId" : 5830 - }, - { - "id" : "minecraft:cut_copper_stairs", - "blockRuntimeId" : 3913 - }, - { - "id" : "minecraft:exposed_cut_copper_stairs", - "blockRuntimeId" : 4756 - }, - { - "id" : "minecraft:weathered_cut_copper_stairs", - "blockRuntimeId" : 7745 - }, - { - "id" : "minecraft:oxidized_cut_copper_stairs", - "blockRuntimeId" : 5758 - }, - { - "id" : "minecraft:waxed_cut_copper_stairs", - "blockRuntimeId" : 7689 - }, - { - "id" : "minecraft:waxed_exposed_cut_copper_stairs", - "blockRuntimeId" : 7703 - }, - { - "id" : "minecraft:waxed_weathered_cut_copper_stairs", - "blockRuntimeId" : 7731 - }, - { - "id" : "minecraft:waxed_oxidized_cut_copper_stairs", - "blockRuntimeId" : 7717 - }, - { - "id" : "minecraft:cobbled_deepslate_stairs", - "blockRuntimeId" : 1148 - }, - { - "id" : "minecraft:deepslate_tile_stairs", - "blockRuntimeId" : 4290 - }, - { - "id" : "minecraft:polished_deepslate_stairs", - "blockRuntimeId" : 6208 - }, - { - "id" : "minecraft:deepslate_brick_stairs", - "blockRuntimeId" : 4107 - }, - { - "id" : "minecraft:wooden_door" - }, - { - "id" : "minecraft:spruce_door" - }, - { - "id" : "minecraft:birch_door" - }, - { - "id" : "minecraft:jungle_door" - }, - { - "id" : "minecraft:acacia_door" - }, - { - "id" : "minecraft:dark_oak_door" - }, - { - "id" : "minecraft:iron_door" - }, - { - "id" : "minecraft:crimson_door" - }, - { - "id" : "minecraft:warped_door" - }, - { - "id" : "minecraft:trapdoor", - "blockRuntimeId" : 7363 - }, - { - "id" : "minecraft:spruce_trapdoor", - "blockRuntimeId" : 7066 - }, - { - "id" : "minecraft:birch_trapdoor", - "blockRuntimeId" : 456 - }, - { - "id" : "minecraft:jungle_trapdoor", - "blockRuntimeId" : 5309 - }, - { - "id" : "minecraft:acacia_trapdoor", - "blockRuntimeId" : 100 - }, - { - "id" : "minecraft:dark_oak_trapdoor", - "blockRuntimeId" : 4021 - }, - { - "id" : "minecraft:iron_trapdoor", - "blockRuntimeId" : 5168 - }, - { - "id" : "minecraft:crimson_trapdoor", - "blockRuntimeId" : 3887 - }, - { - "id" : "minecraft:warped_trapdoor", - "blockRuntimeId" : 7645 - }, - { - "id" : "minecraft:iron_bars", - "blockRuntimeId" : 5133 - }, - { - "id" : "minecraft:glass", - "blockRuntimeId" : 4883 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7088 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7096 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7095 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7103 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7100 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7102 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7089 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7092 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7093 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7101 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7097 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7091 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7099 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7098 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7090 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7094 - }, - { - "id" : "minecraft:tinted_glass", - "blockRuntimeId" : 7352 - }, - { - "id" : "minecraft:glass_pane", - "blockRuntimeId" : 4884 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7104 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7112 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7111 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7119 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7116 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7118 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7105 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7108 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7109 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7117 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7113 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7107 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7115 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7114 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7106 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7110 - }, - { - "id" : "minecraft:ladder", - "blockRuntimeId" : 5357 - }, - { - "id" : "minecraft:scaffolding", - "blockRuntimeId" : 6730 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7223 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7273 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7226 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7244 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7903 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7904 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7905 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7906 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7907 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7908 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7228 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7271 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7224 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7274 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7245 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7239 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7275 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7256 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7261 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7262 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7259 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7260 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7258 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7257 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7227 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7230 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7246 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7255 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7229 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7272 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7240 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7241 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7242 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7243 - }, - { - "id" : "minecraft:crimson_slab", - "blockRuntimeId" : 3858 - }, - { - "id" : "minecraft:warped_slab", - "blockRuntimeId" : 7616 - }, - { - "id" : "minecraft:blackstone_slab", - "blockRuntimeId" : 497 - }, - { - "id" : "minecraft:polished_blackstone_slab", - "blockRuntimeId" : 6031 - }, - { - "id" : "minecraft:polished_blackstone_brick_slab", - "blockRuntimeId" : 5828 - }, - { - "id" : "minecraft:cut_copper_slab", - "blockRuntimeId" : 3911 - }, - { - "id" : "minecraft:exposed_cut_copper_slab", - "blockRuntimeId" : 4754 - }, - { - "id" : "minecraft:weathered_cut_copper_slab", - "blockRuntimeId" : 7743 - }, - { - "id" : "minecraft:oxidized_cut_copper_slab", - "blockRuntimeId" : 5756 - }, - { - "id" : "minecraft:waxed_cut_copper_slab", - "blockRuntimeId" : 7687 - }, - { - "id" : "minecraft:waxed_exposed_cut_copper_slab", - "blockRuntimeId" : 7701 - }, - { - "id" : "minecraft:waxed_weathered_cut_copper_slab", - "blockRuntimeId" : 7729 - }, - { - "id" : "minecraft:waxed_oxidized_cut_copper_slab", - "blockRuntimeId" : 7715 - }, - { - "id" : "minecraft:cobbled_deepslate_slab", - "blockRuntimeId" : 1146 - }, - { - "id" : "minecraft:polished_deepslate_slab", - "blockRuntimeId" : 6206 - }, - { - "id" : "minecraft:deepslate_tile_slab", - "blockRuntimeId" : 4288 - }, - { - "id" : "minecraft:deepslate_brick_slab", - "blockRuntimeId" : 4105 - }, - { - "id" : "minecraft:brick_block", - "blockRuntimeId" : 875 - }, - { - "id" : "minecraft:chiseled_nether_bricks", - "blockRuntimeId" : 1130 - }, - { - "id" : "minecraft:cracked_nether_bricks", - "blockRuntimeId" : 3769 - }, - { - "id" : "minecraft:quartz_bricks", - "blockRuntimeId" : 6557 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7289 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7290 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7291 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7292 - }, - { - "id" : "minecraft:end_bricks", - "blockRuntimeId" : 4728 - }, - { - "id" : "minecraft:prismarine", - "blockRuntimeId" : 6440 - }, - { - "id" : "minecraft:polished_blackstone_bricks", - "blockRuntimeId" : 6000 - }, - { - "id" : "minecraft:cracked_polished_blackstone_bricks", - "blockRuntimeId" : 3770 - }, - { - "id" : "minecraft:gilded_blackstone", - "blockRuntimeId" : 4882 - }, - { - "id" : "minecraft:chiseled_polished_blackstone", - "blockRuntimeId" : 1131 - }, - { - "id" : "minecraft:deepslate_tiles", - "blockRuntimeId" : 4460 - }, - { - "id" : "minecraft:cracked_deepslate_tiles", - "blockRuntimeId" : 3768 - }, - { - "id" : "minecraft:deepslate_bricks", - "blockRuntimeId" : 4277 - }, - { - "id" : "minecraft:cracked_deepslate_bricks", - "blockRuntimeId" : 3767 - }, - { - "id" : "minecraft:chiseled_deepslate", - "blockRuntimeId" : 1129 - }, - { - "id" : "minecraft:cobblestone", - "blockRuntimeId" : 1318 - }, - { - "id" : "minecraft:mossy_cobblestone", - "blockRuntimeId" : 5667 - }, - { - "id" : "minecraft:cobbled_deepslate", - "blockRuntimeId" : 1143 - }, - { - "id" : "minecraft:smooth_stone", - "blockRuntimeId" : 6911 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6706 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6707 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6708 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6709 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6633 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6634 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6635 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6636 - }, - { - "id" : "minecraft:coal_block", - "blockRuntimeId" : 1141 - }, - { - "id" : "minecraft:dried_kelp_block", - "blockRuntimeId" : 4584 - }, - { - "id" : "minecraft:gold_block", - "blockRuntimeId" : 4975 - }, - { - "id" : "minecraft:iron_block", - "blockRuntimeId" : 5134 - }, - { - "id" : "minecraft:copper_block", - "blockRuntimeId" : 3677 - }, - { - "id" : "minecraft:exposed_copper", - "blockRuntimeId" : 4752 - }, - { - "id" : "minecraft:weathered_copper", - "blockRuntimeId" : 7741 - }, - { - "id" : "minecraft:oxidized_copper", - "blockRuntimeId" : 5754 - }, - { - "id" : "minecraft:waxed_copper", - "blockRuntimeId" : 7685 - }, - { - "id" : "minecraft:waxed_exposed_copper", - "blockRuntimeId" : 7699 - }, - { - "id" : "minecraft:waxed_weathered_copper", - "blockRuntimeId" : 7727 - }, - { - "id" : "minecraft:waxed_oxidized_copper", - "blockRuntimeId" : 7713 - }, - { - "id" : "minecraft:cut_copper", - "blockRuntimeId" : 3910 - }, - { - "id" : "minecraft:exposed_cut_copper", - "blockRuntimeId" : 4753 - }, - { - "id" : "minecraft:weathered_cut_copper", - "blockRuntimeId" : 7742 - }, - { - "id" : "minecraft:oxidized_cut_copper", - "blockRuntimeId" : 5755 - }, - { - "id" : "minecraft:waxed_cut_copper", - "blockRuntimeId" : 7686 - }, - { - "id" : "minecraft:waxed_exposed_cut_copper", - "blockRuntimeId" : 7700 - }, - { - "id" : "minecraft:waxed_weathered_cut_copper", - "blockRuntimeId" : 7728 - }, - { - "id" : "minecraft:waxed_oxidized_cut_copper", - "blockRuntimeId" : 7714 - }, - { - "id" : "minecraft:emerald_block", - "blockRuntimeId" : 4717 - }, - { - "id" : "minecraft:diamond_block", - "blockRuntimeId" : 4474 - }, - { - "id" : "minecraft:lapis_block", - "blockRuntimeId" : 5365 - }, - { - "id" : "minecraft:raw_iron_block", - "blockRuntimeId" : 6579 - }, - { - "id" : "minecraft:raw_copper_block", - "blockRuntimeId" : 6577 - }, - { - "id" : "minecraft:raw_gold_block", - "blockRuntimeId" : 6578 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6545 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6547 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6546 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6548 - }, - { - "id" : "minecraft:prismarine", - "blockRuntimeId" : 6438 - }, - { - "id" : "minecraft:prismarine", - "blockRuntimeId" : 6439 - }, - { - "id" : "minecraft:slime", - "blockRuntimeId" : 6864 - }, - { - "id" : "minecraft:honey_block", - "blockRuntimeId" : 5112 - }, - { - "id" : "minecraft:honeycomb_block", - "blockRuntimeId" : 5113 - }, - { - "id" : "minecraft:hay_block", - "blockRuntimeId" : 5084 - }, - { - "id" : "minecraft:bone_block", - "blockRuntimeId" : 692 - }, - { - "id" : "minecraft:nether_brick", - "blockRuntimeId" : 5688 - }, - { - "id" : "minecraft:red_nether_brick", - "blockRuntimeId" : 6624 - }, - { - "id" : "minecraft:netherite_block", - "blockRuntimeId" : 5705 - }, - { - "id" : "minecraft:lodestone", - "blockRuntimeId" : 5563 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7915 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7923 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7922 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7930 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7927 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7929 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7916 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7919 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7920 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7928 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7924 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7918 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7926 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7925 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7917 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7921 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 963 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 971 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 970 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 978 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 975 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 977 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 964 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 967 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 968 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 976 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 972 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 966 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 974 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 973 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 965 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 969 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3660 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3668 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3667 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3675 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3672 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3674 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3661 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3664 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3665 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3673 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3669 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3663 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3671 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3670 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3662 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3666 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3644 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3652 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3651 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3659 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3656 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3658 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3645 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3648 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3649 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3657 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3653 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3647 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3655 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3654 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3646 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3650 - }, - { - "id" : "minecraft:clay", - "blockRuntimeId" : 1139 - }, - { - "id" : "minecraft:hardened_clay", - "blockRuntimeId" : 5083 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7120 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7128 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7127 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7135 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7132 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7134 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7121 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7124 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7125 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7133 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7129 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7123 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7131 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7130 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7122 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7126 - }, - { - "id" : "minecraft:white_glazed_terracotta", - "blockRuntimeId" : 7800 - }, - { - "id" : "minecraft:silver_glazed_terracotta", - "blockRuntimeId" : 6846 - }, - { - "id" : "minecraft:gray_glazed_terracotta", - "blockRuntimeId" : 5010 - }, - { - "id" : "minecraft:black_glazed_terracotta", - "blockRuntimeId" : 488 - }, - { - "id" : "minecraft:brown_glazed_terracotta", - "blockRuntimeId" : 894 - }, - { - "id" : "minecraft:red_glazed_terracotta", - "blockRuntimeId" : 6601 - }, - { - "id" : "minecraft:orange_glazed_terracotta", - "blockRuntimeId" : 5748 - }, - { - "id" : "minecraft:yellow_glazed_terracotta", - "blockRuntimeId" : 7942 - }, - { - "id" : "minecraft:lime_glazed_terracotta", - "blockRuntimeId" : 5532 - }, - { - "id" : "minecraft:green_glazed_terracotta", - "blockRuntimeId" : 5026 - }, - { - "id" : "minecraft:cyan_glazed_terracotta", - "blockRuntimeId" : 3931 - }, - { - "id" : "minecraft:light_blue_glazed_terracotta", - "blockRuntimeId" : 5484 - }, - { - "id" : "minecraft:blue_glazed_terracotta", - "blockRuntimeId" : 685 - }, - { - "id" : "minecraft:purple_glazed_terracotta", - "blockRuntimeId" : 6519 - }, - { - "id" : "minecraft:magenta_glazed_terracotta", - "blockRuntimeId" : 5596 - }, - { - "id" : "minecraft:pink_glazed_terracotta", - "blockRuntimeId" : 5779 - }, - { - "id" : "minecraft:purpur_block", - "blockRuntimeId" : 6525 - }, - { - "id" : "minecraft:purpur_block", - "blockRuntimeId" : 6527 - }, - { - "id" : "minecraft:nether_wart_block", - "blockRuntimeId" : 5704 - }, - { - "id" : "minecraft:warped_wart_block", - "blockRuntimeId" : 7667 - }, - { - "id" : "minecraft:shroomlight", - "blockRuntimeId" : 6829 - }, - { - "id" : "minecraft:crimson_nylium", - "blockRuntimeId" : 3839 - }, - { - "id" : "minecraft:warped_nylium", - "blockRuntimeId" : 7597 - }, - { - "id" : "minecraft:basalt", - "blockRuntimeId" : 214 - }, - { - "id" : "minecraft:polished_basalt", - "blockRuntimeId" : 5822 - }, - { - "id" : "minecraft:smooth_basalt", - "blockRuntimeId" : 6886 - }, - { - "id" : "minecraft:soul_soil", - "blockRuntimeId" : 6956 - }, - { - "id" : "minecraft:dirt", - "blockRuntimeId" : 4484 - }, - { - "id" : "minecraft:dirt", - "blockRuntimeId" : 4485 - }, - { - "id" : "minecraft:farmland", - "blockRuntimeId" : 4766 - }, - { - "id" : "minecraft:grass", - "blockRuntimeId" : 4997 - }, - { - "id" : "minecraft:grass_path", - "blockRuntimeId" : 4998 - }, - { - "id" : "minecraft:podzol", - "blockRuntimeId" : 5803 - }, - { - "id" : "minecraft:mycelium", - "blockRuntimeId" : 5685 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7180 - }, - { - "id" : "minecraft:iron_ore", - "blockRuntimeId" : 5167 - }, - { - "id" : "minecraft:gold_ore", - "blockRuntimeId" : 4976 - }, - { - "id" : "minecraft:diamond_ore", - "blockRuntimeId" : 4475 - }, - { - "id" : "minecraft:lapis_ore", - "blockRuntimeId" : 5366 - }, - { - "id" : "minecraft:redstone_ore", - "blockRuntimeId" : 6647 - }, - { - "id" : "minecraft:coal_ore", - "blockRuntimeId" : 1142 - }, - { - "id" : "minecraft:copper_ore", - "blockRuntimeId" : 3678 - }, - { - "id" : "minecraft:emerald_ore", - "blockRuntimeId" : 4718 - }, - { - "id" : "minecraft:quartz_ore", - "blockRuntimeId" : 6558 - }, - { - "id" : "minecraft:nether_gold_ore", - "blockRuntimeId" : 5698 - }, - { - "id" : "minecraft:ancient_debris", - "blockRuntimeId" : 143 - }, - { - "id" : "minecraft:deepslate_iron_ore", - "blockRuntimeId" : 4283 - }, - { - "id" : "minecraft:deepslate_gold_ore", - "blockRuntimeId" : 4282 - }, - { - "id" : "minecraft:deepslate_diamond_ore", - "blockRuntimeId" : 4280 - }, - { - "id" : "minecraft:deepslate_lapis_ore", - "blockRuntimeId" : 4284 - }, - { - "id" : "minecraft:deepslate_redstone_ore", - "blockRuntimeId" : 4285 - }, - { - "id" : "minecraft:deepslate_emerald_ore", - "blockRuntimeId" : 4281 - }, - { - "id" : "minecraft:deepslate_coal_ore", - "blockRuntimeId" : 4278 - }, - { - "id" : "minecraft:deepslate_copper_ore", - "blockRuntimeId" : 4279 - }, - { - "id" : "minecraft:gravel", - "blockRuntimeId" : 4999 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7181 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7183 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7185 - }, - { - "id" : "minecraft:blackstone", - "blockRuntimeId" : 494 - }, - { - "id" : "minecraft:deepslate", - "blockRuntimeId" : 4100 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7182 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7184 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7186 - }, - { - "id" : "minecraft:polished_blackstone", - "blockRuntimeId" : 5825 - }, - { - "id" : "minecraft:polished_deepslate", - "blockRuntimeId" : 6203 - }, - { - "id" : "minecraft:sand", - "blockRuntimeId" : 6704 - }, - { - "id" : "minecraft:sand", - "blockRuntimeId" : 6705 - }, - { - "id" : "minecraft:cactus", - "blockRuntimeId" : 920 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5564 - }, - { - "id" : "minecraft:stripped_oak_log", - "blockRuntimeId" : 7319 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5565 - }, - { - "id" : "minecraft:stripped_spruce_log", - "blockRuntimeId" : 7322 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5566 - }, - { - "id" : "minecraft:stripped_birch_log", - "blockRuntimeId" : 7304 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5567 - }, - { - "id" : "minecraft:stripped_jungle_log", - "blockRuntimeId" : 7316 - }, - { - "id" : "minecraft:log2", - "blockRuntimeId" : 5576 - }, - { - "id" : "minecraft:stripped_acacia_log", - "blockRuntimeId" : 7301 - }, - { - "id" : "minecraft:log2", - "blockRuntimeId" : 5577 - }, - { - "id" : "minecraft:stripped_dark_oak_log", - "blockRuntimeId" : 7313 - }, - { - "id" : "minecraft:crimson_stem", - "blockRuntimeId" : 3884 - }, - { - "id" : "minecraft:stripped_crimson_stem", - "blockRuntimeId" : 7310 - }, - { - "id" : "minecraft:warped_stem", - "blockRuntimeId" : 7642 - }, - { - "id" : "minecraft:stripped_warped_stem", - "blockRuntimeId" : 7328 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7807 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7813 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7808 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7814 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7809 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7815 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7810 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7816 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7811 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7817 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7812 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7818 - }, - { - "id" : "minecraft:crimson_hyphae", - "blockRuntimeId" : 3836 - }, - { - "id" : "minecraft:stripped_crimson_hyphae", - "blockRuntimeId" : 7307 - }, - { - "id" : "minecraft:warped_hyphae", - "blockRuntimeId" : 7594 - }, - { - "id" : "minecraft:stripped_warped_hyphae", - "blockRuntimeId" : 7325 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5410 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5411 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5412 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5413 - }, - { - "id" : "minecraft:leaves2", - "blockRuntimeId" : 5426 - }, - { - "id" : "minecraft:leaves2", - "blockRuntimeId" : 5427 - }, - { - "id" : "minecraft:azalea_leaves", - "blockRuntimeId" : 169 - }, - { - "id" : "minecraft:azalea_leaves_flowered", - "blockRuntimeId" : 173 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6718 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6719 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6720 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6721 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6722 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6723 - }, - { - "id" : "minecraft:bee_nest", - "blockRuntimeId" : 236 - }, - { - "id" : "minecraft:wheat_seeds" - }, - { - "id" : "minecraft:pumpkin_seeds" - }, - { - "id" : "minecraft:melon_seeds" - }, - { - "id" : "minecraft:beetroot_seeds" - }, - { - "id" : "minecraft:wheat" - }, - { - "id" : "minecraft:beetroot" - }, - { - "id" : "minecraft:potato" - }, - { - "id" : "minecraft:poisonous_potato" - }, - { - "id" : "minecraft:carrot" - }, - { - "id" : "minecraft:golden_carrot" - }, - { - "id" : "minecraft:apple" - }, - { - "id" : "minecraft:golden_apple" - }, - { - "id" : "minecraft:enchanted_golden_apple" - }, - { - "id" : "minecraft:melon_block", - "blockRuntimeId" : 5609 - }, - { - "id" : "minecraft:melon_slice" - }, - { - "id" : "minecraft:glistering_melon_slice" - }, - { - "id" : "minecraft:sweet_berries" - }, - { - "id" : "minecraft:glow_berries" - }, - { - "id" : "minecraft:pumpkin", - "blockRuntimeId" : 6457 - }, - { - "id" : "minecraft:carved_pumpkin", - "blockRuntimeId" : 988 - }, - { - "id" : "minecraft:lit_pumpkin", - "blockRuntimeId" : 5551 - }, - { - "id" : "minecraft:honeycomb" - }, - { - "id" : "minecraft:tallgrass", - "blockRuntimeId" : 7349 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4504 - }, - { - "id" : "minecraft:tallgrass", - "blockRuntimeId" : 7348 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4503 - }, - { - "id" : "minecraft:nether_sprouts" - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3682 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3680 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3681 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3679 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3683 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3687 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3685 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3686 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3684 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3688 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3702 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3700 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3701 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3699 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3703 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3712 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3710 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3711 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3709 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3713 - }, - { - "id" : "minecraft:kelp" - }, - { - "id" : "minecraft:seagrass", - "blockRuntimeId" : 6825 - }, - { - "id" : "minecraft:crimson_roots", - "blockRuntimeId" : 3857 - }, - { - "id" : "minecraft:warped_roots", - "blockRuntimeId" : 7615 - }, - { - "id" : "minecraft:yellow_flower", - "blockRuntimeId" : 7941 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6590 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6591 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6592 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6593 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6594 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6595 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6596 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6597 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6598 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6599 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6600 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4501 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4502 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4505 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4506 - }, - { - "id" : "minecraft:wither_rose", - "blockRuntimeId" : 7806 - }, - { - "id" : "minecraft:white_dye" - }, - { - "id" : "minecraft:light_gray_dye" - }, - { - "id" : "minecraft:gray_dye" - }, - { - "id" : "minecraft:black_dye" - }, - { - "id" : "minecraft:brown_dye" - }, - { - "id" : "minecraft:red_dye" - }, - { - "id" : "minecraft:orange_dye" - }, - { - "id" : "minecraft:yellow_dye" - }, - { - "id" : "minecraft:lime_dye" - }, - { - "id" : "minecraft:green_dye" - }, - { - "id" : "minecraft:cyan_dye" - }, - { - "id" : "minecraft:light_blue_dye" - }, - { - "id" : "minecraft:blue_dye" - }, - { - "id" : "minecraft:purple_dye" - }, - { - "id" : "minecraft:magenta_dye" - }, - { - "id" : "minecraft:pink_dye" - }, - { - "id" : "minecraft:ink_sac" - }, - { - "id" : "minecraft:glow_ink_sac" - }, - { - "id" : "minecraft:cocoa_beans" - }, - { - "id" : "minecraft:lapis_lazuli" - }, - { - "id" : "minecraft:bone_meal" - }, - { - "id" : "minecraft:vine", - "blockRuntimeId" : 7502 - }, - { - "id" : "minecraft:weeping_vines", - "blockRuntimeId" : 7756 - }, - { - "id" : "minecraft:twisting_vines", - "blockRuntimeId" : 7430 - }, - { - "id" : "minecraft:waterlily", - "blockRuntimeId" : 7684 - }, - { - "id" : "minecraft:deadbush", - "blockRuntimeId" : 4099 - }, - { - "id" : "minecraft:bamboo", - "blockRuntimeId" : 177 - }, - { - "id" : "minecraft:snow", - "blockRuntimeId" : 6912 - }, - { - "id" : "minecraft:ice", - "blockRuntimeId" : 5126 - }, - { - "id" : "minecraft:packed_ice", - "blockRuntimeId" : 5768 - }, - { - "id" : "minecraft:blue_ice", - "blockRuntimeId" : 691 - }, - { - "id" : "minecraft:snow_layer", - "blockRuntimeId" : 6913 - }, - { - "id" : "minecraft:pointed_dripstone", - "blockRuntimeId" : 5809 - }, - { - "id" : "minecraft:dripstone_block", - "blockRuntimeId" : 4585 - }, - { - "id" : "minecraft:moss_carpet", - "blockRuntimeId" : 5666 - }, - { - "id" : "minecraft:moss_block", - "blockRuntimeId" : 5665 - }, - { - "id" : "minecraft:dirt_with_roots", - "blockRuntimeId" : 4486 - }, - { - "id" : "minecraft:hanging_roots", - "blockRuntimeId" : 5048 - }, - { - "id" : "minecraft:big_dripleaf", - "blockRuntimeId" : 328 - }, - { - "id" : "minecraft:small_dripleaf_block", - "blockRuntimeId" : 6878 - }, - { - "id" : "minecraft:spore_blossom", - "blockRuntimeId" : 6965 - }, - { - "id" : "minecraft:azalea", - "blockRuntimeId" : 168 - }, - { - "id" : "minecraft:flowering_azalea", - "blockRuntimeId" : 4815 - }, - { - "id" : "minecraft:glow_lichen", - "blockRuntimeId" : 4972 - }, - { - "id" : "minecraft:amethyst_block", - "blockRuntimeId" : 136 - }, - { - "id" : "minecraft:budding_amethyst", - "blockRuntimeId" : 919 - }, - { - "id" : "minecraft:amethyst_cluster", - "blockRuntimeId" : 137 - }, - { - "id" : "minecraft:large_amethyst_bud", - "blockRuntimeId" : 5367 - }, - { - "id" : "minecraft:medium_amethyst_bud", - "blockRuntimeId" : 5603 - }, - { - "id" : "minecraft:small_amethyst_bud", - "blockRuntimeId" : 6865 - }, - { - "id" : "minecraft:tuff", - "blockRuntimeId" : 7417 - }, - { - "id" : "minecraft:calcite", - "blockRuntimeId" : 943 - }, - { - "id" : "minecraft:chicken" - }, - { - "id" : "minecraft:porkchop" - }, - { - "id" : "minecraft:beef" - }, - { - "id" : "minecraft:mutton" - }, - { - "id" : "minecraft:rabbit" - }, - { - "id" : "minecraft:cod" - }, - { - "id" : "minecraft:salmon" - }, - { - "id" : "minecraft:tropical_fish" - }, - { - "id" : "minecraft:pufferfish" - }, - { - "id" : "minecraft:brown_mushroom", - "blockRuntimeId" : 900 - }, - { - "id" : "minecraft:red_mushroom", - "blockRuntimeId" : 6607 - }, - { - "id" : "minecraft:crimson_fungus", - "blockRuntimeId" : 3835 - }, - { - "id" : "minecraft:warped_fungus", - "blockRuntimeId" : 7593 - }, - { - "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 915 - }, - { - "id" : "minecraft:red_mushroom_block", - "blockRuntimeId" : 6622 - }, - { - "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 916 - }, - { - "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 901 - }, - { - "id" : "minecraft:egg" - }, - { - "id" : "minecraft:sugar_cane" - }, - { - "id" : "minecraft:sugar" - }, - { - "id" : "minecraft:rotten_flesh" - }, - { - "id" : "minecraft:bone" - }, - { - "id" : "minecraft:web", - "blockRuntimeId" : 7755 - }, - { - "id" : "minecraft:spider_eye" - }, - { - "id" : "minecraft:mob_spawner", - "blockRuntimeId" : 5658 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5659 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5660 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5661 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5662 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5663 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5664 - }, - { - "id" : "minecraft:infested_deepslate", - "blockRuntimeId" : 5127 - }, - { - "id" : "minecraft:dragon_egg", - "blockRuntimeId" : 4583 - }, - { - "id" : "minecraft:turtle_egg", - "blockRuntimeId" : 7418 - }, - { - "id" : "minecraft:chicken_spawn_egg" - }, - { - "id" : "minecraft:bee_spawn_egg" - }, - { - "id" : "minecraft:cow_spawn_egg" - }, - { - "id" : "minecraft:pig_spawn_egg" - }, - { - "id" : "minecraft:sheep_spawn_egg" - }, - { - "id" : "minecraft:wolf_spawn_egg" - }, - { - "id" : "minecraft:polar_bear_spawn_egg" - }, - { - "id" : "minecraft:ocelot_spawn_egg" - }, - { - "id" : "minecraft:cat_spawn_egg" - }, - { - "id" : "minecraft:mooshroom_spawn_egg" - }, - { - "id" : "minecraft:bat_spawn_egg" - }, - { - "id" : "minecraft:parrot_spawn_egg" - }, - { - "id" : "minecraft:rabbit_spawn_egg" - }, - { - "id" : "minecraft:llama_spawn_egg" - }, - { - "id" : "minecraft:horse_spawn_egg" - }, - { - "id" : "minecraft:donkey_spawn_egg" - }, - { - "id" : "minecraft:mule_spawn_egg" - }, - { - "id" : "minecraft:skeleton_horse_spawn_egg" - }, - { - "id" : "minecraft:zombie_horse_spawn_egg" - }, - { - "id" : "minecraft:tropical_fish_spawn_egg" - }, - { - "id" : "minecraft:cod_spawn_egg" - }, - { - "id" : "minecraft:pufferfish_spawn_egg" - }, - { - "id" : "minecraft:salmon_spawn_egg" - }, - { - "id" : "minecraft:dolphin_spawn_egg" - }, - { - "id" : "minecraft:turtle_spawn_egg" - }, - { - "id" : "minecraft:panda_spawn_egg" - }, - { - "id" : "minecraft:fox_spawn_egg" - }, - { - "id" : "minecraft:creeper_spawn_egg" - }, - { - "id" : "minecraft:enderman_spawn_egg" - }, - { - "id" : "minecraft:silverfish_spawn_egg" - }, - { - "id" : "minecraft:skeleton_spawn_egg" - }, - { - "id" : "minecraft:wither_skeleton_spawn_egg" - }, - { - "id" : "minecraft:stray_spawn_egg" - }, - { - "id" : "minecraft:slime_spawn_egg" - }, - { - "id" : "minecraft:spider_spawn_egg" - }, - { - "id" : "minecraft:zombie_spawn_egg" - }, - { - "id" : "minecraft:zombie_pigman_spawn_egg" - }, - { - "id" : "minecraft:husk_spawn_egg" - }, - { - "id" : "minecraft:drowned_spawn_egg" - }, - { - "id" : "minecraft:squid_spawn_egg" - }, - { - "id" : "minecraft:glow_squid_spawn_egg" - }, - { - "id" : "minecraft:cave_spider_spawn_egg" - }, - { - "id" : "minecraft:witch_spawn_egg" - }, - { - "id" : "minecraft:guardian_spawn_egg" - }, - { - "id" : "minecraft:elder_guardian_spawn_egg" - }, - { - "id" : "minecraft:endermite_spawn_egg" - }, - { - "id" : "minecraft:magma_cube_spawn_egg" - }, - { - "id" : "minecraft:strider_spawn_egg" - }, - { - "id" : "minecraft:hoglin_spawn_egg" - }, - { - "id" : "minecraft:piglin_spawn_egg" - }, - { - "id" : "minecraft:zoglin_spawn_egg" - }, - { - "id" : "minecraft:piglin_brute_spawn_egg" - }, - { - "id" : "minecraft:goat_spawn_egg" - }, - { - "id" : "minecraft:axolotl_spawn_egg" - }, - { - "id" : "minecraft:ghast_spawn_egg" - }, - { - "id" : "minecraft:blaze_spawn_egg" - }, - { - "id" : "minecraft:shulker_spawn_egg" - }, - { - "id" : "minecraft:vindicator_spawn_egg" - }, - { - "id" : "minecraft:evoker_spawn_egg" - }, - { - "id" : "minecraft:vex_spawn_egg" - }, - { - "id" : "minecraft:villager_spawn_egg" - }, - { - "id" : "minecraft:wandering_trader_spawn_egg" - }, - { - "id" : "minecraft:zombie_villager_spawn_egg" - }, - { - "id" : "minecraft:phantom_spawn_egg" - }, - { - "id" : "minecraft:pillager_spawn_egg" - }, - { - "id" : "minecraft:ravager_spawn_egg" - }, - { - "id" : "minecraft:obsidian", - "blockRuntimeId" : 5737 - }, - { - "id" : "minecraft:crying_obsidian", - "blockRuntimeId" : 3909 - }, - { - "id" : "minecraft:bedrock", - "blockRuntimeId" : 234 - }, - { - "id" : "minecraft:soul_sand", - "blockRuntimeId" : 6955 - }, - { - "id" : "minecraft:netherrack", - "blockRuntimeId" : 5706 - }, - { - "id" : "minecraft:magma", - "blockRuntimeId" : 5602 - }, - { - "id" : "minecraft:nether_wart" - }, - { - "id" : "minecraft:end_stone", - "blockRuntimeId" : 4745 - }, - { - "id" : "minecraft:chorus_flower", - "blockRuntimeId" : 1132 - }, - { - "id" : "minecraft:chorus_plant", - "blockRuntimeId" : 1138 - }, - { - "id" : "minecraft:chorus_fruit" - }, - { - "id" : "minecraft:popped_chorus_fruit" - }, - { - "id" : "minecraft:sponge", - "blockRuntimeId" : 6963 - }, - { - "id" : "minecraft:sponge", - "blockRuntimeId" : 6964 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3689 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3690 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3691 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3692 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3693 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3694 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3695 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3696 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3697 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3698 - }, - { - "id" : "minecraft:leather_helmet" - }, - { - "id" : "minecraft:chainmail_helmet" - }, - { - "id" : "minecraft:iron_helmet" - }, - { - "id" : "minecraft:golden_helmet" - }, - { - "id" : "minecraft:diamond_helmet" - }, - { - "id" : "minecraft:netherite_helmet" - }, - { - "id" : "minecraft:leather_chestplate" - }, - { - "id" : "minecraft:chainmail_chestplate" - }, - { - "id" : "minecraft:iron_chestplate" - }, - { - "id" : "minecraft:golden_chestplate" - }, - { - "id" : "minecraft:diamond_chestplate" - }, - { - "id" : "minecraft:netherite_chestplate" - }, - { - "id" : "minecraft:leather_leggings" - }, - { - "id" : "minecraft:chainmail_leggings" - }, - { - "id" : "minecraft:iron_leggings" - }, - { - "id" : "minecraft:golden_leggings" - }, - { - "id" : "minecraft:diamond_leggings" - }, - { - "id" : "minecraft:netherite_leggings" - }, - { - "id" : "minecraft:leather_boots" - }, - { - "id" : "minecraft:chainmail_boots" - }, - { - "id" : "minecraft:iron_boots" - }, - { - "id" : "minecraft:golden_boots" - }, - { - "id" : "minecraft:diamond_boots" - }, - { - "id" : "minecraft:netherite_boots" - }, - { - "id" : "minecraft:wooden_sword" - }, - { - "id" : "minecraft:stone_sword" - }, - { - "id" : "minecraft:iron_sword" - }, - { - "id" : "minecraft:golden_sword" - }, - { - "id" : "minecraft:diamond_sword" - }, - { - "id" : "minecraft:netherite_sword" - }, - { - "id" : "minecraft:wooden_axe" - }, - { - "id" : "minecraft:stone_axe" - }, - { - "id" : "minecraft:iron_axe" - }, - { - "id" : "minecraft:golden_axe" - }, - { - "id" : "minecraft:diamond_axe" - }, - { - "id" : "minecraft:netherite_axe" - }, - { - "id" : "minecraft:wooden_pickaxe" - }, - { - "id" : "minecraft:stone_pickaxe" - }, - { - "id" : "minecraft:iron_pickaxe" - }, - { - "id" : "minecraft:golden_pickaxe" - }, - { - "id" : "minecraft:diamond_pickaxe" - }, - { - "id" : "minecraft:netherite_pickaxe" - }, - { - "id" : "minecraft:wooden_shovel" - }, - { - "id" : "minecraft:stone_shovel" - }, - { - "id" : "minecraft:iron_shovel" - }, - { - "id" : "minecraft:golden_shovel" - }, - { - "id" : "minecraft:diamond_shovel" - }, - { - "id" : "minecraft:netherite_shovel" - }, - { - "id" : "minecraft:wooden_hoe" - }, - { - "id" : "minecraft:stone_hoe" - }, - { - "id" : "minecraft:iron_hoe" - }, - { - "id" : "minecraft:golden_hoe" - }, - { - "id" : "minecraft:diamond_hoe" - }, - { - "id" : "minecraft:netherite_hoe" - }, - { - "id" : "minecraft:bow" - }, - { - "id" : "minecraft:crossbow" - }, - { - "id" : "minecraft:arrow" - }, - { - "id" : "minecraft:arrow", - "damage" : 6 - }, - { - "id" : "minecraft:arrow", - "damage" : 7 - }, - { - "id" : "minecraft:arrow", - "damage" : 8 - }, - { - "id" : "minecraft:arrow", - "damage" : 9 - }, - { - "id" : "minecraft:arrow", - "damage" : 10 - }, - { - "id" : "minecraft:arrow", - "damage" : 11 - }, - { - "id" : "minecraft:arrow", - "damage" : 12 - }, - { - "id" : "minecraft:arrow", - "damage" : 13 - }, - { - "id" : "minecraft:arrow", - "damage" : 14 - }, - { - "id" : "minecraft:arrow", - "damage" : 15 - }, - { - "id" : "minecraft:arrow", - "damage" : 16 - }, - { - "id" : "minecraft:arrow", - "damage" : 17 - }, - { - "id" : "minecraft:arrow", - "damage" : 18 - }, - { - "id" : "minecraft:arrow", - "damage" : 19 - }, - { - "id" : "minecraft:arrow", - "damage" : 20 - }, - { - "id" : "minecraft:arrow", - "damage" : 21 - }, - { - "id" : "minecraft:arrow", - "damage" : 22 - }, - { - "id" : "minecraft:arrow", - "damage" : 23 - }, - { - "id" : "minecraft:arrow", - "damage" : 24 - }, - { - "id" : "minecraft:arrow", - "damage" : 25 - }, - { - "id" : "minecraft:arrow", - "damage" : 26 - }, - { - "id" : "minecraft:arrow", - "damage" : 27 - }, - { - "id" : "minecraft:arrow", - "damage" : 28 - }, - { - "id" : "minecraft:arrow", - "damage" : 29 - }, - { - "id" : "minecraft:arrow", - "damage" : 30 - }, - { - "id" : "minecraft:arrow", - "damage" : 31 - }, - { - "id" : "minecraft:arrow", - "damage" : 32 - }, - { - "id" : "minecraft:arrow", - "damage" : 33 - }, - { - "id" : "minecraft:arrow", - "damage" : 34 - }, - { - "id" : "minecraft:arrow", - "damage" : 35 - }, - { - "id" : "minecraft:arrow", - "damage" : 36 - }, - { - "id" : "minecraft:arrow", - "damage" : 37 - }, - { - "id" : "minecraft:arrow", - "damage" : 38 - }, - { - "id" : "minecraft:arrow", - "damage" : 39 - }, - { - "id" : "minecraft:arrow", - "damage" : 40 - }, - { - "id" : "minecraft:arrow", - "damage" : 41 - }, - { - "id" : "minecraft:arrow", - "damage" : 42 - }, - { - "id" : "minecraft:arrow", - "damage" : 43 - }, - { - "id" : "minecraft:shield" - }, - { - "id" : "minecraft:cooked_chicken" - }, - { - "id" : "minecraft:cooked_porkchop" - }, - { - "id" : "minecraft:cooked_beef" - }, - { - "id" : "minecraft:cooked_mutton" - }, - { - "id" : "minecraft:cooked_rabbit" - }, - { - "id" : "minecraft:cooked_cod" - }, - { - "id" : "minecraft:cooked_salmon" - }, - { - "id" : "minecraft:bread" - }, - { - "id" : "minecraft:mushroom_stew" - }, - { - "id" : "minecraft:beetroot_soup" - }, - { - "id" : "minecraft:rabbit_stew" - }, - { - "id" : "minecraft:baked_potato" - }, - { - "id" : "minecraft:cookie" - }, - { - "id" : "minecraft:pumpkin_pie" - }, - { - "id" : "minecraft:cake" - }, - { - "id" : "minecraft:dried_kelp" - }, - { - "id" : "minecraft:fishing_rod" - }, - { - "id" : "minecraft:carrot_on_a_stick" - }, - { - "id" : "minecraft:warped_fungus_on_a_stick" - }, - { - "id" : "minecraft:snowball" - }, - { - "id" : "minecraft:shears" - }, - { - "id" : "minecraft:flint_and_steel" - }, - { - "id" : "minecraft:lead" - }, - { - "id" : "minecraft:clock" - }, - { - "id" : "minecraft:compass" - }, - { - "id" : "minecraft:empty_map" - }, - { - "id" : "minecraft:empty_map", - "damage" : 2 - }, - { - "id" : "minecraft:saddle" - }, - { - "id" : "minecraft:leather_horse_armor" - }, - { - "id" : "minecraft:iron_horse_armor" - }, - { - "id" : "minecraft:golden_horse_armor" - }, - { - "id" : "minecraft:diamond_horse_armor" - }, - { - "id" : "minecraft:trident" - }, - { - "id" : "minecraft:turtle_helmet" - }, - { - "id" : "minecraft:elytra" - }, - { - "id" : "minecraft:totem_of_undying" - }, - { - "id" : "minecraft:glass_bottle" - }, - { - "id" : "minecraft:experience_bottle" - }, - { - "id" : "minecraft:potion" - }, - { - "id" : "minecraft:potion", - "damage" : 1 - }, - { - "id" : "minecraft:potion", - "damage" : 2 - }, - { - "id" : "minecraft:potion", - "damage" : 3 - }, - { - "id" : "minecraft:potion", - "damage" : 4 - }, - { - "id" : "minecraft:potion", - "damage" : 5 - }, - { - "id" : "minecraft:potion", - "damage" : 6 - }, - { - "id" : "minecraft:potion", - "damage" : 7 - }, - { - "id" : "minecraft:potion", - "damage" : 8 - }, - { - "id" : "minecraft:potion", - "damage" : 9 - }, - { - "id" : "minecraft:potion", - "damage" : 10 - }, - { - "id" : "minecraft:potion", - "damage" : 11 - }, - { - "id" : "minecraft:potion", - "damage" : 12 - }, - { - "id" : "minecraft:potion", - "damage" : 13 - }, - { - "id" : "minecraft:potion", - "damage" : 14 - }, - { - "id" : "minecraft:potion", - "damage" : 15 - }, - { - "id" : "minecraft:potion", - "damage" : 16 - }, - { - "id" : "minecraft:potion", - "damage" : 17 - }, - { - "id" : "minecraft:potion", - "damage" : 18 - }, - { - "id" : "minecraft:potion", - "damage" : 19 - }, - { - "id" : "minecraft:potion", - "damage" : 20 - }, - { - "id" : "minecraft:potion", - "damage" : 21 - }, - { - "id" : "minecraft:potion", - "damage" : 22 - }, - { - "id" : "minecraft:potion", - "damage" : 23 - }, - { - "id" : "minecraft:potion", - "damage" : 24 - }, - { - "id" : "minecraft:potion", - "damage" : 25 - }, - { - "id" : "minecraft:potion", - "damage" : 26 - }, - { - "id" : "minecraft:potion", - "damage" : 27 - }, - { - "id" : "minecraft:potion", - "damage" : 28 - }, - { - "id" : "minecraft:potion", - "damage" : 29 - }, - { - "id" : "minecraft:potion", - "damage" : 30 - }, - { - "id" : "minecraft:potion", - "damage" : 31 - }, - { - "id" : "minecraft:potion", - "damage" : 32 - }, - { - "id" : "minecraft:potion", - "damage" : 33 - }, - { - "id" : "minecraft:potion", - "damage" : 34 - }, - { - "id" : "minecraft:potion", - "damage" : 35 - }, - { - "id" : "minecraft:potion", - "damage" : 36 - }, - { - "id" : "minecraft:potion", - "damage" : 37 - }, - { - "id" : "minecraft:potion", - "damage" : 38 - }, - { - "id" : "minecraft:potion", - "damage" : 39 - }, - { - "id" : "minecraft:potion", - "damage" : 40 - }, - { - "id" : "minecraft:potion", - "damage" : 41 - }, - { - "id" : "minecraft:potion", - "damage" : 42 - }, - { - "id" : "minecraft:splash_potion" - }, - { - "id" : "minecraft:splash_potion", - "damage" : 1 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 2 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 3 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 4 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 5 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 6 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 7 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 8 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 9 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 10 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 11 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 12 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 13 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 14 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 15 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 16 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 17 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 18 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 19 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 20 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 21 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 22 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 23 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 24 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 25 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 26 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 27 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 28 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 29 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 30 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 31 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 32 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 33 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 34 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 35 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 36 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 37 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 38 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 39 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 40 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 41 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 42 - }, - { - "id" : "minecraft:lingering_potion" - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 1 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 2 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 3 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 4 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 5 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 6 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 7 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 8 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 9 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 10 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 11 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 12 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 13 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 14 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 15 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 16 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 17 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 18 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 19 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 20 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 21 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 22 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 23 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 24 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 25 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 26 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 27 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 28 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 29 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 30 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 31 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 32 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 33 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 34 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 35 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 36 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 37 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 38 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 39 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 40 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 41 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 42 - }, - { - "id" : "minecraft:spyglass" - }, - { - "id" : "minecraft:stick" - }, - { - "id" : "minecraft:bed" - }, - { - "id" : "minecraft:bed", - "damage" : 8 - }, - { - "id" : "minecraft:bed", - "damage" : 7 - }, - { - "id" : "minecraft:bed", - "damage" : 15 - }, - { - "id" : "minecraft:bed", - "damage" : 12 - }, - { - "id" : "minecraft:bed", - "damage" : 14 - }, - { - "id" : "minecraft:bed", - "damage" : 1 - }, - { - "id" : "minecraft:bed", - "damage" : 4 - }, - { - "id" : "minecraft:bed", - "damage" : 5 - }, - { - "id" : "minecraft:bed", - "damage" : 13 - }, - { - "id" : "minecraft:bed", - "damage" : 9 - }, - { - "id" : "minecraft:bed", - "damage" : 3 - }, - { - "id" : "minecraft:bed", - "damage" : 11 - }, - { - "id" : "minecraft:bed", - "damage" : 10 - }, - { - "id" : "minecraft:bed", - "damage" : 2 - }, - { - "id" : "minecraft:bed", - "damage" : 6 - }, - { - "id" : "minecraft:torch", - "blockRuntimeId" : 7357 - }, - { - "id" : "minecraft:soul_torch", - "blockRuntimeId" : 6957 - }, - { - "id" : "minecraft:sea_pickle", - "blockRuntimeId" : 6817 - }, - { - "id" : "minecraft:lantern", - "blockRuntimeId" : 5363 - }, - { - "id" : "minecraft:soul_lantern", - "blockRuntimeId" : 6953 - }, - { - "id" : "minecraft:candle", - "blockRuntimeId" : 953 - }, - { - "id" : "minecraft:white_candle", - "blockRuntimeId" : 7790 - }, - { - "id" : "minecraft:orange_candle", - "blockRuntimeId" : 5738 - }, - { - "id" : "minecraft:magenta_candle", - "blockRuntimeId" : 5586 - }, - { - "id" : "minecraft:light_blue_candle", - "blockRuntimeId" : 5474 - }, - { - "id" : "minecraft:yellow_candle", - "blockRuntimeId" : 7931 - }, - { - "id" : "minecraft:lime_candle", - "blockRuntimeId" : 5522 - }, - { - "id" : "minecraft:pink_candle", - "blockRuntimeId" : 5769 - }, - { - "id" : "minecraft:gray_candle", - "blockRuntimeId" : 5000 - }, - { - "id" : "minecraft:light_gray_candle", - "blockRuntimeId" : 5490 - }, - { - "id" : "minecraft:cyan_candle", - "blockRuntimeId" : 3921 - }, - { - "id" : "minecraft:purple_candle", - "blockRuntimeId" : 6509 - }, - { - "id" : "minecraft:blue_candle", - "blockRuntimeId" : 675 - }, - { - "id" : "minecraft:brown_candle", - "blockRuntimeId" : 884 - }, - { - "id" : "minecraft:green_candle", - "blockRuntimeId" : 5016 - }, - { - "id" : "minecraft:red_candle", - "blockRuntimeId" : 6580 - }, - { - "id" : "minecraft:black_candle", - "blockRuntimeId" : 478 - }, - { - "id" : "minecraft:crafting_table", - "blockRuntimeId" : 3771 - }, - { - "id" : "minecraft:cartography_table", - "blockRuntimeId" : 987 - }, - { - "id" : "minecraft:fletching_table", - "blockRuntimeId" : 4812 - }, - { - "id" : "minecraft:smithing_table", - "blockRuntimeId" : 6879 - }, - { - "id" : "minecraft:beehive", - "blockRuntimeId" : 260 - }, - { - "id" : "minecraft:campfire" - }, - { - "id" : "minecraft:soul_campfire" - }, - { - "id" : "minecraft:furnace", - "blockRuntimeId" : 4876 - }, - { - "id" : "minecraft:blast_furnace", - "blockRuntimeId" : 669 - }, - { - "id" : "minecraft:smoker", - "blockRuntimeId" : 6880 - }, - { - "id" : "minecraft:respawn_anchor", - "blockRuntimeId" : 6699 - }, - { - "id" : "minecraft:brewing_stand" - }, - { - "id" : "minecraft:anvil", - "blockRuntimeId" : 152 - }, - { - "id" : "minecraft:anvil", - "blockRuntimeId" : 156 - }, - { - "id" : "minecraft:anvil", - "blockRuntimeId" : 160 - }, - { - "id" : "minecraft:grindstone", - "blockRuntimeId" : 5032 - }, - { - "id" : "minecraft:enchanting_table", - "blockRuntimeId" : 4719 - }, - { - "id" : "minecraft:bookshelf", - "blockRuntimeId" : 704 - }, - { - "id" : "minecraft:lectern", - "blockRuntimeId" : 5434 - }, - { - "id" : "minecraft:cauldron" - }, - { - "id" : "minecraft:composter", - "blockRuntimeId" : 3635 - }, - { - "id" : "minecraft:chest", - "blockRuntimeId" : 1123 - }, - { - "id" : "minecraft:trapped_chest", - "blockRuntimeId" : 7379 - }, - { - "id" : "minecraft:ender_chest", - "blockRuntimeId" : 4746 - }, - { - "id" : "minecraft:barrel", - "blockRuntimeId" : 201 - }, - { - "id" : "minecraft:undyed_shulker_box", - "blockRuntimeId" : 7462 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6830 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6838 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6837 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6845 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6842 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6844 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6831 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6834 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6835 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6843 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6839 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6833 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6841 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6840 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6832 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6836 - }, - { - "id" : "minecraft:armor_stand" - }, - { - "id" : "minecraft:noteblock", - "blockRuntimeId" : 5716 - }, - { - "id" : "minecraft:jukebox", - "blockRuntimeId" : 5208 - }, - { - "id" : "minecraft:music_disc_13" - }, - { - "id" : "minecraft:music_disc_cat" - }, - { - "id" : "minecraft:music_disc_blocks" - }, - { - "id" : "minecraft:music_disc_chirp" - }, - { - "id" : "minecraft:music_disc_far" - }, - { - "id" : "minecraft:music_disc_mall" - }, - { - "id" : "minecraft:music_disc_mellohi" - }, - { - "id" : "minecraft:music_disc_stal" - }, - { - "id" : "minecraft:music_disc_strad" - }, - { - "id" : "minecraft:music_disc_ward" - }, - { - "id" : "minecraft:music_disc_11" - }, - { - "id" : "minecraft:music_disc_wait" - }, - { - "id" : "minecraft:music_disc_otherside" - }, - { - "id" : "minecraft:music_disc_pigstep" - }, - { - "id" : "minecraft:glowstone_dust" - }, - { - "id" : "minecraft:glowstone", - "blockRuntimeId" : 4974 - }, - { - "id" : "minecraft:redstone_lamp", - "blockRuntimeId" : 6646 - }, - { - "id" : "minecraft:sealantern", - "blockRuntimeId" : 6828 - }, - { - "id" : "minecraft:oak_sign" - }, - { - "id" : "minecraft:spruce_sign" - }, - { - "id" : "minecraft:birch_sign" - }, - { - "id" : "minecraft:jungle_sign" - }, - { - "id" : "minecraft:acacia_sign" - }, - { - "id" : "minecraft:dark_oak_sign" - }, - { - "id" : "minecraft:crimson_sign" - }, - { - "id" : "minecraft:warped_sign" - }, - { - "id" : "minecraft:painting" - }, - { - "id" : "minecraft:frame" - }, - { - "id" : "minecraft:glow_frame" - }, - { - "id" : "minecraft:honey_bottle" - }, - { - "id" : "minecraft:flower_pot" - }, - { - "id" : "minecraft:bowl" - }, - { - "id" : "minecraft:bucket" - }, - { - "id" : "minecraft:milk_bucket" - }, - { - "id" : "minecraft:water_bucket" - }, - { - "id" : "minecraft:lava_bucket" - }, - { - "id" : "minecraft:cod_bucket" - }, - { - "id" : "minecraft:salmon_bucket" - }, - { - "id" : "minecraft:tropical_fish_bucket" - }, - { - "id" : "minecraft:pufferfish_bucket" - }, - { - "id" : "minecraft:powder_snow_bucket" - }, - { - "id" : "minecraft:axolotl_bucket" - }, - { - "id" : "minecraft:skull", - "damage" : 3 - }, - { - "id" : "minecraft:skull", - "damage" : 2 - }, - { - "id" : "minecraft:skull", - "damage" : 4 - }, - { - "id" : "minecraft:skull", - "damage" : 5 - }, - { - "id" : "minecraft:skull" - }, - { - "id" : "minecraft:skull", - "damage" : 1 - }, - { - "id" : "minecraft:beacon", - "blockRuntimeId" : 217 - }, - { - "id" : "minecraft:bell", - "blockRuntimeId" : 292 - }, - { - "id" : "minecraft:conduit", - "blockRuntimeId" : 3676 - }, - { - "id" : "minecraft:stonecutter_block", - "blockRuntimeId" : 7295 - }, - { - "id" : "minecraft:end_portal_frame", - "blockRuntimeId" : 4731 - }, - { - "id" : "minecraft:coal" - }, - { - "id" : "minecraft:charcoal" - }, - { - "id" : "minecraft:diamond" - }, - { - "id" : "minecraft:iron_nugget" - }, - { - "id" : "minecraft:raw_iron" - }, - { - "id" : "minecraft:raw_gold" - }, - { - "id" : "minecraft:raw_copper" - }, - { - "id" : "minecraft:copper_ingot" - }, - { - "id" : "minecraft:iron_ingot" - }, - { - "id" : "minecraft:netherite_scrap" - }, - { - "id" : "minecraft:netherite_ingot" - }, - { - "id" : "minecraft:gold_nugget" - }, - { - "id" : "minecraft:gold_ingot" - }, - { - "id" : "minecraft:emerald" - }, - { - "id" : "minecraft:quartz" - }, - { - "id" : "minecraft:clay_ball" - }, - { - "id" : "minecraft:brick" - }, - { - "id" : "minecraft:netherbrick" - }, - { - "id" : "minecraft:prismarine_shard" - }, - { - "id" : "minecraft:amethyst_shard" - }, - { - "id" : "minecraft:prismarine_crystals" - }, - { - "id" : "minecraft:nautilus_shell" - }, - { - "id" : "minecraft:heart_of_the_sea" - }, - { - "id" : "minecraft:scute" - }, - { - "id" : "minecraft:phantom_membrane" - }, - { - "id" : "minecraft:string" - }, - { - "id" : "minecraft:feather" - }, - { - "id" : "minecraft:flint" - }, - { - "id" : "minecraft:gunpowder" - }, - { - "id" : "minecraft:leather" - }, - { - "id" : "minecraft:rabbit_hide" - }, - { - "id" : "minecraft:rabbit_foot" - }, - { - "id" : "minecraft:fire_charge" - }, - { - "id" : "minecraft:blaze_rod" - }, - { - "id" : "minecraft:blaze_powder" - }, - { - "id" : "minecraft:magma_cream" - }, - { - "id" : "minecraft:fermented_spider_eye" - }, - { - "id" : "minecraft:dragon_breath" - }, - { - "id" : "minecraft:shulker_shell" - }, - { - "id" : "minecraft:ghast_tear" - }, - { - "id" : "minecraft:slime_ball" - }, - { - "id" : "minecraft:ender_pearl" - }, - { - "id" : "minecraft:ender_eye" - }, - { - "id" : "minecraft:nether_star" - }, - { - "id" : "minecraft:end_rod", - "blockRuntimeId" : 4739 - }, - { - "id" : "minecraft:lightning_rod", - "blockRuntimeId" : 5516 - }, - { - "id" : "minecraft:end_crystal" - }, - { - "id" : "minecraft:paper" - }, - { - "id" : "minecraft:book" - }, - { - "id" : "minecraft:writable_book" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:oak_boat" - }, - { - "id" : "minecraft:spruce_boat" - }, - { - "id" : "minecraft:birch_boat" - }, - { - "id" : "minecraft:jungle_boat" - }, - { - "id" : "minecraft:acacia_boat" - }, - { - "id" : "minecraft:dark_oak_boat" - }, - { - "id" : "minecraft:rail", - "blockRuntimeId" : 6567 - }, - { - "id" : "minecraft:golden_rail", - "blockRuntimeId" : 4977 - }, - { - "id" : "minecraft:detector_rail", - "blockRuntimeId" : 4462 - }, - { - "id" : "minecraft:activator_rail", - "blockRuntimeId" : 122 - }, - { - "id" : "minecraft:minecart" - }, - { - "id" : "minecraft:chest_minecart" - }, - { - "id" : "minecraft:hopper_minecart" - }, - { - "id" : "minecraft:tnt_minecart" - }, - { - "id" : "minecraft:redstone" - }, - { - "id" : "minecraft:redstone_block", - "blockRuntimeId" : 6645 - }, - { - "id" : "minecraft:redstone_torch", - "blockRuntimeId" : 6648 - }, - { - "id" : "minecraft:lever", - "blockRuntimeId" : 5442 - }, - { - "id" : "minecraft:wooden_button", - "blockRuntimeId" : 7843 - }, - { - "id" : "minecraft:spruce_button", - "blockRuntimeId" : 6966 - }, - { - "id" : "minecraft:birch_button", - "blockRuntimeId" : 356 - }, - { - "id" : "minecraft:jungle_button", - "blockRuntimeId" : 5209 - }, - { - "id" : "minecraft:acacia_button" - }, - { - "id" : "minecraft:dark_oak_button", - "blockRuntimeId" : 3937 - }, - { - "id" : "minecraft:stone_button", - "blockRuntimeId" : 7195 - }, - { - "id" : "minecraft:crimson_button", - "blockRuntimeId" : 3772 - }, - { - "id" : "minecraft:warped_button", - "blockRuntimeId" : 7530 - }, - { - "id" : "minecraft:polished_blackstone_button", - "blockRuntimeId" : 6001 - }, - { - "id" : "minecraft:tripwire_hook", - "blockRuntimeId" : 7401 - }, - { - "id" : "minecraft:wooden_pressure_plate", - "blockRuntimeId" : 7887 - }, - { - "id" : "minecraft:spruce_pressure_plate", - "blockRuntimeId" : 7026 - }, - { - "id" : "minecraft:birch_pressure_plate", - "blockRuntimeId" : 416 - }, - { - "id" : "minecraft:jungle_pressure_plate", - "blockRuntimeId" : 5269 - }, - { - "id" : "minecraft:acacia_pressure_plate", - "blockRuntimeId" : 60 - }, - { - "id" : "minecraft:dark_oak_pressure_plate", - "blockRuntimeId" : 3997 - }, - { - "id" : "minecraft:crimson_pressure_plate", - "blockRuntimeId" : 3841 - }, - { - "id" : "minecraft:warped_pressure_plate", - "blockRuntimeId" : 7599 - }, - { - "id" : "minecraft:stone_pressure_plate", - "blockRuntimeId" : 7207 - }, - { - "id" : "minecraft:light_weighted_pressure_plate", - "blockRuntimeId" : 5500 - }, - { - "id" : "minecraft:heavy_weighted_pressure_plate", - "blockRuntimeId" : 5096 - }, - { - "id" : "minecraft:polished_blackstone_pressure_plate", - "blockRuntimeId" : 6015 - }, - { - "id" : "minecraft:observer", - "blockRuntimeId" : 5725 - }, - { - "id" : "minecraft:daylight_detector", - "blockRuntimeId" : 4067 - }, - { - "id" : "minecraft:repeater" - }, - { - "id" : "minecraft:comparator" - }, - { - "id" : "minecraft:hopper" - }, - { - "id" : "minecraft:dropper", - "blockRuntimeId" : 4589 - }, - { - "id" : "minecraft:dispenser", - "blockRuntimeId" : 4490 - }, - { - "id" : "minecraft:piston", - "blockRuntimeId" : 5786 - }, - { - "id" : "minecraft:sticky_piston", - "blockRuntimeId" : 7169 - }, - { - "id" : "minecraft:tnt", - "blockRuntimeId" : 7353 - }, - { - "id" : "minecraft:name_tag" - }, - { - "id" : "minecraft:loom", - "blockRuntimeId" : 5582 - }, - { - "id" : "minecraft:banner" - }, - { - "id" : "minecraft:banner", - "damage" : 8 - }, - { - "id" : "minecraft:banner", - "damage" : 7 - }, - { - "id" : "minecraft:banner", - "damage" : 15 - }, - { - "id" : "minecraft:banner", - "damage" : 12 - }, - { - "id" : "minecraft:banner", - "damage" : 14 - }, - { - "id" : "minecraft:banner", - "damage" : 1 - }, - { - "id" : "minecraft:banner", - "damage" : 4 - }, - { - "id" : "minecraft:banner", - "damage" : 5 - }, - { - "id" : "minecraft:banner", - "damage" : 13 - }, - { - "id" : "minecraft:banner", - "damage" : 9 - }, - { - "id" : "minecraft:banner", - "damage" : 3 - }, - { - "id" : "minecraft:banner", - "damage" : 11 - }, - { - "id" : "minecraft:banner", - "damage" : 10 - }, - { - "id" : "minecraft:banner", - "damage" : 2 - }, - { - "id" : "minecraft:banner", - "damage" : 6 - }, - { - "id" : "minecraft:banner", - "damage" : 15, - "nbt_b64" : "CgAAAwQAVHlwZQEAAAAA" - }, - { - "id" : "minecraft:creeper_banner_pattern" - }, - { - "id" : "minecraft:skull_banner_pattern" - }, - { - "id" : "minecraft:flower_banner_pattern" - }, - { - "id" : "minecraft:mojang_banner_pattern" - }, - { - "id" : "minecraft:field_masoned_banner_pattern" - }, - { - "id" : "minecraft:bordure_indented_banner_pattern" - }, - { - "id" : "minecraft:piglin_banner_pattern" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_star", - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 8, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 7, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 15, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 12, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 14, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 1, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 4, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 5, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 13, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 9, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 3, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 11, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 10, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 2, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 6, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA=" - }, - { - "id" : "minecraft:chain" - }, - { - "id" : "minecraft:target", - "blockRuntimeId" : 7351 - }, - { - "id" : "minecraft:lodestone_compass" - } - ] -} \ No newline at end of file diff --git a/core/src/main/resources/bedrock/creative_items.1_18_10.json b/core/src/main/resources/bedrock/creative_items.1_18_10.json deleted file mode 100644 index dadabf91f..000000000 --- a/core/src/main/resources/bedrock/creative_items.1_18_10.json +++ /dev/null @@ -1,5209 +0,0 @@ -{ - "items" : [ - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5800 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5801 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5802 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5803 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5804 - }, - { - "id" : "minecraft:planks", - "blockRuntimeId" : 5805 - }, - { - "id" : "minecraft:crimson_planks", - "blockRuntimeId" : 3840 - }, - { - "id" : "minecraft:warped_planks", - "blockRuntimeId" : 7596 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1319 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1320 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1321 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1322 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1323 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1324 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1331 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1326 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1327 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1325 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1328 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1332 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1329 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1330 - }, - { - "id" : "minecraft:blackstone_wall", - "blockRuntimeId" : 507 - }, - { - "id" : "minecraft:polished_blackstone_wall", - "blockRuntimeId" : 6044 - }, - { - "id" : "minecraft:polished_blackstone_brick_wall", - "blockRuntimeId" : 5841 - }, - { - "id" : "minecraft:cobbled_deepslate_wall", - "blockRuntimeId" : 1156 - }, - { - "id" : "minecraft:deepslate_tile_wall", - "blockRuntimeId" : 4298 - }, - { - "id" : "minecraft:polished_deepslate_wall", - "blockRuntimeId" : 6219 - }, - { - "id" : "minecraft:deepslate_brick_wall", - "blockRuntimeId" : 4115 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4774 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4775 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4776 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4777 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4778 - }, - { - "id" : "minecraft:fence", - "blockRuntimeId" : 4779 - }, - { - "id" : "minecraft:nether_brick_fence", - "blockRuntimeId" : 5690 - }, - { - "id" : "minecraft:crimson_fence", - "blockRuntimeId" : 3818 - }, - { - "id" : "minecraft:warped_fence", - "blockRuntimeId" : 7574 - }, - { - "id" : "minecraft:fence_gate", - "blockRuntimeId" : 4780 - }, - { - "id" : "minecraft:spruce_fence_gate", - "blockRuntimeId" : 7007 - }, - { - "id" : "minecraft:birch_fence_gate", - "blockRuntimeId" : 400 - }, - { - "id" : "minecraft:jungle_fence_gate", - "blockRuntimeId" : 5254 - }, - { - "id" : "minecraft:acacia_fence_gate", - "blockRuntimeId" : 44 - }, - { - "id" : "minecraft:dark_oak_fence_gate", - "blockRuntimeId" : 3981 - }, - { - "id" : "minecraft:crimson_fence_gate", - "blockRuntimeId" : 3819 - }, - { - "id" : "minecraft:warped_fence_gate", - "blockRuntimeId" : 7575 - }, - { - "id" : "minecraft:normal_stone_stairs", - "blockRuntimeId" : 5709 - }, - { - "id" : "minecraft:stone_stairs", - "blockRuntimeId" : 7278 - }, - { - "id" : "minecraft:mossy_cobblestone_stairs", - "blockRuntimeId" : 5669 - }, - { - "id" : "minecraft:oak_stairs", - "blockRuntimeId" : 5718 - }, - { - "id" : "minecraft:spruce_stairs", - "blockRuntimeId" : 7039 - }, - { - "id" : "minecraft:birch_stairs", - "blockRuntimeId" : 432 - }, - { - "id" : "minecraft:jungle_stairs", - "blockRuntimeId" : 5286 - }, - { - "id" : "minecraft:acacia_stairs", - "blockRuntimeId" : 76 - }, - { - "id" : "minecraft:dark_oak_stairs", - "blockRuntimeId" : 4013 - }, - { - "id" : "minecraft:stone_brick_stairs", - "blockRuntimeId" : 7184 - }, - { - "id" : "minecraft:mossy_stone_brick_stairs", - "blockRuntimeId" : 5677 - }, - { - "id" : "minecraft:sandstone_stairs", - "blockRuntimeId" : 6713 - }, - { - "id" : "minecraft:smooth_sandstone_stairs", - "blockRuntimeId" : 6900 - }, - { - "id" : "minecraft:red_sandstone_stairs", - "blockRuntimeId" : 6640 - }, - { - "id" : "minecraft:smooth_red_sandstone_stairs", - "blockRuntimeId" : 6892 - }, - { - "id" : "minecraft:granite_stairs", - "blockRuntimeId" : 4990 - }, - { - "id" : "minecraft:polished_granite_stairs", - "blockRuntimeId" : 6389 - }, - { - "id" : "minecraft:diorite_stairs", - "blockRuntimeId" : 4476 - }, - { - "id" : "minecraft:polished_diorite_stairs", - "blockRuntimeId" : 6381 - }, - { - "id" : "minecraft:andesite_stairs", - "blockRuntimeId" : 144 - }, - { - "id" : "minecraft:polished_andesite_stairs", - "blockRuntimeId" : 5817 - }, - { - "id" : "minecraft:brick_stairs", - "blockRuntimeId" : 876 - }, - { - "id" : "minecraft:nether_brick_stairs", - "blockRuntimeId" : 5691 - }, - { - "id" : "minecraft:red_nether_brick_stairs", - "blockRuntimeId" : 6628 - }, - { - "id" : "minecraft:end_brick_stairs", - "blockRuntimeId" : 4720 - }, - { - "id" : "minecraft:quartz_stairs", - "blockRuntimeId" : 6562 - }, - { - "id" : "minecraft:smooth_quartz_stairs", - "blockRuntimeId" : 6884 - }, - { - "id" : "minecraft:purpur_stairs", - "blockRuntimeId" : 6540 - }, - { - "id" : "minecraft:prismarine_stairs", - "blockRuntimeId" : 6452 - }, - { - "id" : "minecraft:dark_prismarine_stairs", - "blockRuntimeId" : 4037 - }, - { - "id" : "minecraft:prismarine_bricks_stairs", - "blockRuntimeId" : 6444 - }, - { - "id" : "minecraft:crimson_stairs", - "blockRuntimeId" : 3860 - }, - { - "id" : "minecraft:warped_stairs", - "blockRuntimeId" : 7616 - }, - { - "id" : "minecraft:blackstone_stairs", - "blockRuntimeId" : 499 - }, - { - "id" : "minecraft:polished_blackstone_stairs", - "blockRuntimeId" : 6036 - }, - { - "id" : "minecraft:polished_blackstone_brick_stairs", - "blockRuntimeId" : 5833 - }, - { - "id" : "minecraft:cut_copper_stairs", - "blockRuntimeId" : 3913 - }, - { - "id" : "minecraft:exposed_cut_copper_stairs", - "blockRuntimeId" : 4756 - }, - { - "id" : "minecraft:weathered_cut_copper_stairs", - "blockRuntimeId" : 7743 - }, - { - "id" : "minecraft:oxidized_cut_copper_stairs", - "blockRuntimeId" : 5760 - }, - { - "id" : "minecraft:waxed_cut_copper_stairs", - "blockRuntimeId" : 7687 - }, - { - "id" : "minecraft:waxed_exposed_cut_copper_stairs", - "blockRuntimeId" : 7701 - }, - { - "id" : "minecraft:waxed_weathered_cut_copper_stairs", - "blockRuntimeId" : 7729 - }, - { - "id" : "minecraft:waxed_oxidized_cut_copper_stairs", - "blockRuntimeId" : 7715 - }, - { - "id" : "minecraft:cobbled_deepslate_stairs", - "blockRuntimeId" : 1148 - }, - { - "id" : "minecraft:deepslate_tile_stairs", - "blockRuntimeId" : 4290 - }, - { - "id" : "minecraft:polished_deepslate_stairs", - "blockRuntimeId" : 6211 - }, - { - "id" : "minecraft:deepslate_brick_stairs", - "blockRuntimeId" : 4107 - }, - { - "id" : "minecraft:wooden_door" - }, - { - "id" : "minecraft:spruce_door" - }, - { - "id" : "minecraft:birch_door" - }, - { - "id" : "minecraft:jungle_door" - }, - { - "id" : "minecraft:acacia_door" - }, - { - "id" : "minecraft:dark_oak_door" - }, - { - "id" : "minecraft:iron_door" - }, - { - "id" : "minecraft:crimson_door" - }, - { - "id" : "minecraft:warped_door" - }, - { - "id" : "minecraft:trapdoor", - "blockRuntimeId" : 7360 - }, - { - "id" : "minecraft:spruce_trapdoor", - "blockRuntimeId" : 7063 - }, - { - "id" : "minecraft:birch_trapdoor", - "blockRuntimeId" : 456 - }, - { - "id" : "minecraft:jungle_trapdoor", - "blockRuntimeId" : 5310 - }, - { - "id" : "minecraft:acacia_trapdoor", - "blockRuntimeId" : 100 - }, - { - "id" : "minecraft:dark_oak_trapdoor", - "blockRuntimeId" : 4021 - }, - { - "id" : "minecraft:iron_trapdoor", - "blockRuntimeId" : 5169 - }, - { - "id" : "minecraft:crimson_trapdoor", - "blockRuntimeId" : 3887 - }, - { - "id" : "minecraft:warped_trapdoor", - "blockRuntimeId" : 7643 - }, - { - "id" : "minecraft:iron_bars", - "blockRuntimeId" : 5134 - }, - { - "id" : "minecraft:glass", - "blockRuntimeId" : 4884 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7085 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7093 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7092 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7100 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7097 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7099 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7086 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7089 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7090 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7098 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7094 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7088 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7096 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7095 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7087 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 7091 - }, - { - "id" : "minecraft:tinted_glass", - "blockRuntimeId" : 7349 - }, - { - "id" : "minecraft:glass_pane", - "blockRuntimeId" : 4885 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7101 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7109 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7108 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7116 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7113 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7115 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7102 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7105 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7106 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7114 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7110 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7104 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7112 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7111 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7103 - }, - { - "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 7107 - }, - { - "id" : "minecraft:ladder", - "blockRuntimeId" : 5358 - }, - { - "id" : "minecraft:scaffolding", - "blockRuntimeId" : 6733 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7220 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7270 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7223 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7241 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7901 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7902 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7903 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7904 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7905 - }, - { - "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 7906 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7225 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7268 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7221 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7271 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7242 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7236 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7272 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7253 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7258 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7259 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7256 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7257 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7255 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7254 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7224 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7227 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7243 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 7252 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 7226 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 7269 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7237 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7238 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7239 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 7240 - }, - { - "id" : "minecraft:crimson_slab", - "blockRuntimeId" : 3858 - }, - { - "id" : "minecraft:warped_slab", - "blockRuntimeId" : 7614 - }, - { - "id" : "minecraft:blackstone_slab", - "blockRuntimeId" : 497 - }, - { - "id" : "minecraft:polished_blackstone_slab", - "blockRuntimeId" : 6034 - }, - { - "id" : "minecraft:polished_blackstone_brick_slab", - "blockRuntimeId" : 5831 - }, - { - "id" : "minecraft:cut_copper_slab", - "blockRuntimeId" : 3911 - }, - { - "id" : "minecraft:exposed_cut_copper_slab", - "blockRuntimeId" : 4754 - }, - { - "id" : "minecraft:weathered_cut_copper_slab", - "blockRuntimeId" : 7741 - }, - { - "id" : "minecraft:oxidized_cut_copper_slab", - "blockRuntimeId" : 5758 - }, - { - "id" : "minecraft:waxed_cut_copper_slab", - "blockRuntimeId" : 7685 - }, - { - "id" : "minecraft:waxed_exposed_cut_copper_slab", - "blockRuntimeId" : 7699 - }, - { - "id" : "minecraft:waxed_weathered_cut_copper_slab", - "blockRuntimeId" : 7727 - }, - { - "id" : "minecraft:waxed_oxidized_cut_copper_slab", - "blockRuntimeId" : 7713 - }, - { - "id" : "minecraft:cobbled_deepslate_slab", - "blockRuntimeId" : 1146 - }, - { - "id" : "minecraft:polished_deepslate_slab", - "blockRuntimeId" : 6209 - }, - { - "id" : "minecraft:deepslate_tile_slab", - "blockRuntimeId" : 4288 - }, - { - "id" : "minecraft:deepslate_brick_slab", - "blockRuntimeId" : 4105 - }, - { - "id" : "minecraft:brick_block", - "blockRuntimeId" : 875 - }, - { - "id" : "minecraft:chiseled_nether_bricks", - "blockRuntimeId" : 1130 - }, - { - "id" : "minecraft:cracked_nether_bricks", - "blockRuntimeId" : 3769 - }, - { - "id" : "minecraft:quartz_bricks", - "blockRuntimeId" : 6560 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7286 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7287 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7288 - }, - { - "id" : "minecraft:stonebrick", - "blockRuntimeId" : 7289 - }, - { - "id" : "minecraft:end_bricks", - "blockRuntimeId" : 4728 - }, - { - "id" : "minecraft:prismarine", - "blockRuntimeId" : 6443 - }, - { - "id" : "minecraft:polished_blackstone_bricks", - "blockRuntimeId" : 6003 - }, - { - "id" : "minecraft:cracked_polished_blackstone_bricks", - "blockRuntimeId" : 3770 - }, - { - "id" : "minecraft:gilded_blackstone", - "blockRuntimeId" : 4883 - }, - { - "id" : "minecraft:chiseled_polished_blackstone", - "blockRuntimeId" : 1131 - }, - { - "id" : "minecraft:deepslate_tiles", - "blockRuntimeId" : 4460 - }, - { - "id" : "minecraft:cracked_deepslate_tiles", - "blockRuntimeId" : 3768 - }, - { - "id" : "minecraft:deepslate_bricks", - "blockRuntimeId" : 4277 - }, - { - "id" : "minecraft:cracked_deepslate_bricks", - "blockRuntimeId" : 3767 - }, - { - "id" : "minecraft:chiseled_deepslate", - "blockRuntimeId" : 1129 - }, - { - "id" : "minecraft:cobblestone", - "blockRuntimeId" : 1318 - }, - { - "id" : "minecraft:mossy_cobblestone", - "blockRuntimeId" : 5668 - }, - { - "id" : "minecraft:cobbled_deepslate", - "blockRuntimeId" : 1143 - }, - { - "id" : "minecraft:smooth_stone", - "blockRuntimeId" : 6908 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6709 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6710 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6711 - }, - { - "id" : "minecraft:sandstone", - "blockRuntimeId" : 6712 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6636 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6637 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6638 - }, - { - "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6639 - }, - { - "id" : "minecraft:coal_block", - "blockRuntimeId" : 1141 - }, - { - "id" : "minecraft:dried_kelp_block", - "blockRuntimeId" : 4584 - }, - { - "id" : "minecraft:gold_block", - "blockRuntimeId" : 4976 - }, - { - "id" : "minecraft:iron_block", - "blockRuntimeId" : 5135 - }, - { - "id" : "minecraft:copper_block", - "blockRuntimeId" : 3677 - }, - { - "id" : "minecraft:exposed_copper", - "blockRuntimeId" : 4752 - }, - { - "id" : "minecraft:weathered_copper", - "blockRuntimeId" : 7739 - }, - { - "id" : "minecraft:oxidized_copper", - "blockRuntimeId" : 5756 - }, - { - "id" : "minecraft:waxed_copper", - "blockRuntimeId" : 7683 - }, - { - "id" : "minecraft:waxed_exposed_copper", - "blockRuntimeId" : 7697 - }, - { - "id" : "minecraft:waxed_weathered_copper", - "blockRuntimeId" : 7725 - }, - { - "id" : "minecraft:waxed_oxidized_copper", - "blockRuntimeId" : 7711 - }, - { - "id" : "minecraft:cut_copper", - "blockRuntimeId" : 3910 - }, - { - "id" : "minecraft:exposed_cut_copper", - "blockRuntimeId" : 4753 - }, - { - "id" : "minecraft:weathered_cut_copper", - "blockRuntimeId" : 7740 - }, - { - "id" : "minecraft:oxidized_cut_copper", - "blockRuntimeId" : 5757 - }, - { - "id" : "minecraft:waxed_cut_copper", - "blockRuntimeId" : 7684 - }, - { - "id" : "minecraft:waxed_exposed_cut_copper", - "blockRuntimeId" : 7698 - }, - { - "id" : "minecraft:waxed_weathered_cut_copper", - "blockRuntimeId" : 7726 - }, - { - "id" : "minecraft:waxed_oxidized_cut_copper", - "blockRuntimeId" : 7712 - }, - { - "id" : "minecraft:emerald_block", - "blockRuntimeId" : 4717 - }, - { - "id" : "minecraft:diamond_block", - "blockRuntimeId" : 4474 - }, - { - "id" : "minecraft:lapis_block", - "blockRuntimeId" : 5366 - }, - { - "id" : "minecraft:raw_iron_block", - "blockRuntimeId" : 6582 - }, - { - "id" : "minecraft:raw_copper_block", - "blockRuntimeId" : 6580 - }, - { - "id" : "minecraft:raw_gold_block", - "blockRuntimeId" : 6581 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6548 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6550 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6549 - }, - { - "id" : "minecraft:quartz_block", - "blockRuntimeId" : 6551 - }, - { - "id" : "minecraft:prismarine", - "blockRuntimeId" : 6441 - }, - { - "id" : "minecraft:prismarine", - "blockRuntimeId" : 6442 - }, - { - "id" : "minecraft:slime", - "blockRuntimeId" : 6861 - }, - { - "id" : "minecraft:honey_block", - "blockRuntimeId" : 5113 - }, - { - "id" : "minecraft:honeycomb_block", - "blockRuntimeId" : 5114 - }, - { - "id" : "minecraft:hay_block", - "blockRuntimeId" : 5085 - }, - { - "id" : "minecraft:bone_block", - "blockRuntimeId" : 692 - }, - { - "id" : "minecraft:nether_brick", - "blockRuntimeId" : 5689 - }, - { - "id" : "minecraft:red_nether_brick", - "blockRuntimeId" : 6627 - }, - { - "id" : "minecraft:netherite_block", - "blockRuntimeId" : 5706 - }, - { - "id" : "minecraft:lodestone", - "blockRuntimeId" : 5564 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7913 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7921 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7920 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7928 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7925 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7927 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7914 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7917 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7918 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7926 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7922 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7916 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7924 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7923 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7915 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 7919 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 963 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 971 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 970 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 978 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 975 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 977 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 964 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 967 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 968 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 976 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 972 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 966 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 974 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 973 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 965 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 969 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3660 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3668 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3667 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3675 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3672 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3674 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3661 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3664 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3665 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3673 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3669 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3663 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3671 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3670 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3662 - }, - { - "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 3666 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3644 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3652 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3651 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3659 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3656 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3658 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3645 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3648 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3649 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3657 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3653 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3647 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3655 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3654 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3646 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 3650 - }, - { - "id" : "minecraft:clay", - "blockRuntimeId" : 1139 - }, - { - "id" : "minecraft:hardened_clay", - "blockRuntimeId" : 5084 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7117 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7125 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7124 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7132 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7129 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7131 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7118 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7121 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7122 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7130 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7126 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7120 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7128 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7127 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7119 - }, - { - "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 7123 - }, - { - "id" : "minecraft:white_glazed_terracotta", - "blockRuntimeId" : 7798 - }, - { - "id" : "minecraft:silver_glazed_terracotta", - "blockRuntimeId" : 6849 - }, - { - "id" : "minecraft:gray_glazed_terracotta", - "blockRuntimeId" : 5011 - }, - { - "id" : "minecraft:black_glazed_terracotta", - "blockRuntimeId" : 488 - }, - { - "id" : "minecraft:brown_glazed_terracotta", - "blockRuntimeId" : 894 - }, - { - "id" : "minecraft:red_glazed_terracotta", - "blockRuntimeId" : 6604 - }, - { - "id" : "minecraft:orange_glazed_terracotta", - "blockRuntimeId" : 5750 - }, - { - "id" : "minecraft:yellow_glazed_terracotta", - "blockRuntimeId" : 7940 - }, - { - "id" : "minecraft:lime_glazed_terracotta", - "blockRuntimeId" : 5533 - }, - { - "id" : "minecraft:green_glazed_terracotta", - "blockRuntimeId" : 5027 - }, - { - "id" : "minecraft:cyan_glazed_terracotta", - "blockRuntimeId" : 3931 - }, - { - "id" : "minecraft:light_blue_glazed_terracotta", - "blockRuntimeId" : 5485 - }, - { - "id" : "minecraft:blue_glazed_terracotta", - "blockRuntimeId" : 685 - }, - { - "id" : "minecraft:purple_glazed_terracotta", - "blockRuntimeId" : 6522 - }, - { - "id" : "minecraft:magenta_glazed_terracotta", - "blockRuntimeId" : 5597 - }, - { - "id" : "minecraft:pink_glazed_terracotta", - "blockRuntimeId" : 5782 - }, - { - "id" : "minecraft:purpur_block", - "blockRuntimeId" : 6528 - }, - { - "id" : "minecraft:purpur_block", - "blockRuntimeId" : 6530 - }, - { - "id" : "minecraft:nether_wart_block", - "blockRuntimeId" : 5705 - }, - { - "id" : "minecraft:warped_wart_block", - "blockRuntimeId" : 7665 - }, - { - "id" : "minecraft:shroomlight", - "blockRuntimeId" : 6832 - }, - { - "id" : "minecraft:crimson_nylium", - "blockRuntimeId" : 3839 - }, - { - "id" : "minecraft:warped_nylium", - "blockRuntimeId" : 7595 - }, - { - "id" : "minecraft:basalt", - "blockRuntimeId" : 214 - }, - { - "id" : "minecraft:polished_basalt", - "blockRuntimeId" : 5825 - }, - { - "id" : "minecraft:smooth_basalt", - "blockRuntimeId" : 6883 - }, - { - "id" : "minecraft:soul_soil", - "blockRuntimeId" : 6953 - }, - { - "id" : "minecraft:dirt", - "blockRuntimeId" : 4484 - }, - { - "id" : "minecraft:dirt", - "blockRuntimeId" : 4485 - }, - { - "id" : "minecraft:farmland", - "blockRuntimeId" : 4766 - }, - { - "id" : "minecraft:grass", - "blockRuntimeId" : 4998 - }, - { - "id" : "minecraft:grass_path", - "blockRuntimeId" : 4999 - }, - { - "id" : "minecraft:podzol", - "blockRuntimeId" : 5806 - }, - { - "id" : "minecraft:mycelium", - "blockRuntimeId" : 5686 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7177 - }, - { - "id" : "minecraft:iron_ore", - "blockRuntimeId" : 5168 - }, - { - "id" : "minecraft:gold_ore", - "blockRuntimeId" : 4977 - }, - { - "id" : "minecraft:diamond_ore", - "blockRuntimeId" : 4475 - }, - { - "id" : "minecraft:lapis_ore", - "blockRuntimeId" : 5367 - }, - { - "id" : "minecraft:redstone_ore", - "blockRuntimeId" : 6650 - }, - { - "id" : "minecraft:coal_ore", - "blockRuntimeId" : 1142 - }, - { - "id" : "minecraft:copper_ore", - "blockRuntimeId" : 3678 - }, - { - "id" : "minecraft:emerald_ore", - "blockRuntimeId" : 4718 - }, - { - "id" : "minecraft:quartz_ore", - "blockRuntimeId" : 6561 - }, - { - "id" : "minecraft:nether_gold_ore", - "blockRuntimeId" : 5699 - }, - { - "id" : "minecraft:ancient_debris", - "blockRuntimeId" : 143 - }, - { - "id" : "minecraft:deepslate_iron_ore", - "blockRuntimeId" : 4283 - }, - { - "id" : "minecraft:deepslate_gold_ore", - "blockRuntimeId" : 4282 - }, - { - "id" : "minecraft:deepslate_diamond_ore", - "blockRuntimeId" : 4280 - }, - { - "id" : "minecraft:deepslate_lapis_ore", - "blockRuntimeId" : 4284 - }, - { - "id" : "minecraft:deepslate_redstone_ore", - "blockRuntimeId" : 4285 - }, - { - "id" : "minecraft:deepslate_emerald_ore", - "blockRuntimeId" : 4281 - }, - { - "id" : "minecraft:deepslate_coal_ore", - "blockRuntimeId" : 4278 - }, - { - "id" : "minecraft:deepslate_copper_ore", - "blockRuntimeId" : 4279 - }, - { - "id" : "minecraft:gravel", - "blockRuntimeId" : 5000 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7178 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7180 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7182 - }, - { - "id" : "minecraft:blackstone", - "blockRuntimeId" : 494 - }, - { - "id" : "minecraft:deepslate", - "blockRuntimeId" : 4100 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7179 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7181 - }, - { - "id" : "minecraft:stone", - "blockRuntimeId" : 7183 - }, - { - "id" : "minecraft:polished_blackstone", - "blockRuntimeId" : 5828 - }, - { - "id" : "minecraft:polished_deepslate", - "blockRuntimeId" : 6206 - }, - { - "id" : "minecraft:sand", - "blockRuntimeId" : 6707 - }, - { - "id" : "minecraft:sand", - "blockRuntimeId" : 6708 - }, - { - "id" : "minecraft:cactus", - "blockRuntimeId" : 920 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5565 - }, - { - "id" : "minecraft:stripped_oak_log", - "blockRuntimeId" : 7316 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5566 - }, - { - "id" : "minecraft:stripped_spruce_log", - "blockRuntimeId" : 7319 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5567 - }, - { - "id" : "minecraft:stripped_birch_log", - "blockRuntimeId" : 7301 - }, - { - "id" : "minecraft:log", - "blockRuntimeId" : 5568 - }, - { - "id" : "minecraft:stripped_jungle_log", - "blockRuntimeId" : 7313 - }, - { - "id" : "minecraft:log2", - "blockRuntimeId" : 5577 - }, - { - "id" : "minecraft:stripped_acacia_log", - "blockRuntimeId" : 7298 - }, - { - "id" : "minecraft:log2", - "blockRuntimeId" : 5578 - }, - { - "id" : "minecraft:stripped_dark_oak_log", - "blockRuntimeId" : 7310 - }, - { - "id" : "minecraft:crimson_stem", - "blockRuntimeId" : 3884 - }, - { - "id" : "minecraft:stripped_crimson_stem", - "blockRuntimeId" : 7307 - }, - { - "id" : "minecraft:warped_stem", - "blockRuntimeId" : 7640 - }, - { - "id" : "minecraft:stripped_warped_stem", - "blockRuntimeId" : 7325 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7805 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7811 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7806 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7812 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7807 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7813 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7808 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7814 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7809 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7815 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7810 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 7816 - }, - { - "id" : "minecraft:crimson_hyphae", - "blockRuntimeId" : 3836 - }, - { - "id" : "minecraft:stripped_crimson_hyphae", - "blockRuntimeId" : 7304 - }, - { - "id" : "minecraft:warped_hyphae", - "blockRuntimeId" : 7592 - }, - { - "id" : "minecraft:stripped_warped_hyphae", - "blockRuntimeId" : 7322 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5411 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5412 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5413 - }, - { - "id" : "minecraft:leaves", - "blockRuntimeId" : 5414 - }, - { - "id" : "minecraft:leaves2", - "blockRuntimeId" : 5427 - }, - { - "id" : "minecraft:leaves2", - "blockRuntimeId" : 5428 - }, - { - "id" : "minecraft:azalea_leaves", - "blockRuntimeId" : 169 - }, - { - "id" : "minecraft:azalea_leaves_flowered", - "blockRuntimeId" : 173 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6721 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6722 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6723 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6724 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6725 - }, - { - "id" : "minecraft:sapling", - "blockRuntimeId" : 6726 - }, - { - "id" : "minecraft:bee_nest", - "blockRuntimeId" : 236 - }, - { - "id" : "minecraft:wheat_seeds" - }, - { - "id" : "minecraft:pumpkin_seeds" - }, - { - "id" : "minecraft:melon_seeds" - }, - { - "id" : "minecraft:beetroot_seeds" - }, - { - "id" : "minecraft:wheat" - }, - { - "id" : "minecraft:beetroot" - }, - { - "id" : "minecraft:potato" - }, - { - "id" : "minecraft:poisonous_potato" - }, - { - "id" : "minecraft:carrot" - }, - { - "id" : "minecraft:golden_carrot" - }, - { - "id" : "minecraft:apple" - }, - { - "id" : "minecraft:golden_apple" - }, - { - "id" : "minecraft:enchanted_golden_apple" - }, - { - "id" : "minecraft:melon_block", - "blockRuntimeId" : 5610 - }, - { - "id" : "minecraft:melon_slice" - }, - { - "id" : "minecraft:glistering_melon_slice" - }, - { - "id" : "minecraft:sweet_berries" - }, - { - "id" : "minecraft:glow_berries" - }, - { - "id" : "minecraft:pumpkin", - "blockRuntimeId" : 6460 - }, - { - "id" : "minecraft:carved_pumpkin", - "blockRuntimeId" : 988 - }, - { - "id" : "minecraft:lit_pumpkin", - "blockRuntimeId" : 5552 - }, - { - "id" : "minecraft:honeycomb" - }, - { - "id" : "minecraft:tallgrass", - "blockRuntimeId" : 7346 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4504 - }, - { - "id" : "minecraft:tallgrass", - "blockRuntimeId" : 7345 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4503 - }, - { - "id" : "minecraft:nether_sprouts" - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3682 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3680 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3681 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3679 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3683 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3687 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3685 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3686 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3684 - }, - { - "id" : "minecraft:coral", - "blockRuntimeId" : 3688 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3702 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3700 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3701 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3699 - }, - { - "id" : "minecraft:coral_fan", - "blockRuntimeId" : 3703 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3712 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3710 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3711 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3709 - }, - { - "id" : "minecraft:coral_fan_dead", - "blockRuntimeId" : 3713 - }, - { - "id" : "minecraft:kelp" - }, - { - "id" : "minecraft:seagrass", - "blockRuntimeId" : 6828 - }, - { - "id" : "minecraft:crimson_roots", - "blockRuntimeId" : 3857 - }, - { - "id" : "minecraft:warped_roots", - "blockRuntimeId" : 7613 - }, - { - "id" : "minecraft:yellow_flower", - "blockRuntimeId" : 7939 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6593 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6594 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6595 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6596 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6597 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6598 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6599 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6600 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6601 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6602 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 6603 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4501 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4502 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4505 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 4506 - }, - { - "id" : "minecraft:wither_rose", - "blockRuntimeId" : 7804 - }, - { - "id" : "minecraft:white_dye" - }, - { - "id" : "minecraft:light_gray_dye" - }, - { - "id" : "minecraft:gray_dye" - }, - { - "id" : "minecraft:black_dye" - }, - { - "id" : "minecraft:brown_dye" - }, - { - "id" : "minecraft:red_dye" - }, - { - "id" : "minecraft:orange_dye" - }, - { - "id" : "minecraft:yellow_dye" - }, - { - "id" : "minecraft:lime_dye" - }, - { - "id" : "minecraft:green_dye" - }, - { - "id" : "minecraft:cyan_dye" - }, - { - "id" : "minecraft:light_blue_dye" - }, - { - "id" : "minecraft:blue_dye" - }, - { - "id" : "minecraft:purple_dye" - }, - { - "id" : "minecraft:magenta_dye" - }, - { - "id" : "minecraft:pink_dye" - }, - { - "id" : "minecraft:ink_sac" - }, - { - "id" : "minecraft:glow_ink_sac" - }, - { - "id" : "minecraft:cocoa_beans" - }, - { - "id" : "minecraft:lapis_lazuli" - }, - { - "id" : "minecraft:bone_meal" - }, - { - "id" : "minecraft:vine", - "blockRuntimeId" : 7500 - }, - { - "id" : "minecraft:weeping_vines", - "blockRuntimeId" : 7754 - }, - { - "id" : "minecraft:twisting_vines", - "blockRuntimeId" : 7427 - }, - { - "id" : "minecraft:waterlily", - "blockRuntimeId" : 7682 - }, - { - "id" : "minecraft:deadbush", - "blockRuntimeId" : 4099 - }, - { - "id" : "minecraft:bamboo", - "blockRuntimeId" : 177 - }, - { - "id" : "minecraft:snow", - "blockRuntimeId" : 6909 - }, - { - "id" : "minecraft:ice", - "blockRuntimeId" : 5127 - }, - { - "id" : "minecraft:packed_ice", - "blockRuntimeId" : 5770 - }, - { - "id" : "minecraft:blue_ice", - "blockRuntimeId" : 691 - }, - { - "id" : "minecraft:snow_layer", - "blockRuntimeId" : 6910 - }, - { - "id" : "minecraft:pointed_dripstone", - "blockRuntimeId" : 5812 - }, - { - "id" : "minecraft:dripstone_block", - "blockRuntimeId" : 4585 - }, - { - "id" : "minecraft:moss_carpet", - "blockRuntimeId" : 5667 - }, - { - "id" : "minecraft:moss_block", - "blockRuntimeId" : 5666 - }, - { - "id" : "minecraft:dirt_with_roots", - "blockRuntimeId" : 4486 - }, - { - "id" : "minecraft:hanging_roots", - "blockRuntimeId" : 5049 - }, - { - "id" : "minecraft:big_dripleaf", - "blockRuntimeId" : 328 - }, - { - "id" : "minecraft:small_dripleaf_block", - "blockRuntimeId" : 6875 - }, - { - "id" : "minecraft:spore_blossom", - "blockRuntimeId" : 6962 - }, - { - "id" : "minecraft:azalea", - "blockRuntimeId" : 168 - }, - { - "id" : "minecraft:flowering_azalea", - "blockRuntimeId" : 4815 - }, - { - "id" : "minecraft:glow_lichen", - "blockRuntimeId" : 4973 - }, - { - "id" : "minecraft:amethyst_block", - "blockRuntimeId" : 136 - }, - { - "id" : "minecraft:budding_amethyst", - "blockRuntimeId" : 919 - }, - { - "id" : "minecraft:amethyst_cluster", - "blockRuntimeId" : 138 - }, - { - "id" : "minecraft:large_amethyst_bud", - "blockRuntimeId" : 5369 - }, - { - "id" : "minecraft:medium_amethyst_bud", - "blockRuntimeId" : 5605 - }, - { - "id" : "minecraft:small_amethyst_bud", - "blockRuntimeId" : 6863 - }, - { - "id" : "minecraft:tuff", - "blockRuntimeId" : 7414 - }, - { - "id" : "minecraft:calcite", - "blockRuntimeId" : 943 - }, - { - "id" : "minecraft:chicken" - }, - { - "id" : "minecraft:porkchop" - }, - { - "id" : "minecraft:beef" - }, - { - "id" : "minecraft:mutton" - }, - { - "id" : "minecraft:rabbit" - }, - { - "id" : "minecraft:cod" - }, - { - "id" : "minecraft:salmon" - }, - { - "id" : "minecraft:tropical_fish" - }, - { - "id" : "minecraft:pufferfish" - }, - { - "id" : "minecraft:brown_mushroom", - "blockRuntimeId" : 900 - }, - { - "id" : "minecraft:red_mushroom", - "blockRuntimeId" : 6610 - }, - { - "id" : "minecraft:crimson_fungus", - "blockRuntimeId" : 3835 - }, - { - "id" : "minecraft:warped_fungus", - "blockRuntimeId" : 7591 - }, - { - "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 915 - }, - { - "id" : "minecraft:red_mushroom_block", - "blockRuntimeId" : 6625 - }, - { - "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 916 - }, - { - "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 901 - }, - { - "id" : "minecraft:egg" - }, - { - "id" : "minecraft:sugar_cane" - }, - { - "id" : "minecraft:sugar" - }, - { - "id" : "minecraft:rotten_flesh" - }, - { - "id" : "minecraft:bone" - }, - { - "id" : "minecraft:web", - "blockRuntimeId" : 7753 - }, - { - "id" : "minecraft:spider_eye" - }, - { - "id" : "minecraft:mob_spawner", - "blockRuntimeId" : 5659 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5660 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5661 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5662 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5663 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5664 - }, - { - "id" : "minecraft:monster_egg", - "blockRuntimeId" : 5665 - }, - { - "id" : "minecraft:infested_deepslate", - "blockRuntimeId" : 5128 - }, - { - "id" : "minecraft:dragon_egg", - "blockRuntimeId" : 4583 - }, - { - "id" : "minecraft:turtle_egg", - "blockRuntimeId" : 7415 - }, - { - "id" : "minecraft:chicken_spawn_egg" - }, - { - "id" : "minecraft:bee_spawn_egg" - }, - { - "id" : "minecraft:cow_spawn_egg" - }, - { - "id" : "minecraft:pig_spawn_egg" - }, - { - "id" : "minecraft:sheep_spawn_egg" - }, - { - "id" : "minecraft:wolf_spawn_egg" - }, - { - "id" : "minecraft:polar_bear_spawn_egg" - }, - { - "id" : "minecraft:ocelot_spawn_egg" - }, - { - "id" : "minecraft:cat_spawn_egg" - }, - { - "id" : "minecraft:mooshroom_spawn_egg" - }, - { - "id" : "minecraft:bat_spawn_egg" - }, - { - "id" : "minecraft:parrot_spawn_egg" - }, - { - "id" : "minecraft:rabbit_spawn_egg" - }, - { - "id" : "minecraft:llama_spawn_egg" - }, - { - "id" : "minecraft:horse_spawn_egg" - }, - { - "id" : "minecraft:donkey_spawn_egg" - }, - { - "id" : "minecraft:mule_spawn_egg" - }, - { - "id" : "minecraft:skeleton_horse_spawn_egg" - }, - { - "id" : "minecraft:zombie_horse_spawn_egg" - }, - { - "id" : "minecraft:tropical_fish_spawn_egg" - }, - { - "id" : "minecraft:cod_spawn_egg" - }, - { - "id" : "minecraft:pufferfish_spawn_egg" - }, - { - "id" : "minecraft:salmon_spawn_egg" - }, - { - "id" : "minecraft:dolphin_spawn_egg" - }, - { - "id" : "minecraft:turtle_spawn_egg" - }, - { - "id" : "minecraft:panda_spawn_egg" - }, - { - "id" : "minecraft:fox_spawn_egg" - }, - { - "id" : "minecraft:creeper_spawn_egg" - }, - { - "id" : "minecraft:enderman_spawn_egg" - }, - { - "id" : "minecraft:silverfish_spawn_egg" - }, - { - "id" : "minecraft:skeleton_spawn_egg" - }, - { - "id" : "minecraft:wither_skeleton_spawn_egg" - }, - { - "id" : "minecraft:stray_spawn_egg" - }, - { - "id" : "minecraft:slime_spawn_egg" - }, - { - "id" : "minecraft:spider_spawn_egg" - }, - { - "id" : "minecraft:zombie_spawn_egg" - }, - { - "id" : "minecraft:zombie_pigman_spawn_egg" - }, - { - "id" : "minecraft:husk_spawn_egg" - }, - { - "id" : "minecraft:drowned_spawn_egg" - }, - { - "id" : "minecraft:squid_spawn_egg" - }, - { - "id" : "minecraft:glow_squid_spawn_egg" - }, - { - "id" : "minecraft:cave_spider_spawn_egg" - }, - { - "id" : "minecraft:witch_spawn_egg" - }, - { - "id" : "minecraft:guardian_spawn_egg" - }, - { - "id" : "minecraft:elder_guardian_spawn_egg" - }, - { - "id" : "minecraft:endermite_spawn_egg" - }, - { - "id" : "minecraft:magma_cube_spawn_egg" - }, - { - "id" : "minecraft:strider_spawn_egg" - }, - { - "id" : "minecraft:hoglin_spawn_egg" - }, - { - "id" : "minecraft:piglin_spawn_egg" - }, - { - "id" : "minecraft:zoglin_spawn_egg" - }, - { - "id" : "minecraft:piglin_brute_spawn_egg" - }, - { - "id" : "minecraft:goat_spawn_egg" - }, - { - "id" : "minecraft:axolotl_spawn_egg" - }, - { - "id" : "minecraft:ghast_spawn_egg" - }, - { - "id" : "minecraft:blaze_spawn_egg" - }, - { - "id" : "minecraft:shulker_spawn_egg" - }, - { - "id" : "minecraft:vindicator_spawn_egg" - }, - { - "id" : "minecraft:evoker_spawn_egg" - }, - { - "id" : "minecraft:vex_spawn_egg" - }, - { - "id" : "minecraft:villager_spawn_egg" - }, - { - "id" : "minecraft:wandering_trader_spawn_egg" - }, - { - "id" : "minecraft:zombie_villager_spawn_egg" - }, - { - "id" : "minecraft:phantom_spawn_egg" - }, - { - "id" : "minecraft:pillager_spawn_egg" - }, - { - "id" : "minecraft:ravager_spawn_egg" - }, - { - "id" : "minecraft:obsidian", - "blockRuntimeId" : 5738 - }, - { - "id" : "minecraft:crying_obsidian", - "blockRuntimeId" : 3909 - }, - { - "id" : "minecraft:bedrock", - "blockRuntimeId" : 234 - }, - { - "id" : "minecraft:soul_sand", - "blockRuntimeId" : 6952 - }, - { - "id" : "minecraft:netherrack", - "blockRuntimeId" : 5707 - }, - { - "id" : "minecraft:magma", - "blockRuntimeId" : 5603 - }, - { - "id" : "minecraft:nether_wart" - }, - { - "id" : "minecraft:end_stone", - "blockRuntimeId" : 4745 - }, - { - "id" : "minecraft:chorus_flower", - "blockRuntimeId" : 1132 - }, - { - "id" : "minecraft:chorus_plant", - "blockRuntimeId" : 1138 - }, - { - "id" : "minecraft:chorus_fruit" - }, - { - "id" : "minecraft:popped_chorus_fruit" - }, - { - "id" : "minecraft:sponge", - "blockRuntimeId" : 6960 - }, - { - "id" : "minecraft:sponge", - "blockRuntimeId" : 6961 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3689 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3690 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3691 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3692 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3693 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3694 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3695 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3696 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3697 - }, - { - "id" : "minecraft:coral_block", - "blockRuntimeId" : 3698 - }, - { - "id" : "minecraft:leather_helmet" - }, - { - "id" : "minecraft:chainmail_helmet" - }, - { - "id" : "minecraft:iron_helmet" - }, - { - "id" : "minecraft:golden_helmet" - }, - { - "id" : "minecraft:diamond_helmet" - }, - { - "id" : "minecraft:netherite_helmet" - }, - { - "id" : "minecraft:leather_chestplate" - }, - { - "id" : "minecraft:chainmail_chestplate" - }, - { - "id" : "minecraft:iron_chestplate" - }, - { - "id" : "minecraft:golden_chestplate" - }, - { - "id" : "minecraft:diamond_chestplate" - }, - { - "id" : "minecraft:netherite_chestplate" - }, - { - "id" : "minecraft:leather_leggings" - }, - { - "id" : "minecraft:chainmail_leggings" - }, - { - "id" : "minecraft:iron_leggings" - }, - { - "id" : "minecraft:golden_leggings" - }, - { - "id" : "minecraft:diamond_leggings" - }, - { - "id" : "minecraft:netherite_leggings" - }, - { - "id" : "minecraft:leather_boots" - }, - { - "id" : "minecraft:chainmail_boots" - }, - { - "id" : "minecraft:iron_boots" - }, - { - "id" : "minecraft:golden_boots" - }, - { - "id" : "minecraft:diamond_boots" - }, - { - "id" : "minecraft:netherite_boots" - }, - { - "id" : "minecraft:wooden_sword" - }, - { - "id" : "minecraft:stone_sword" - }, - { - "id" : "minecraft:iron_sword" - }, - { - "id" : "minecraft:golden_sword" - }, - { - "id" : "minecraft:diamond_sword" - }, - { - "id" : "minecraft:netherite_sword" - }, - { - "id" : "minecraft:wooden_axe" - }, - { - "id" : "minecraft:stone_axe" - }, - { - "id" : "minecraft:iron_axe" - }, - { - "id" : "minecraft:golden_axe" - }, - { - "id" : "minecraft:diamond_axe" - }, - { - "id" : "minecraft:netherite_axe" - }, - { - "id" : "minecraft:wooden_pickaxe" - }, - { - "id" : "minecraft:stone_pickaxe" - }, - { - "id" : "minecraft:iron_pickaxe" - }, - { - "id" : "minecraft:golden_pickaxe" - }, - { - "id" : "minecraft:diamond_pickaxe" - }, - { - "id" : "minecraft:netherite_pickaxe" - }, - { - "id" : "minecraft:wooden_shovel" - }, - { - "id" : "minecraft:stone_shovel" - }, - { - "id" : "minecraft:iron_shovel" - }, - { - "id" : "minecraft:golden_shovel" - }, - { - "id" : "minecraft:diamond_shovel" - }, - { - "id" : "minecraft:netherite_shovel" - }, - { - "id" : "minecraft:wooden_hoe" - }, - { - "id" : "minecraft:stone_hoe" - }, - { - "id" : "minecraft:iron_hoe" - }, - { - "id" : "minecraft:golden_hoe" - }, - { - "id" : "minecraft:diamond_hoe" - }, - { - "id" : "minecraft:netherite_hoe" - }, - { - "id" : "minecraft:bow" - }, - { - "id" : "minecraft:crossbow" - }, - { - "id" : "minecraft:arrow" - }, - { - "id" : "minecraft:arrow", - "damage" : 6 - }, - { - "id" : "minecraft:arrow", - "damage" : 7 - }, - { - "id" : "minecraft:arrow", - "damage" : 8 - }, - { - "id" : "minecraft:arrow", - "damage" : 9 - }, - { - "id" : "minecraft:arrow", - "damage" : 10 - }, - { - "id" : "minecraft:arrow", - "damage" : 11 - }, - { - "id" : "minecraft:arrow", - "damage" : 12 - }, - { - "id" : "minecraft:arrow", - "damage" : 13 - }, - { - "id" : "minecraft:arrow", - "damage" : 14 - }, - { - "id" : "minecraft:arrow", - "damage" : 15 - }, - { - "id" : "minecraft:arrow", - "damage" : 16 - }, - { - "id" : "minecraft:arrow", - "damage" : 17 - }, - { - "id" : "minecraft:arrow", - "damage" : 18 - }, - { - "id" : "minecraft:arrow", - "damage" : 19 - }, - { - "id" : "minecraft:arrow", - "damage" : 20 - }, - { - "id" : "minecraft:arrow", - "damage" : 21 - }, - { - "id" : "minecraft:arrow", - "damage" : 22 - }, - { - "id" : "minecraft:arrow", - "damage" : 23 - }, - { - "id" : "minecraft:arrow", - "damage" : 24 - }, - { - "id" : "minecraft:arrow", - "damage" : 25 - }, - { - "id" : "minecraft:arrow", - "damage" : 26 - }, - { - "id" : "minecraft:arrow", - "damage" : 27 - }, - { - "id" : "minecraft:arrow", - "damage" : 28 - }, - { - "id" : "minecraft:arrow", - "damage" : 29 - }, - { - "id" : "minecraft:arrow", - "damage" : 30 - }, - { - "id" : "minecraft:arrow", - "damage" : 31 - }, - { - "id" : "minecraft:arrow", - "damage" : 32 - }, - { - "id" : "minecraft:arrow", - "damage" : 33 - }, - { - "id" : "minecraft:arrow", - "damage" : 34 - }, - { - "id" : "minecraft:arrow", - "damage" : 35 - }, - { - "id" : "minecraft:arrow", - "damage" : 36 - }, - { - "id" : "minecraft:arrow", - "damage" : 37 - }, - { - "id" : "minecraft:arrow", - "damage" : 38 - }, - { - "id" : "minecraft:arrow", - "damage" : 39 - }, - { - "id" : "minecraft:arrow", - "damage" : 40 - }, - { - "id" : "minecraft:arrow", - "damage" : 41 - }, - { - "id" : "minecraft:arrow", - "damage" : 42 - }, - { - "id" : "minecraft:arrow", - "damage" : 43 - }, - { - "id" : "minecraft:shield" - }, - { - "id" : "minecraft:cooked_chicken" - }, - { - "id" : "minecraft:cooked_porkchop" - }, - { - "id" : "minecraft:cooked_beef" - }, - { - "id" : "minecraft:cooked_mutton" - }, - { - "id" : "minecraft:cooked_rabbit" - }, - { - "id" : "minecraft:cooked_cod" - }, - { - "id" : "minecraft:cooked_salmon" - }, - { - "id" : "minecraft:bread" - }, - { - "id" : "minecraft:mushroom_stew" - }, - { - "id" : "minecraft:beetroot_soup" - }, - { - "id" : "minecraft:rabbit_stew" - }, - { - "id" : "minecraft:baked_potato" - }, - { - "id" : "minecraft:cookie" - }, - { - "id" : "minecraft:pumpkin_pie" - }, - { - "id" : "minecraft:cake" - }, - { - "id" : "minecraft:dried_kelp" - }, - { - "id" : "minecraft:fishing_rod" - }, - { - "id" : "minecraft:carrot_on_a_stick" - }, - { - "id" : "minecraft:warped_fungus_on_a_stick" - }, - { - "id" : "minecraft:snowball" - }, - { - "id" : "minecraft:shears" - }, - { - "id" : "minecraft:flint_and_steel" - }, - { - "id" : "minecraft:lead" - }, - { - "id" : "minecraft:clock" - }, - { - "id" : "minecraft:compass" - }, - { - "id" : "minecraft:empty_map" - }, - { - "id" : "minecraft:empty_map", - "damage" : 2 - }, - { - "id" : "minecraft:saddle" - }, - { - "id" : "minecraft:leather_horse_armor" - }, - { - "id" : "minecraft:iron_horse_armor" - }, - { - "id" : "minecraft:golden_horse_armor" - }, - { - "id" : "minecraft:diamond_horse_armor" - }, - { - "id" : "minecraft:trident" - }, - { - "id" : "minecraft:turtle_helmet" - }, - { - "id" : "minecraft:elytra" - }, - { - "id" : "minecraft:totem_of_undying" - }, - { - "id" : "minecraft:glass_bottle" - }, - { - "id" : "minecraft:experience_bottle" - }, - { - "id" : "minecraft:potion" - }, - { - "id" : "minecraft:potion", - "damage" : 1 - }, - { - "id" : "minecraft:potion", - "damage" : 2 - }, - { - "id" : "minecraft:potion", - "damage" : 3 - }, - { - "id" : "minecraft:potion", - "damage" : 4 - }, - { - "id" : "minecraft:potion", - "damage" : 5 - }, - { - "id" : "minecraft:potion", - "damage" : 6 - }, - { - "id" : "minecraft:potion", - "damage" : 7 - }, - { - "id" : "minecraft:potion", - "damage" : 8 - }, - { - "id" : "minecraft:potion", - "damage" : 9 - }, - { - "id" : "minecraft:potion", - "damage" : 10 - }, - { - "id" : "minecraft:potion", - "damage" : 11 - }, - { - "id" : "minecraft:potion", - "damage" : 12 - }, - { - "id" : "minecraft:potion", - "damage" : 13 - }, - { - "id" : "minecraft:potion", - "damage" : 14 - }, - { - "id" : "minecraft:potion", - "damage" : 15 - }, - { - "id" : "minecraft:potion", - "damage" : 16 - }, - { - "id" : "minecraft:potion", - "damage" : 17 - }, - { - "id" : "minecraft:potion", - "damage" : 18 - }, - { - "id" : "minecraft:potion", - "damage" : 19 - }, - { - "id" : "minecraft:potion", - "damage" : 20 - }, - { - "id" : "minecraft:potion", - "damage" : 21 - }, - { - "id" : "minecraft:potion", - "damage" : 22 - }, - { - "id" : "minecraft:potion", - "damage" : 23 - }, - { - "id" : "minecraft:potion", - "damage" : 24 - }, - { - "id" : "minecraft:potion", - "damage" : 25 - }, - { - "id" : "minecraft:potion", - "damage" : 26 - }, - { - "id" : "minecraft:potion", - "damage" : 27 - }, - { - "id" : "minecraft:potion", - "damage" : 28 - }, - { - "id" : "minecraft:potion", - "damage" : 29 - }, - { - "id" : "minecraft:potion", - "damage" : 30 - }, - { - "id" : "minecraft:potion", - "damage" : 31 - }, - { - "id" : "minecraft:potion", - "damage" : 32 - }, - { - "id" : "minecraft:potion", - "damage" : 33 - }, - { - "id" : "minecraft:potion", - "damage" : 34 - }, - { - "id" : "minecraft:potion", - "damage" : 35 - }, - { - "id" : "minecraft:potion", - "damage" : 36 - }, - { - "id" : "minecraft:potion", - "damage" : 37 - }, - { - "id" : "minecraft:potion", - "damage" : 38 - }, - { - "id" : "minecraft:potion", - "damage" : 39 - }, - { - "id" : "minecraft:potion", - "damage" : 40 - }, - { - "id" : "minecraft:potion", - "damage" : 41 - }, - { - "id" : "minecraft:potion", - "damage" : 42 - }, - { - "id" : "minecraft:splash_potion" - }, - { - "id" : "minecraft:splash_potion", - "damage" : 1 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 2 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 3 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 4 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 5 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 6 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 7 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 8 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 9 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 10 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 11 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 12 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 13 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 14 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 15 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 16 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 17 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 18 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 19 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 20 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 21 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 22 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 23 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 24 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 25 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 26 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 27 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 28 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 29 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 30 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 31 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 32 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 33 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 34 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 35 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 36 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 37 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 38 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 39 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 40 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 41 - }, - { - "id" : "minecraft:splash_potion", - "damage" : 42 - }, - { - "id" : "minecraft:lingering_potion" - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 1 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 2 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 3 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 4 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 5 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 6 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 7 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 8 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 9 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 10 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 11 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 12 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 13 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 14 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 15 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 16 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 17 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 18 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 19 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 20 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 21 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 22 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 23 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 24 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 25 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 26 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 27 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 28 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 29 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 30 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 31 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 32 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 33 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 34 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 35 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 36 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 37 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 38 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 39 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 40 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 41 - }, - { - "id" : "minecraft:lingering_potion", - "damage" : 42 - }, - { - "id" : "minecraft:spyglass" - }, - { - "id" : "minecraft:stick" - }, - { - "id" : "minecraft:bed" - }, - { - "id" : "minecraft:bed", - "damage" : 8 - }, - { - "id" : "minecraft:bed", - "damage" : 7 - }, - { - "id" : "minecraft:bed", - "damage" : 15 - }, - { - "id" : "minecraft:bed", - "damage" : 12 - }, - { - "id" : "minecraft:bed", - "damage" : 14 - }, - { - "id" : "minecraft:bed", - "damage" : 1 - }, - { - "id" : "minecraft:bed", - "damage" : 4 - }, - { - "id" : "minecraft:bed", - "damage" : 5 - }, - { - "id" : "minecraft:bed", - "damage" : 13 - }, - { - "id" : "minecraft:bed", - "damage" : 9 - }, - { - "id" : "minecraft:bed", - "damage" : 3 - }, - { - "id" : "minecraft:bed", - "damage" : 11 - }, - { - "id" : "minecraft:bed", - "damage" : 10 - }, - { - "id" : "minecraft:bed", - "damage" : 2 - }, - { - "id" : "minecraft:bed", - "damage" : 6 - }, - { - "id" : "minecraft:torch", - "blockRuntimeId" : 7354 - }, - { - "id" : "minecraft:soul_torch", - "blockRuntimeId" : 6954 - }, - { - "id" : "minecraft:sea_pickle", - "blockRuntimeId" : 6820 - }, - { - "id" : "minecraft:lantern", - "blockRuntimeId" : 5364 - }, - { - "id" : "minecraft:soul_lantern", - "blockRuntimeId" : 6950 - }, - { - "id" : "minecraft:candle", - "blockRuntimeId" : 953 - }, - { - "id" : "minecraft:white_candle", - "blockRuntimeId" : 7788 - }, - { - "id" : "minecraft:orange_candle", - "blockRuntimeId" : 5740 - }, - { - "id" : "minecraft:magenta_candle", - "blockRuntimeId" : 5587 - }, - { - "id" : "minecraft:light_blue_candle", - "blockRuntimeId" : 5475 - }, - { - "id" : "minecraft:yellow_candle", - "blockRuntimeId" : 7929 - }, - { - "id" : "minecraft:lime_candle", - "blockRuntimeId" : 5523 - }, - { - "id" : "minecraft:pink_candle", - "blockRuntimeId" : 5772 - }, - { - "id" : "minecraft:gray_candle", - "blockRuntimeId" : 5001 - }, - { - "id" : "minecraft:light_gray_candle", - "blockRuntimeId" : 5491 - }, - { - "id" : "minecraft:cyan_candle", - "blockRuntimeId" : 3921 - }, - { - "id" : "minecraft:purple_candle", - "blockRuntimeId" : 6512 - }, - { - "id" : "minecraft:blue_candle", - "blockRuntimeId" : 675 - }, - { - "id" : "minecraft:brown_candle", - "blockRuntimeId" : 884 - }, - { - "id" : "minecraft:green_candle", - "blockRuntimeId" : 5017 - }, - { - "id" : "minecraft:red_candle", - "blockRuntimeId" : 6583 - }, - { - "id" : "minecraft:black_candle", - "blockRuntimeId" : 478 - }, - { - "id" : "minecraft:crafting_table", - "blockRuntimeId" : 3771 - }, - { - "id" : "minecraft:cartography_table", - "blockRuntimeId" : 987 - }, - { - "id" : "minecraft:fletching_table", - "blockRuntimeId" : 4812 - }, - { - "id" : "minecraft:smithing_table", - "blockRuntimeId" : 6876 - }, - { - "id" : "minecraft:beehive", - "blockRuntimeId" : 260 - }, - { - "id" : "minecraft:campfire" - }, - { - "id" : "minecraft:soul_campfire" - }, - { - "id" : "minecraft:furnace", - "blockRuntimeId" : 4877 - }, - { - "id" : "minecraft:blast_furnace", - "blockRuntimeId" : 669 - }, - { - "id" : "minecraft:smoker", - "blockRuntimeId" : 6877 - }, - { - "id" : "minecraft:respawn_anchor", - "blockRuntimeId" : 6702 - }, - { - "id" : "minecraft:brewing_stand" - }, - { - "id" : "minecraft:anvil", - "blockRuntimeId" : 152 - }, - { - "id" : "minecraft:anvil", - "blockRuntimeId" : 156 - }, - { - "id" : "minecraft:anvil", - "blockRuntimeId" : 160 - }, - { - "id" : "minecraft:grindstone", - "blockRuntimeId" : 5033 - }, - { - "id" : "minecraft:enchanting_table", - "blockRuntimeId" : 4719 - }, - { - "id" : "minecraft:bookshelf", - "blockRuntimeId" : 704 - }, - { - "id" : "minecraft:lectern", - "blockRuntimeId" : 5435 - }, - { - "id" : "minecraft:cauldron" - }, - { - "id" : "minecraft:composter", - "blockRuntimeId" : 3635 - }, - { - "id" : "minecraft:chest", - "blockRuntimeId" : 1123 - }, - { - "id" : "minecraft:trapped_chest", - "blockRuntimeId" : 7376 - }, - { - "id" : "minecraft:ender_chest", - "blockRuntimeId" : 4746 - }, - { - "id" : "minecraft:barrel", - "blockRuntimeId" : 201 - }, - { - "id" : "minecraft:undyed_shulker_box", - "blockRuntimeId" : 7459 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6833 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6841 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6840 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6848 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6845 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6847 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6834 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6837 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6838 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6846 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6842 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6836 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6844 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6843 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6835 - }, - { - "id" : "minecraft:shulker_box", - "blockRuntimeId" : 6839 - }, - { - "id" : "minecraft:armor_stand" - }, - { - "id" : "minecraft:noteblock", - "blockRuntimeId" : 5717 - }, - { - "id" : "minecraft:jukebox", - "blockRuntimeId" : 5209 - }, - { - "id" : "minecraft:music_disc_13" - }, - { - "id" : "minecraft:music_disc_cat" - }, - { - "id" : "minecraft:music_disc_blocks" - }, - { - "id" : "minecraft:music_disc_chirp" - }, - { - "id" : "minecraft:music_disc_far" - }, - { - "id" : "minecraft:music_disc_mall" - }, - { - "id" : "minecraft:music_disc_mellohi" - }, - { - "id" : "minecraft:music_disc_stal" - }, - { - "id" : "minecraft:music_disc_strad" - }, - { - "id" : "minecraft:music_disc_ward" - }, - { - "id" : "minecraft:music_disc_11" - }, - { - "id" : "minecraft:music_disc_wait" - }, - { - "id" : "minecraft:music_disc_otherside" - }, - { - "id" : "minecraft:music_disc_pigstep" - }, - { - "id" : "minecraft:glowstone_dust" - }, - { - "id" : "minecraft:glowstone", - "blockRuntimeId" : 4975 - }, - { - "id" : "minecraft:redstone_lamp", - "blockRuntimeId" : 6649 - }, - { - "id" : "minecraft:sealantern", - "blockRuntimeId" : 6831 - }, - { - "id" : "minecraft:oak_sign" - }, - { - "id" : "minecraft:spruce_sign" - }, - { - "id" : "minecraft:birch_sign" - }, - { - "id" : "minecraft:jungle_sign" - }, - { - "id" : "minecraft:acacia_sign" - }, - { - "id" : "minecraft:dark_oak_sign" - }, - { - "id" : "minecraft:crimson_sign" - }, - { - "id" : "minecraft:warped_sign" - }, - { - "id" : "minecraft:painting" - }, - { - "id" : "minecraft:frame" - }, - { - "id" : "minecraft:glow_frame" - }, - { - "id" : "minecraft:honey_bottle" - }, - { - "id" : "minecraft:flower_pot" - }, - { - "id" : "minecraft:bowl" - }, - { - "id" : "minecraft:bucket" - }, - { - "id" : "minecraft:milk_bucket" - }, - { - "id" : "minecraft:water_bucket" - }, - { - "id" : "minecraft:lava_bucket" - }, - { - "id" : "minecraft:cod_bucket" - }, - { - "id" : "minecraft:salmon_bucket" - }, - { - "id" : "minecraft:tropical_fish_bucket" - }, - { - "id" : "minecraft:pufferfish_bucket" - }, - { - "id" : "minecraft:powder_snow_bucket" - }, - { - "id" : "minecraft:axolotl_bucket" - }, - { - "id" : "minecraft:skull", - "damage" : 3 - }, - { - "id" : "minecraft:skull", - "damage" : 2 - }, - { - "id" : "minecraft:skull", - "damage" : 4 - }, - { - "id" : "minecraft:skull", - "damage" : 5 - }, - { - "id" : "minecraft:skull" - }, - { - "id" : "minecraft:skull", - "damage" : 1 - }, - { - "id" : "minecraft:beacon", - "blockRuntimeId" : 217 - }, - { - "id" : "minecraft:bell", - "blockRuntimeId" : 292 - }, - { - "id" : "minecraft:conduit", - "blockRuntimeId" : 3676 - }, - { - "id" : "minecraft:stonecutter_block", - "blockRuntimeId" : 7292 - }, - { - "id" : "minecraft:end_portal_frame", - "blockRuntimeId" : 4731 - }, - { - "id" : "minecraft:coal" - }, - { - "id" : "minecraft:charcoal" - }, - { - "id" : "minecraft:diamond" - }, - { - "id" : "minecraft:iron_nugget" - }, - { - "id" : "minecraft:raw_iron" - }, - { - "id" : "minecraft:raw_gold" - }, - { - "id" : "minecraft:raw_copper" - }, - { - "id" : "minecraft:copper_ingot" - }, - { - "id" : "minecraft:iron_ingot" - }, - { - "id" : "minecraft:netherite_scrap" - }, - { - "id" : "minecraft:netherite_ingot" - }, - { - "id" : "minecraft:gold_nugget" - }, - { - "id" : "minecraft:gold_ingot" - }, - { - "id" : "minecraft:emerald" - }, - { - "id" : "minecraft:quartz" - }, - { - "id" : "minecraft:clay_ball" - }, - { - "id" : "minecraft:brick" - }, - { - "id" : "minecraft:netherbrick" - }, - { - "id" : "minecraft:prismarine_shard" - }, - { - "id" : "minecraft:amethyst_shard" - }, - { - "id" : "minecraft:prismarine_crystals" - }, - { - "id" : "minecraft:nautilus_shell" - }, - { - "id" : "minecraft:heart_of_the_sea" - }, - { - "id" : "minecraft:scute" - }, - { - "id" : "minecraft:phantom_membrane" - }, - { - "id" : "minecraft:string" - }, - { - "id" : "minecraft:feather" - }, - { - "id" : "minecraft:flint" - }, - { - "id" : "minecraft:gunpowder" - }, - { - "id" : "minecraft:leather" - }, - { - "id" : "minecraft:rabbit_hide" - }, - { - "id" : "minecraft:rabbit_foot" - }, - { - "id" : "minecraft:fire_charge" - }, - { - "id" : "minecraft:blaze_rod" - }, - { - "id" : "minecraft:blaze_powder" - }, - { - "id" : "minecraft:magma_cream" - }, - { - "id" : "minecraft:fermented_spider_eye" - }, - { - "id" : "minecraft:dragon_breath" - }, - { - "id" : "minecraft:shulker_shell" - }, - { - "id" : "minecraft:ghast_tear" - }, - { - "id" : "minecraft:slime_ball" - }, - { - "id" : "minecraft:ender_pearl" - }, - { - "id" : "minecraft:ender_eye" - }, - { - "id" : "minecraft:nether_star" - }, - { - "id" : "minecraft:end_rod", - "blockRuntimeId" : 4739 - }, - { - "id" : "minecraft:lightning_rod", - "blockRuntimeId" : 5517 - }, - { - "id" : "minecraft:end_crystal" - }, - { - "id" : "minecraft:paper" - }, - { - "id" : "minecraft:book" - }, - { - "id" : "minecraft:writable_book" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA=" - }, - { - "id" : "minecraft:enchanted_book", - "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA=" - }, - { - "id" : "minecraft:oak_boat" - }, - { - "id" : "minecraft:spruce_boat" - }, - { - "id" : "minecraft:birch_boat" - }, - { - "id" : "minecraft:jungle_boat" - }, - { - "id" : "minecraft:acacia_boat" - }, - { - "id" : "minecraft:dark_oak_boat" - }, - { - "id" : "minecraft:rail", - "blockRuntimeId" : 6570 - }, - { - "id" : "minecraft:golden_rail", - "blockRuntimeId" : 4978 - }, - { - "id" : "minecraft:detector_rail", - "blockRuntimeId" : 4462 - }, - { - "id" : "minecraft:activator_rail", - "blockRuntimeId" : 122 - }, - { - "id" : "minecraft:minecart" - }, - { - "id" : "minecraft:chest_minecart" - }, - { - "id" : "minecraft:hopper_minecart" - }, - { - "id" : "minecraft:tnt_minecart" - }, - { - "id" : "minecraft:redstone" - }, - { - "id" : "minecraft:redstone_block", - "blockRuntimeId" : 6648 - }, - { - "id" : "minecraft:redstone_torch", - "blockRuntimeId" : 6651 - }, - { - "id" : "minecraft:lever", - "blockRuntimeId" : 5443 - }, - { - "id" : "minecraft:wooden_button", - "blockRuntimeId" : 7841 - }, - { - "id" : "minecraft:spruce_button", - "blockRuntimeId" : 6963 - }, - { - "id" : "minecraft:birch_button", - "blockRuntimeId" : 356 - }, - { - "id" : "minecraft:jungle_button", - "blockRuntimeId" : 5210 - }, - { - "id" : "minecraft:acacia_button" - }, - { - "id" : "minecraft:dark_oak_button", - "blockRuntimeId" : 3937 - }, - { - "id" : "minecraft:stone_button", - "blockRuntimeId" : 7192 - }, - { - "id" : "minecraft:crimson_button", - "blockRuntimeId" : 3772 - }, - { - "id" : "minecraft:warped_button", - "blockRuntimeId" : 7528 - }, - { - "id" : "minecraft:polished_blackstone_button", - "blockRuntimeId" : 6004 - }, - { - "id" : "minecraft:tripwire_hook", - "blockRuntimeId" : 7398 - }, - { - "id" : "minecraft:wooden_pressure_plate", - "blockRuntimeId" : 7885 - }, - { - "id" : "minecraft:spruce_pressure_plate", - "blockRuntimeId" : 7023 - }, - { - "id" : "minecraft:birch_pressure_plate", - "blockRuntimeId" : 416 - }, - { - "id" : "minecraft:jungle_pressure_plate", - "blockRuntimeId" : 5270 - }, - { - "id" : "minecraft:acacia_pressure_plate", - "blockRuntimeId" : 60 - }, - { - "id" : "minecraft:dark_oak_pressure_plate", - "blockRuntimeId" : 3997 - }, - { - "id" : "minecraft:crimson_pressure_plate", - "blockRuntimeId" : 3841 - }, - { - "id" : "minecraft:warped_pressure_plate", - "blockRuntimeId" : 7597 - }, - { - "id" : "minecraft:stone_pressure_plate", - "blockRuntimeId" : 7204 - }, - { - "id" : "minecraft:light_weighted_pressure_plate", - "blockRuntimeId" : 5501 - }, - { - "id" : "minecraft:heavy_weighted_pressure_plate", - "blockRuntimeId" : 5097 - }, - { - "id" : "minecraft:polished_blackstone_pressure_plate", - "blockRuntimeId" : 6018 - }, - { - "id" : "minecraft:observer", - "blockRuntimeId" : 5726 - }, - { - "id" : "minecraft:daylight_detector", - "blockRuntimeId" : 4067 - }, - { - "id" : "minecraft:repeater" - }, - { - "id" : "minecraft:comparator" - }, - { - "id" : "minecraft:hopper" - }, - { - "id" : "minecraft:dropper", - "blockRuntimeId" : 4589 - }, - { - "id" : "minecraft:dispenser", - "blockRuntimeId" : 4490 - }, - { - "id" : "minecraft:piston", - "blockRuntimeId" : 5789 - }, - { - "id" : "minecraft:sticky_piston", - "blockRuntimeId" : 7166 - }, - { - "id" : "minecraft:tnt", - "blockRuntimeId" : 7350 - }, - { - "id" : "minecraft:name_tag" - }, - { - "id" : "minecraft:loom", - "blockRuntimeId" : 5583 - }, - { - "id" : "minecraft:banner" - }, - { - "id" : "minecraft:banner", - "damage" : 8 - }, - { - "id" : "minecraft:banner", - "damage" : 7 - }, - { - "id" : "minecraft:banner", - "damage" : 15 - }, - { - "id" : "minecraft:banner", - "damage" : 12 - }, - { - "id" : "minecraft:banner", - "damage" : 14 - }, - { - "id" : "minecraft:banner", - "damage" : 1 - }, - { - "id" : "minecraft:banner", - "damage" : 4 - }, - { - "id" : "minecraft:banner", - "damage" : 5 - }, - { - "id" : "minecraft:banner", - "damage" : 13 - }, - { - "id" : "minecraft:banner", - "damage" : 9 - }, - { - "id" : "minecraft:banner", - "damage" : 3 - }, - { - "id" : "minecraft:banner", - "damage" : 11 - }, - { - "id" : "minecraft:banner", - "damage" : 10 - }, - { - "id" : "minecraft:banner", - "damage" : 2 - }, - { - "id" : "minecraft:banner", - "damage" : 6 - }, - { - "id" : "minecraft:banner", - "damage" : 15, - "nbt_b64" : "CgAAAwQAVHlwZQEAAAAA" - }, - { - "id" : "minecraft:creeper_banner_pattern" - }, - { - "id" : "minecraft:skull_banner_pattern" - }, - { - "id" : "minecraft:flower_banner_pattern" - }, - { - "id" : "minecraft:mojang_banner_pattern" - }, - { - "id" : "minecraft:field_masoned_banner_pattern" - }, - { - "id" : "minecraft:bordure_indented_banner_pattern" - }, - { - "id" : "minecraft:piglin_banner_pattern" - }, - { - "id" : "minecraft:globe_banner_pattern" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_rocket", - "nbt_b64" : "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id" : "minecraft:firework_star", - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 8, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 7, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 15, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 12, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 14, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 1, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 4, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 5, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 13, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 9, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 3, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 11, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 10, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 2, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA=" - }, - { - "id" : "minecraft:firework_star", - "damage" : 6, - "nbt_b64" : "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA=" - }, - { - "id" : "minecraft:chain" - }, - { - "id" : "minecraft:target", - "blockRuntimeId" : 7348 - }, - { - "id" : "minecraft:lodestone_compass" - } - ] -} \ No newline at end of file diff --git a/core/src/main/resources/bedrock/creative_items.1_18_30.json b/core/src/main/resources/bedrock/creative_items.1_19_0.json similarity index 82% rename from core/src/main/resources/bedrock/creative_items.1_18_30.json rename to core/src/main/resources/bedrock/creative_items.1_19_0.json index 3cfb5cfc1..3a356a802 100644 --- a/core/src/main/resources/bedrock/creative_items.1_18_30.json +++ b/core/src/main/resources/bedrock/creative_items.1_19_0.json @@ -2,35 +2,59 @@ "items" : [ { "id" : "minecraft:planks", - "blockRuntimeId" : 5995 + "blockRuntimeId" : 6071 }, { "id" : "minecraft:planks", - "blockRuntimeId" : 5996 + "blockRuntimeId" : 6072 }, { "id" : "minecraft:planks", - "blockRuntimeId" : 5997 + "blockRuntimeId" : 6073 }, { "id" : "minecraft:planks", - "blockRuntimeId" : 5998 + "blockRuntimeId" : 6074 }, { "id" : "minecraft:planks", - "blockRuntimeId" : 5999 + "blockRuntimeId" : 6075 }, { "id" : "minecraft:planks", - "blockRuntimeId" : 6000 + "blockRuntimeId" : 6076 + }, + { + "id" : "minecraft:mangrove_planks", + "blockRuntimeId" : 947 }, { "id" : "minecraft:crimson_planks", - "blockRuntimeId" : 4806 + "blockRuntimeId" : 4850 }, { "id" : "minecraft:warped_planks", - "blockRuntimeId" : 928 + "blockRuntimeId" : 920 + }, + { + "id" : "minecraft:cobblestone_wall", + "blockRuntimeId" : 1182 + }, + { + "id" : "minecraft:cobblestone_wall", + "blockRuntimeId" : 1183 + }, + { + "id" : "minecraft:cobblestone_wall", + "blockRuntimeId" : 1184 + }, + { + "id" : "minecraft:cobblestone_wall", + "blockRuntimeId" : 1185 + }, + { + "id" : "minecraft:cobblestone_wall", + "blockRuntimeId" : 1186 }, { "id" : "minecraft:cobblestone_wall", @@ -38,7 +62,7 @@ }, { "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1188 + "blockRuntimeId" : 1194 }, { "id" : "minecraft:cobblestone_wall", @@ -48,109 +72,97 @@ "id" : "minecraft:cobblestone_wall", "blockRuntimeId" : 1190 }, + { + "id" : "minecraft:cobblestone_wall", + "blockRuntimeId" : 1188 + }, { "id" : "minecraft:cobblestone_wall", "blockRuntimeId" : 1191 }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1192 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1199 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1194 - }, { "id" : "minecraft:cobblestone_wall", "blockRuntimeId" : 1195 }, + { + "id" : "minecraft:cobblestone_wall", + "blockRuntimeId" : 1192 + }, { "id" : "minecraft:cobblestone_wall", "blockRuntimeId" : 1193 }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1196 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1200 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1197 - }, - { - "id" : "minecraft:cobblestone_wall", - "blockRuntimeId" : 1198 - }, { "id" : "minecraft:blackstone_wall", - "blockRuntimeId" : 3919 + "blockRuntimeId" : 3930 }, { "id" : "minecraft:polished_blackstone_wall", - "blockRuntimeId" : 6640 + "blockRuntimeId" : 6724 }, { "id" : "minecraft:polished_blackstone_brick_wall", - "blockRuntimeId" : 978 + "blockRuntimeId" : 971 }, { "id" : "minecraft:cobbled_deepslate_wall", - "blockRuntimeId" : 8024 + "blockRuntimeId" : 8082 }, { "id" : "minecraft:deepslate_tile_wall", - "blockRuntimeId" : 5027 + "blockRuntimeId" : 5071 }, { "id" : "minecraft:polished_deepslate_wall", - "blockRuntimeId" : 7759 + "blockRuntimeId" : 7817 }, { "id" : "minecraft:deepslate_brick_wall", - "blockRuntimeId" : 437 + "blockRuntimeId" : 429 + }, + { + "id" : "minecraft:mud_brick_wall", + "blockRuntimeId" : 730 }, { "id" : "minecraft:fence", - "blockRuntimeId" : 7306 + "blockRuntimeId" : 7364 }, { "id" : "minecraft:fence", - "blockRuntimeId" : 7307 + "blockRuntimeId" : 7365 }, { "id" : "minecraft:fence", - "blockRuntimeId" : 7308 + "blockRuntimeId" : 7366 }, { "id" : "minecraft:fence", - "blockRuntimeId" : 7309 + "blockRuntimeId" : 7367 }, { "id" : "minecraft:fence", - "blockRuntimeId" : 7310 + "blockRuntimeId" : 7368 }, { "id" : "minecraft:fence", - "blockRuntimeId" : 7311 + "blockRuntimeId" : 7369 + }, + { + "id" : "minecraft:mangrove_fence", + "blockRuntimeId" : 6633 }, { "id" : "minecraft:nether_brick_fence", - "blockRuntimeId" : 4238 + "blockRuntimeId" : 4290 }, { "id" : "minecraft:crimson_fence", - "blockRuntimeId" : 7938 + "blockRuntimeId" : 7996 }, { "id" : "minecraft:warped_fence", - "blockRuntimeId" : 5777 + "blockRuntimeId" : 5853 }, { "id" : "minecraft:fence_gate", @@ -158,47 +170,51 @@ }, { "id" : "minecraft:spruce_fence_gate", - "blockRuntimeId" : 6475 + "blockRuntimeId" : 6584 }, { "id" : "minecraft:birch_fence_gate", - "blockRuntimeId" : 3782 + "blockRuntimeId" : 3777 }, { "id" : "minecraft:jungle_fence_gate", - "blockRuntimeId" : 5315 + "blockRuntimeId" : 5365 }, { "id" : "minecraft:acacia_fence_gate", - "blockRuntimeId" : 7528 + "blockRuntimeId" : 7586 }, { "id" : "minecraft:dark_oak_fence_gate", - "blockRuntimeId" : 4156 + "blockRuntimeId" : 4173 + }, + { + "id" : "minecraft:mangrove_fence_gate", + "blockRuntimeId" : 4625 }, { "id" : "minecraft:crimson_fence_gate", - "blockRuntimeId" : 4617 + "blockRuntimeId" : 4661 }, { "id" : "minecraft:warped_fence_gate", - "blockRuntimeId" : 5349 + "blockRuntimeId" : 5399 }, { "id" : "minecraft:normal_stone_stairs", - "blockRuntimeId" : 641 + "blockRuntimeId" : 633 }, { "id" : "minecraft:stone_stairs", - "blockRuntimeId" : 3713 + "blockRuntimeId" : 3708 }, { "id" : "minecraft:mossy_cobblestone_stairs", - "blockRuntimeId" : 4081 + "blockRuntimeId" : 4092 }, { "id" : "minecraft:oak_stairs", - "blockRuntimeId" : 287 + "blockRuntimeId" : 273 }, { "id" : "minecraft:spruce_stairs", @@ -206,71 +222,75 @@ }, { "id" : "minecraft:birch_stairs", - "blockRuntimeId" : 6957 + "blockRuntimeId" : 7003 }, { "id" : "minecraft:jungle_stairs", - "blockRuntimeId" : 6883 + "blockRuntimeId" : 6967 }, { "id" : "minecraft:acacia_stairs", - "blockRuntimeId" : 6123 + "blockRuntimeId" : 6200 }, { "id" : "minecraft:dark_oak_stairs", - "blockRuntimeId" : 5019 + "blockRuntimeId" : 5063 + }, + { + "id" : "minecraft:mangrove_stairs", + "blockRuntimeId" : 4595 }, { "id" : "minecraft:stone_brick_stairs", - "blockRuntimeId" : 939 + "blockRuntimeId" : 931 }, { "id" : "minecraft:mossy_stone_brick_stairs", - "blockRuntimeId" : 5807 + "blockRuntimeId" : 5883 }, { "id" : "minecraft:sandstone_stairs", - "blockRuntimeId" : 3592 + "blockRuntimeId" : 3587 }, { "id" : "minecraft:smooth_sandstone_stairs", - "blockRuntimeId" : 3632 + "blockRuntimeId" : 3627 }, { "id" : "minecraft:red_sandstone_stairs", - "blockRuntimeId" : 5300 + "blockRuntimeId" : 5350 }, { "id" : "minecraft:smooth_red_sandstone_stairs", - "blockRuntimeId" : 5496 + "blockRuntimeId" : 5546 }, { "id" : "minecraft:granite_stairs", - "blockRuntimeId" : 3542 + "blockRuntimeId" : 3537 }, { "id" : "minecraft:polished_granite_stairs", - "blockRuntimeId" : 4139 + "blockRuntimeId" : 4150 }, { "id" : "minecraft:diorite_stairs", - "blockRuntimeId" : 4339 + "blockRuntimeId" : 4391 }, { "id" : "minecraft:polished_diorite_stairs", - "blockRuntimeId" : 6588 + "blockRuntimeId" : 6714 }, { "id" : "minecraft:andesite_stairs", - "blockRuntimeId" : 5258 + "blockRuntimeId" : 5308 }, { "id" : "minecraft:polished_andesite_stairs", - "blockRuntimeId" : 6982 + "blockRuntimeId" : 7028 }, { "id" : "minecraft:brick_stairs", - "blockRuntimeId" : 6421 + "blockRuntimeId" : 6530 }, { "id" : "minecraft:nether_brick_stairs", @@ -278,31 +298,31 @@ }, { "id" : "minecraft:red_nether_brick_stairs", - "blockRuntimeId" : 6493 + "blockRuntimeId" : 6602 }, { "id" : "minecraft:end_brick_stairs", - "blockRuntimeId" : 6347 + "blockRuntimeId" : 6382 }, { "id" : "minecraft:quartz_stairs", - "blockRuntimeId" : 4723 + "blockRuntimeId" : 4767 }, { "id" : "minecraft:smooth_quartz_stairs", - "blockRuntimeId" : 7642 + "blockRuntimeId" : 7700 }, { "id" : "minecraft:purpur_stairs", - "blockRuntimeId" : 7697 + "blockRuntimeId" : 7755 }, { "id" : "minecraft:prismarine_stairs", - "blockRuntimeId" : 7205 + "blockRuntimeId" : 7263 }, { "id" : "minecraft:dark_prismarine_stairs", - "blockRuntimeId" : 7372 + "blockRuntimeId" : 7430 }, { "id" : "minecraft:prismarine_bricks_stairs", @@ -310,55 +330,55 @@ }, { "id" : "minecraft:crimson_stairs", - "blockRuntimeId" : 6245 + "blockRuntimeId" : 6280 }, { "id" : "minecraft:warped_stairs", - "blockRuntimeId" : 3723 + "blockRuntimeId" : 3718 }, { "id" : "minecraft:blackstone_stairs", - "blockRuntimeId" : 6973 + "blockRuntimeId" : 7019 }, { "id" : "minecraft:polished_blackstone_stairs", - "blockRuntimeId" : 4245 + "blockRuntimeId" : 4297 }, { "id" : "minecraft:polished_blackstone_brick_stairs", - "blockRuntimeId" : 4425 + "blockRuntimeId" : 4477 }, { "id" : "minecraft:cut_copper_stairs", - "blockRuntimeId" : 4528 + "blockRuntimeId" : 4604 }, { "id" : "minecraft:exposed_cut_copper_stairs", - "blockRuntimeId" : 4519 + "blockRuntimeId" : 4587 }, { "id" : "minecraft:weathered_cut_copper_stairs", - "blockRuntimeId" : 4253 + "blockRuntimeId" : 4305 }, { "id" : "minecraft:oxidized_cut_copper_stairs", - "blockRuntimeId" : 361 + "blockRuntimeId" : 351 }, { "id" : "minecraft:waxed_cut_copper_stairs", - "blockRuntimeId" : 403 + "blockRuntimeId" : 393 }, { "id" : "minecraft:waxed_exposed_cut_copper_stairs", - "blockRuntimeId" : 3891 + "blockRuntimeId" : 3902 }, { "id" : "minecraft:waxed_weathered_cut_copper_stairs", - "blockRuntimeId" : 6091 + "blockRuntimeId" : 6167 }, { "id" : "minecraft:waxed_oxidized_cut_copper_stairs", - "blockRuntimeId" : 5764 + "blockRuntimeId" : 5840 }, { "id" : "minecraft:cobbled_deepslate_stairs", @@ -366,15 +386,19 @@ }, { "id" : "minecraft:deepslate_tile_stairs", - "blockRuntimeId" : 4609 + "blockRuntimeId" : 4653 }, { "id" : "minecraft:polished_deepslate_stairs", - "blockRuntimeId" : 308 + "blockRuntimeId" : 294 }, { "id" : "minecraft:deepslate_brick_stairs", - "blockRuntimeId" : 7364 + "blockRuntimeId" : 7422 + }, + { + "id" : "minecraft:mud_brick_stairs", + "blockRuntimeId" : 5522 }, { "id" : "minecraft:wooden_door" @@ -394,6 +418,9 @@ { "id" : "minecraft:dark_oak_door" }, + { + "id" : "minecraft:mangrove_door" + }, { "id" : "minecraft:iron_door" }, @@ -405,47 +432,59 @@ }, { "id" : "minecraft:trapdoor", - "blockRuntimeId" : 227 + "blockRuntimeId" : 229 }, { "id" : "minecraft:spruce_trapdoor", - "blockRuntimeId" : 6443 + "blockRuntimeId" : 6552 }, { "id" : "minecraft:birch_trapdoor", - "blockRuntimeId" : 6524 + "blockRuntimeId" : 6650 }, { "id" : "minecraft:jungle_trapdoor", - "blockRuntimeId" : 5331 + "blockRuntimeId" : 5381 }, { "id" : "minecraft:acacia_trapdoor", - "blockRuntimeId" : 5539 + "blockRuntimeId" : 5589 }, { "id" : "minecraft:dark_oak_trapdoor", - "blockRuntimeId" : 7444 + "blockRuntimeId" : 7502 + }, + { + "id" : "minecraft:mangrove_trapdoor", + "blockRuntimeId" : 4485 }, { "id" : "minecraft:iron_trapdoor", - "blockRuntimeId" : 335 + "blockRuntimeId" : 321 }, { "id" : "minecraft:crimson_trapdoor", - "blockRuntimeId" : 4281 + "blockRuntimeId" : 4333 }, { "id" : "minecraft:warped_trapdoor", - "blockRuntimeId" : 4689 + "blockRuntimeId" : 4733 }, { "id" : "minecraft:iron_bars", - "blockRuntimeId" : 4757 + "blockRuntimeId" : 4801 }, { "id" : "minecraft:glass", - "blockRuntimeId" : 6088 + "blockRuntimeId" : 6164 + }, + { + "id" : "minecraft:stained_glass", + "blockRuntimeId" : 1133 + }, + { + "id" : "minecraft:stained_glass", + "blockRuntimeId" : 1141 }, { "id" : "minecraft:stained_glass", @@ -455,53 +494,29 @@ "id" : "minecraft:stained_glass", "blockRuntimeId" : 1148 }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1147 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1155 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1152 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1154 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1141 - }, - { - "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1144 - }, { "id" : "minecraft:stained_glass", "blockRuntimeId" : 1145 }, { "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1153 + "blockRuntimeId" : 1147 }, { "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1149 + "blockRuntimeId" : 1134 }, { "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1143 + "blockRuntimeId" : 1137 }, { "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1151 + "blockRuntimeId" : 1138 }, { "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1150 + "blockRuntimeId" : 1146 }, { "id" : "minecraft:stained_glass", @@ -509,491 +524,515 @@ }, { "id" : "minecraft:stained_glass", - "blockRuntimeId" : 1146 + "blockRuntimeId" : 1136 + }, + { + "id" : "minecraft:stained_glass", + "blockRuntimeId" : 1144 + }, + { + "id" : "minecraft:stained_glass", + "blockRuntimeId" : 1143 + }, + { + "id" : "minecraft:stained_glass", + "blockRuntimeId" : 1135 + }, + { + "id" : "minecraft:stained_glass", + "blockRuntimeId" : 1139 }, { "id" : "minecraft:tinted_glass", - "blockRuntimeId" : 5899 + "blockRuntimeId" : 5975 }, { "id" : "minecraft:glass_pane", - "blockRuntimeId" : 5189 + "blockRuntimeId" : 5233 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4808 + "blockRuntimeId" : 4852 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4816 + "blockRuntimeId" : 4860 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4815 + "blockRuntimeId" : 4859 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4823 + "blockRuntimeId" : 4867 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4820 + "blockRuntimeId" : 4864 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4822 + "blockRuntimeId" : 4866 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4809 + "blockRuntimeId" : 4853 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4812 + "blockRuntimeId" : 4856 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4813 + "blockRuntimeId" : 4857 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4821 + "blockRuntimeId" : 4865 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4817 + "blockRuntimeId" : 4861 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4811 + "blockRuntimeId" : 4855 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4819 + "blockRuntimeId" : 4863 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4818 + "blockRuntimeId" : 4862 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4810 + "blockRuntimeId" : 4854 }, { "id" : "minecraft:stained_glass_pane", - "blockRuntimeId" : 4814 + "blockRuntimeId" : 4858 }, { "id" : "minecraft:ladder", - "blockRuntimeId" : 8204 + "blockRuntimeId" : 8262 }, { "id" : "minecraft:scaffolding", - "blockRuntimeId" : 3576 + "blockRuntimeId" : 3571 }, { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 249 + "id" : "minecraft:stone_block_slab", + "blockRuntimeId" : 4270 }, { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 6632 + "id" : "minecraft:stone_block_slab4", + "blockRuntimeId" : 5822 }, { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 252 + "id" : "minecraft:stone_block_slab", + "blockRuntimeId" : 4273 }, { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6603 + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5793 }, { "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 5220 + "blockRuntimeId" : 5270 }, { "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 5221 + "blockRuntimeId" : 5271 }, { "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 5222 + "blockRuntimeId" : 5272 }, { "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 5223 + "blockRuntimeId" : 5273 }, { "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 5224 + "blockRuntimeId" : 5274 }, { "id" : "minecraft:wooden_slab", - "blockRuntimeId" : 5225 + "blockRuntimeId" : 5275 }, { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 254 + "id" : "minecraft:mangrove_slab", + "blockRuntimeId" : 1149 }, { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 6630 + "id" : "minecraft:stone_block_slab", + "blockRuntimeId" : 4275 }, { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 250 + "id" : "minecraft:stone_block_slab4", + "blockRuntimeId" : 5820 }, { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 6633 + "id" : "minecraft:stone_block_slab", + "blockRuntimeId" : 4271 }, { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6604 + "id" : "minecraft:stone_block_slab4", + "blockRuntimeId" : 5823 }, { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6598 + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5794 }, { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 6634 + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5788 }, { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6615 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6620 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6621 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6618 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6619 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6617 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6616 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 253 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 256 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6605 - }, - { - "id" : "minecraft:double_stone_slab3", - "blockRuntimeId" : 6614 - }, - { - "id" : "minecraft:double_stone_slab", - "blockRuntimeId" : 255 - }, - { - "id" : "minecraft:double_stone_slab4", - "blockRuntimeId" : 6631 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6599 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6600 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6601 - }, - { - "id" : "minecraft:double_stone_slab2", - "blockRuntimeId" : 6602 - }, - { - "id" : "minecraft:crimson_slab", + "id" : "minecraft:stone_block_slab4", "blockRuntimeId" : 5824 }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5805 + }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5810 + }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5811 + }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5808 + }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5809 + }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5807 + }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5806 + }, + { + "id" : "minecraft:stone_block_slab", + "blockRuntimeId" : 4274 + }, + { + "id" : "minecraft:stone_block_slab", + "blockRuntimeId" : 4277 + }, + { + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5795 + }, + { + "id" : "minecraft:stone_block_slab3", + "blockRuntimeId" : 5804 + }, + { + "id" : "minecraft:stone_block_slab", + "blockRuntimeId" : 4276 + }, + { + "id" : "minecraft:stone_block_slab4", + "blockRuntimeId" : 5821 + }, + { + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5789 + }, + { + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5790 + }, + { + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5791 + }, + { + "id" : "minecraft:stone_block_slab2", + "blockRuntimeId" : 5792 + }, + { + "id" : "minecraft:crimson_slab", + "blockRuntimeId" : 5900 + }, { "id" : "minecraft:warped_slab", - "blockRuntimeId" : 6375 + "blockRuntimeId" : 6484 }, { "id" : "minecraft:blackstone_slab", - "blockRuntimeId" : 918 + "blockRuntimeId" : 910 }, { "id" : "minecraft:polished_blackstone_slab", - "blockRuntimeId" : 5942 + "blockRuntimeId" : 6018 }, { "id" : "minecraft:polished_blackstone_brick_slab", - "blockRuntimeId" : 4175 + "blockRuntimeId" : 4192 }, { "id" : "minecraft:cut_copper_slab", - "blockRuntimeId" : 5191 + "blockRuntimeId" : 5235 }, { "id" : "minecraft:exposed_cut_copper_slab", - "blockRuntimeId" : 6491 + "blockRuntimeId" : 6600 }, { "id" : "minecraft:weathered_cut_copper_slab", - "blockRuntimeId" : 5977 + "blockRuntimeId" : 6053 }, { "id" : "minecraft:oxidized_cut_copper_slab", - "blockRuntimeId" : 5232 + "blockRuntimeId" : 5282 }, { "id" : "minecraft:waxed_cut_copper_slab", - "blockRuntimeId" : 7757 + "blockRuntimeId" : 7815 }, { "id" : "minecraft:waxed_exposed_cut_copper_slab", - "blockRuntimeId" : 247 + "blockRuntimeId" : 249 }, { "id" : "minecraft:waxed_weathered_cut_copper_slab", - "blockRuntimeId" : 6436 + "blockRuntimeId" : 6545 }, { "id" : "minecraft:waxed_oxidized_cut_copper_slab", - "blockRuntimeId" : 716 + "blockRuntimeId" : 708 }, { "id" : "minecraft:cobbled_deepslate_slab", - "blockRuntimeId" : 7252 + "blockRuntimeId" : 7310 }, { "id" : "minecraft:polished_deepslate_slab", - "blockRuntimeId" : 302 + "blockRuntimeId" : 288 }, { "id" : "minecraft:deepslate_tile_slab", - "blockRuntimeId" : 4239 + "blockRuntimeId" : 4291 }, { "id" : "minecraft:deepslate_brick_slab", - "blockRuntimeId" : 3721 + "blockRuntimeId" : 3716 + }, + { + "id" : "minecraft:mud_brick_slab", + "blockRuntimeId" : 3910 }, { "id" : "minecraft:brick_block", - "blockRuntimeId" : 4721 + "blockRuntimeId" : 4765 }, { "id" : "minecraft:chiseled_nether_bricks", - "blockRuntimeId" : 7191 + "blockRuntimeId" : 7249 }, { "id" : "minecraft:cracked_nether_bricks", - "blockRuntimeId" : 4484 + "blockRuntimeId" : 4552 }, { "id" : "minecraft:quartz_bricks", - "blockRuntimeId" : 6316 + "blockRuntimeId" : 6351 }, { "id" : "minecraft:stonebrick", - "blockRuntimeId" : 6438 + "blockRuntimeId" : 6547 }, { "id" : "minecraft:stonebrick", - "blockRuntimeId" : 6439 + "blockRuntimeId" : 6548 }, { "id" : "minecraft:stonebrick", - "blockRuntimeId" : 6440 + "blockRuntimeId" : 6549 }, { "id" : "minecraft:stonebrick", - "blockRuntimeId" : 6441 + "blockRuntimeId" : 6550 }, { "id" : "minecraft:end_bricks", - "blockRuntimeId" : 295 + "blockRuntimeId" : 281 }, { "id" : "minecraft:prismarine", - "blockRuntimeId" : 6011 + "blockRuntimeId" : 6087 }, { "id" : "minecraft:polished_blackstone_bricks", - "blockRuntimeId" : 4636 + "blockRuntimeId" : 4680 }, { "id" : "minecraft:cracked_polished_blackstone_bricks", - "blockRuntimeId" : 7156 + "blockRuntimeId" : 7214 }, { "id" : "minecraft:gilded_blackstone", - "blockRuntimeId" : 4518 + "blockRuntimeId" : 4586 }, { "id" : "minecraft:chiseled_polished_blackstone", - "blockRuntimeId" : 5018 + "blockRuntimeId" : 5062 }, { "id" : "minecraft:deepslate_tiles", - "blockRuntimeId" : 4513 + "blockRuntimeId" : 4581 }, { "id" : "minecraft:cracked_deepslate_tiles", - "blockRuntimeId" : 4149 + "blockRuntimeId" : 4160 }, { "id" : "minecraft:deepslate_bricks", - "blockRuntimeId" : 5414 + "blockRuntimeId" : 5464 }, { "id" : "minecraft:cracked_deepslate_bricks", - "blockRuntimeId" : 5314 + "blockRuntimeId" : 5364 }, { "id" : "minecraft:chiseled_deepslate", - "blockRuntimeId" : 5190 + "blockRuntimeId" : 5234 }, { "id" : "minecraft:cobblestone", - "blockRuntimeId" : 3620 + "blockRuntimeId" : 3615 }, { "id" : "minecraft:mossy_cobblestone", - "blockRuntimeId" : 266 + "blockRuntimeId" : 252 }, { "id" : "minecraft:cobbled_deepslate", - "blockRuntimeId" : 6544 + "blockRuntimeId" : 6670 }, { "id" : "minecraft:smooth_stone", - "blockRuntimeId" : 4514 + "blockRuntimeId" : 4582 }, { "id" : "minecraft:sandstone", - "blockRuntimeId" : 3658 + "blockRuntimeId" : 3653 }, { "id" : "minecraft:sandstone", - "blockRuntimeId" : 3659 + "blockRuntimeId" : 3654 }, { "id" : "minecraft:sandstone", - "blockRuntimeId" : 3660 + "blockRuntimeId" : 3655 }, { "id" : "minecraft:sandstone", - "blockRuntimeId" : 3661 + "blockRuntimeId" : 3656 }, { "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6471 + "blockRuntimeId" : 6580 }, { "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6472 + "blockRuntimeId" : 6581 }, { "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6473 + "blockRuntimeId" : 6582 }, { "id" : "minecraft:red_sandstone", - "blockRuntimeId" : 6474 + "blockRuntimeId" : 6583 }, { "id" : "minecraft:coal_block", - "blockRuntimeId" : 5348 + "blockRuntimeId" : 5398 }, { "id" : "minecraft:dried_kelp_block", - "blockRuntimeId" : 7921 + "blockRuntimeId" : 7979 }, { "id" : "minecraft:gold_block", - "blockRuntimeId" : 305 + "blockRuntimeId" : 291 }, { "id" : "minecraft:iron_block", - "blockRuntimeId" : 8203 + "blockRuntimeId" : 8261 }, { "id" : "minecraft:copper_block", - "blockRuntimeId" : 4607 + "blockRuntimeId" : 4651 }, { "id" : "minecraft:exposed_copper", - "blockRuntimeId" : 601 + "blockRuntimeId" : 593 }, { "id" : "minecraft:weathered_copper", - "blockRuntimeId" : 8188 + "blockRuntimeId" : 8246 }, { "id" : "minecraft:oxidized_copper", - "blockRuntimeId" : 3558 + "blockRuntimeId" : 3553 }, { "id" : "minecraft:waxed_copper", - "blockRuntimeId" : 7676 + "blockRuntimeId" : 7734 }, { "id" : "minecraft:waxed_exposed_copper", - "blockRuntimeId" : 702 + "blockRuntimeId" : 694 }, { "id" : "minecraft:waxed_weathered_copper", - "blockRuntimeId" : 715 + "blockRuntimeId" : 707 }, { "id" : "minecraft:waxed_oxidized_copper", - "blockRuntimeId" : 7484 + "blockRuntimeId" : 7542 }, { "id" : "minecraft:cut_copper", - "blockRuntimeId" : 4645 + "blockRuntimeId" : 4689 }, { "id" : "minecraft:exposed_cut_copper", - "blockRuntimeId" : 6090 + "blockRuntimeId" : 6166 }, { "id" : "minecraft:weathered_cut_copper", - "blockRuntimeId" : 7139 + "blockRuntimeId" : 7197 }, { "id" : "minecraft:oxidized_cut_copper", - "blockRuntimeId" : 5428 + "blockRuntimeId" : 5478 }, { "id" : "minecraft:waxed_cut_copper", - "blockRuntimeId" : 7235 + "blockRuntimeId" : 7293 }, { "id" : "minecraft:waxed_exposed_cut_copper", - "blockRuntimeId" : 3814 + "blockRuntimeId" : 3809 }, { "id" : "minecraft:waxed_weathered_cut_copper", - "blockRuntimeId" : 4807 + "blockRuntimeId" : 4851 }, { "id" : "minecraft:waxed_oxidized_cut_copper", @@ -1001,75 +1040,75 @@ }, { "id" : "minecraft:emerald_block", - "blockRuntimeId" : 1164 + "blockRuntimeId" : 1159 }, { "id" : "minecraft:diamond_block", - "blockRuntimeId" : 286 + "blockRuntimeId" : 272 }, { "id" : "minecraft:lapis_block", - "blockRuntimeId" : 4234 + "blockRuntimeId" : 4286 }, { "id" : "minecraft:raw_iron_block", - "blockRuntimeId" : 8202 + "blockRuntimeId" : 8260 }, { "id" : "minecraft:raw_copper_block", - "blockRuntimeId" : 5219 + "blockRuntimeId" : 5269 }, { "id" : "minecraft:raw_gold_block", - "blockRuntimeId" : 371 + "blockRuntimeId" : 361 }, { "id" : "minecraft:quartz_block", - "blockRuntimeId" : 3701 + "blockRuntimeId" : 3696 }, { "id" : "minecraft:quartz_block", - "blockRuntimeId" : 3703 + "blockRuntimeId" : 3698 }, { "id" : "minecraft:quartz_block", - "blockRuntimeId" : 3702 + "blockRuntimeId" : 3697 }, { "id" : "minecraft:quartz_block", - "blockRuntimeId" : 3704 + "blockRuntimeId" : 3699 }, { "id" : "minecraft:prismarine", - "blockRuntimeId" : 6009 + "blockRuntimeId" : 6085 }, { "id" : "minecraft:prismarine", - "blockRuntimeId" : 6010 + "blockRuntimeId" : 6086 }, { "id" : "minecraft:slime", - "blockRuntimeId" : 4197 + "blockRuntimeId" : 4233 }, { "id" : "minecraft:honey_block", - "blockRuntimeId" : 900 + "blockRuntimeId" : 892 }, { "id" : "minecraft:honeycomb_block", - "blockRuntimeId" : 4424 + "blockRuntimeId" : 4476 }, { "id" : "minecraft:hay_block", - "blockRuntimeId" : 703 + "blockRuntimeId" : 695 }, { "id" : "minecraft:bone_block", - "blockRuntimeId" : 4198 + "blockRuntimeId" : 4234 }, { "id" : "minecraft:nether_brick", - "blockRuntimeId" : 7214 + "blockRuntimeId" : 7272 }, { "id" : "minecraft:red_nether_brick", @@ -1077,11 +1116,43 @@ }, { "id" : "minecraft:netherite_block", - "blockRuntimeId" : 3780 + "blockRuntimeId" : 3775 }, { "id" : "minecraft:lodestone", - "blockRuntimeId" : 8201 + "blockRuntimeId" : 8259 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3458 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3466 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3465 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3473 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3470 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3472 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3459 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3462 }, { "id" : "minecraft:wool", @@ -1091,61 +1162,37 @@ "id" : "minecraft:wool", "blockRuntimeId" : 3471 }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3470 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3478 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3475 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3477 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3464 - }, { "id" : "minecraft:wool", "blockRuntimeId" : 3467 }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3461 + }, + { + "id" : "minecraft:wool", + "blockRuntimeId" : 3469 + }, { "id" : "minecraft:wool", "blockRuntimeId" : 3468 }, { "id" : "minecraft:wool", - "blockRuntimeId" : 3476 + "blockRuntimeId" : 3460 }, { "id" : "minecraft:wool", - "blockRuntimeId" : 3472 + "blockRuntimeId" : 3464 }, { - "id" : "minecraft:wool", - "blockRuntimeId" : 3466 + "id" : "minecraft:carpet", + "blockRuntimeId" : 949 }, { - "id" : "minecraft:wool", - "blockRuntimeId" : 3474 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3473 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3465 - }, - { - "id" : "minecraft:wool", - "blockRuntimeId" : 3469 + "id" : "minecraft:carpet", + "blockRuntimeId" : 957 }, { "id" : "minecraft:carpet", @@ -1155,53 +1202,29 @@ "id" : "minecraft:carpet", "blockRuntimeId" : 964 }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 963 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 971 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 968 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 970 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 957 - }, - { - "id" : "minecraft:carpet", - "blockRuntimeId" : 960 - }, { "id" : "minecraft:carpet", "blockRuntimeId" : 961 }, { "id" : "minecraft:carpet", - "blockRuntimeId" : 969 + "blockRuntimeId" : 963 }, { "id" : "minecraft:carpet", - "blockRuntimeId" : 965 + "blockRuntimeId" : 950 }, { "id" : "minecraft:carpet", - "blockRuntimeId" : 959 + "blockRuntimeId" : 953 }, { "id" : "minecraft:carpet", - "blockRuntimeId" : 967 + "blockRuntimeId" : 954 }, { "id" : "minecraft:carpet", - "blockRuntimeId" : 966 + "blockRuntimeId" : 962 }, { "id" : "minecraft:carpet", @@ -1209,71 +1232,91 @@ }, { "id" : "minecraft:carpet", - "blockRuntimeId" : 962 + "blockRuntimeId" : 952 + }, + { + "id" : "minecraft:carpet", + "blockRuntimeId" : 960 + }, + { + "id" : "minecraft:carpet", + "blockRuntimeId" : 959 + }, + { + "id" : "minecraft:carpet", + "blockRuntimeId" : 951 + }, + { + "id" : "minecraft:carpet", + "blockRuntimeId" : 955 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6229 + "blockRuntimeId" : 6264 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6237 + "blockRuntimeId" : 6272 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6236 + "blockRuntimeId" : 6271 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6244 + "blockRuntimeId" : 6279 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6241 + "blockRuntimeId" : 6276 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6243 + "blockRuntimeId" : 6278 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6230 + "blockRuntimeId" : 6265 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6233 + "blockRuntimeId" : 6268 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6234 + "blockRuntimeId" : 6269 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6242 + "blockRuntimeId" : 6277 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6238 + "blockRuntimeId" : 6273 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6232 + "blockRuntimeId" : 6267 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6240 + "blockRuntimeId" : 6275 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6239 + "blockRuntimeId" : 6274 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6231 + "blockRuntimeId" : 6266 }, { "id" : "minecraft:concrete_powder", - "blockRuntimeId" : 6235 + "blockRuntimeId" : 6270 + }, + { + "id" : "minecraft:concrete", + "blockRuntimeId" : 660 }, { "id" : "minecraft:concrete", @@ -1281,231 +1324,235 @@ }, { "id" : "minecraft:concrete", - "blockRuntimeId" : 676 + "blockRuntimeId" : 667 }, { "id" : "minecraft:concrete", "blockRuntimeId" : 675 }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 683 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 680 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 682 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 669 - }, { "id" : "minecraft:concrete", "blockRuntimeId" : 672 }, + { + "id" : "minecraft:concrete", + "blockRuntimeId" : 674 + }, + { + "id" : "minecraft:concrete", + "blockRuntimeId" : 661 + }, + { + "id" : "minecraft:concrete", + "blockRuntimeId" : 664 + }, + { + "id" : "minecraft:concrete", + "blockRuntimeId" : 665 + }, { "id" : "minecraft:concrete", "blockRuntimeId" : 673 }, { "id" : "minecraft:concrete", - "blockRuntimeId" : 681 + "blockRuntimeId" : 669 }, { "id" : "minecraft:concrete", - "blockRuntimeId" : 677 + "blockRuntimeId" : 663 }, { "id" : "minecraft:concrete", "blockRuntimeId" : 671 }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 679 - }, - { - "id" : "minecraft:concrete", - "blockRuntimeId" : 678 - }, { "id" : "minecraft:concrete", "blockRuntimeId" : 670 }, { "id" : "minecraft:concrete", - "blockRuntimeId" : 674 + "blockRuntimeId" : 662 + }, + { + "id" : "minecraft:concrete", + "blockRuntimeId" : 666 }, { "id" : "minecraft:clay", - "blockRuntimeId" : 7066 + "blockRuntimeId" : 7124 }, { "id" : "minecraft:hardened_clay", - "blockRuntimeId" : 649 + "blockRuntimeId" : 641 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6099 + "blockRuntimeId" : 6176 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6107 + "blockRuntimeId" : 6184 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6106 + "blockRuntimeId" : 6183 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6114 + "blockRuntimeId" : 6191 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6111 + "blockRuntimeId" : 6188 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6113 + "blockRuntimeId" : 6190 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6100 + "blockRuntimeId" : 6177 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6103 + "blockRuntimeId" : 6180 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6104 + "blockRuntimeId" : 6181 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6112 + "blockRuntimeId" : 6189 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6108 + "blockRuntimeId" : 6185 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6102 + "blockRuntimeId" : 6179 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6110 + "blockRuntimeId" : 6187 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6109 + "blockRuntimeId" : 6186 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6101 + "blockRuntimeId" : 6178 }, { "id" : "minecraft:stained_hardened_clay", - "blockRuntimeId" : 6105 + "blockRuntimeId" : 6182 }, { "id" : "minecraft:white_glazed_terracotta", - "blockRuntimeId" : 5523 + "blockRuntimeId" : 5573 }, { "id" : "minecraft:silver_glazed_terracotta", - "blockRuntimeId" : 3536 + "blockRuntimeId" : 3531 }, { "id" : "minecraft:gray_glazed_terracotta", - "blockRuntimeId" : 8195 + "blockRuntimeId" : 8253 }, { "id" : "minecraft:black_glazed_terracotta", - "blockRuntimeId" : 5758 + "blockRuntimeId" : 5834 }, { "id" : "minecraft:brown_glazed_terracotta", - "blockRuntimeId" : 3552 + "blockRuntimeId" : 3547 }, { "id" : "minecraft:red_glazed_terracotta", - "blockRuntimeId" : 4150 + "blockRuntimeId" : 4167 }, { "id" : "minecraft:orange_glazed_terracotta", - "blockRuntimeId" : 1156 + "blockRuntimeId" : 1151 }, { "id" : "minecraft:yellow_glazed_terracotta", - "blockRuntimeId" : 921 + "blockRuntimeId" : 913 }, { "id" : "minecraft:lime_glazed_terracotta", - "blockRuntimeId" : 221 + "blockRuntimeId" : 223 }, { "id" : "minecraft:green_glazed_terracotta", - "blockRuntimeId" : 6501 + "blockRuntimeId" : 6610 }, { "id" : "minecraft:cyan_glazed_terracotta", - "blockRuntimeId" : 5308 + "blockRuntimeId" : 5358 }, { "id" : "minecraft:light_blue_glazed_terracotta", - "blockRuntimeId" : 5421 + "blockRuntimeId" : 5471 }, { "id" : "minecraft:blue_glazed_terracotta", - "blockRuntimeId" : 5415 + "blockRuntimeId" : 5465 }, { "id" : "minecraft:purple_glazed_terracotta", - "blockRuntimeId" : 6965 + "blockRuntimeId" : 7011 }, { "id" : "minecraft:magenta_glazed_terracotta", - "blockRuntimeId" : 972 + "blockRuntimeId" : 965 }, { "id" : "minecraft:pink_glazed_terracotta", - "blockRuntimeId" : 6430 + "blockRuntimeId" : 6539 }, { "id" : "minecraft:purpur_block", - "blockRuntimeId" : 7656 + "blockRuntimeId" : 7714 }, { "id" : "minecraft:purpur_block", - "blockRuntimeId" : 7658 + "blockRuntimeId" : 7716 + }, + { + "id" : "minecraft:packed_mud", + "blockRuntimeId" : 283 + }, + { + "id" : "minecraft:mud_bricks", + "blockRuntimeId" : 6889 }, { "id" : "minecraft:nether_wart_block", - "blockRuntimeId" : 4241 + "blockRuntimeId" : 4293 }, { "id" : "minecraft:warped_wart_block", - "blockRuntimeId" : 5829 + "blockRuntimeId" : 5905 }, { "id" : "minecraft:shroomlight", - "blockRuntimeId" : 5017 + "blockRuntimeId" : 5061 }, { "id" : "minecraft:crimson_nylium", - "blockRuntimeId" : 4172 + "blockRuntimeId" : 4189 }, { "id" : "minecraft:warped_nylium", - "blockRuntimeId" : 6314 + "blockRuntimeId" : 6349 }, { "id" : "minecraft:basalt", - "blockRuntimeId" : 4297 + "blockRuntimeId" : 4349 }, { "id" : "minecraft:polished_basalt", @@ -1513,79 +1560,83 @@ }, { "id" : "minecraft:smooth_basalt", - "blockRuntimeId" : 1162 + "blockRuntimeId" : 1157 }, { "id" : "minecraft:soul_soil", - "blockRuntimeId" : 5738 + "blockRuntimeId" : 5830 }, { "id" : "minecraft:dirt", - "blockRuntimeId" : 5701 + "blockRuntimeId" : 5751 }, { "id" : "minecraft:dirt", - "blockRuntimeId" : 5702 + "blockRuntimeId" : 5752 }, { "id" : "minecraft:farmland", - "blockRuntimeId" : 3901 + "blockRuntimeId" : 3912 }, { "id" : "minecraft:grass", - "blockRuntimeId" : 6891 + "blockRuntimeId" : 6975 }, { "id" : "minecraft:grass_path", - "blockRuntimeId" : 8023 + "blockRuntimeId" : 8081 }, { "id" : "minecraft:podzol", - "blockRuntimeId" : 4606 + "blockRuntimeId" : 4650 }, { "id" : "minecraft:mycelium", - "blockRuntimeId" : 3688 + "blockRuntimeId" : 3683 + }, + { + "id" : "minecraft:mud", + "blockRuntimeId" : 6684 }, { "id" : "minecraft:stone", - "blockRuntimeId" : 661 + "blockRuntimeId" : 653 }, { "id" : "minecraft:iron_ore", - "blockRuntimeId" : 4646 + "blockRuntimeId" : 4690 }, { "id" : "minecraft:gold_ore", - "blockRuntimeId" : 920 + "blockRuntimeId" : 912 }, { "id" : "minecraft:diamond_ore", - "blockRuntimeId" : 4309 + "blockRuntimeId" : 4361 }, { "id" : "minecraft:lapis_ore", - "blockRuntimeId" : 7641 + "blockRuntimeId" : 7699 }, { "id" : "minecraft:redstone_ore", - "blockRuntimeId" : 4237 + "blockRuntimeId" : 4289 }, { "id" : "minecraft:coal_ore", - "blockRuntimeId" : 4235 + "blockRuntimeId" : 4287 }, { "id" : "minecraft:copper_ore", - "blockRuntimeId" : 3559 + "blockRuntimeId" : 3554 }, { "id" : "minecraft:emerald_ore", - "blockRuntimeId" : 7289 + "blockRuntimeId" : 7347 }, { "id" : "minecraft:quartz_ore", - "blockRuntimeId" : 4433 + "blockRuntimeId" : 4501 }, { "id" : "minecraft:nether_gold_ore", @@ -1593,35 +1644,35 @@ }, { "id" : "minecraft:ancient_debris", - "blockRuntimeId" : 6031 + "blockRuntimeId" : 6107 }, { "id" : "minecraft:deepslate_iron_ore", - "blockRuntimeId" : 7215 + "blockRuntimeId" : 7273 }, { "id" : "minecraft:deepslate_gold_ore", - "blockRuntimeId" : 6030 + "blockRuntimeId" : 6106 }, { "id" : "minecraft:deepslate_diamond_ore", - "blockRuntimeId" : 7980 + "blockRuntimeId" : 8038 }, { "id" : "minecraft:deepslate_lapis_ore", - "blockRuntimeId" : 7204 + "blockRuntimeId" : 7262 }, { "id" : "minecraft:deepslate_redstone_ore", - "blockRuntimeId" : 6507 + "blockRuntimeId" : 6616 }, { "id" : "minecraft:deepslate_emerald_ore", - "blockRuntimeId" : 6315 + "blockRuntimeId" : 6350 }, { "id" : "minecraft:deepslate_coal_ore", - "blockRuntimeId" : 7138 + "blockRuntimeId" : 7196 }, { "id" : "minecraft:deepslate_copper_ore", @@ -1629,123 +1680,171 @@ }, { "id" : "minecraft:gravel", - "blockRuntimeId" : 8226 + "blockRuntimeId" : 8287 }, { "id" : "minecraft:stone", - "blockRuntimeId" : 662 + "blockRuntimeId" : 654 }, { "id" : "minecraft:stone", - "blockRuntimeId" : 664 + "blockRuntimeId" : 656 }, { "id" : "minecraft:stone", - "blockRuntimeId" : 666 + "blockRuntimeId" : 658 }, { "id" : "minecraft:blackstone", - "blockRuntimeId" : 7527 + "blockRuntimeId" : 7585 }, { "id" : "minecraft:deepslate", - "blockRuntimeId" : 267 + "blockRuntimeId" : 253 }, { "id" : "minecraft:stone", - "blockRuntimeId" : 663 + "blockRuntimeId" : 655 }, { "id" : "minecraft:stone", - "blockRuntimeId" : 665 + "blockRuntimeId" : 657 }, { "id" : "minecraft:stone", - "blockRuntimeId" : 667 + "blockRuntimeId" : 659 }, { "id" : "minecraft:polished_blackstone", - "blockRuntimeId" : 3687 + "blockRuntimeId" : 3682 }, { "id" : "minecraft:polished_deepslate", - "blockRuntimeId" : 7696 + "blockRuntimeId" : 7754 }, { "id" : "minecraft:sand", - "blockRuntimeId" : 4178 + "blockRuntimeId" : 4195 }, { "id" : "minecraft:sand", - "blockRuntimeId" : 4179 + "blockRuntimeId" : 4196 }, { "id" : "minecraft:cactus", - "blockRuntimeId" : 6940 + "blockRuntimeId" : 6986 }, { "id" : "minecraft:log", - "blockRuntimeId" : 6546 + "blockRuntimeId" : 6672 }, { "id" : "minecraft:stripped_oak_log", - "blockRuntimeId" : 7485 + "blockRuntimeId" : 7543 }, { "id" : "minecraft:log", - "blockRuntimeId" : 6547 + "blockRuntimeId" : 6673 }, { "id" : "minecraft:stripped_spruce_log", - "blockRuntimeId" : 6253 + "blockRuntimeId" : 6288 }, { "id" : "minecraft:log", - "blockRuntimeId" : 6548 + "blockRuntimeId" : 6674 }, { "id" : "minecraft:stripped_birch_log", - "blockRuntimeId" : 5896 + "blockRuntimeId" : 5972 }, { "id" : "minecraft:log", - "blockRuntimeId" : 6549 + "blockRuntimeId" : 6675 }, { "id" : "minecraft:stripped_jungle_log", - "blockRuntimeId" : 650 + "blockRuntimeId" : 642 }, { "id" : "minecraft:log2", - "blockRuntimeId" : 3835 + "blockRuntimeId" : 3830 }, { "id" : "minecraft:stripped_acacia_log", - "blockRuntimeId" : 5772 + "blockRuntimeId" : 5848 }, { "id" : "minecraft:log2", - "blockRuntimeId" : 3836 + "blockRuntimeId" : 3831 }, { "id" : "minecraft:stripped_dark_oak_log", "blockRuntimeId" : 216 }, + { + "id" : "minecraft:mangrove_log", + "blockRuntimeId" : 348 + }, + { + "id" : "minecraft:stripped_mangrove_log", + "blockRuntimeId" : 8284 + }, { "id" : "minecraft:crimson_stem", - "blockRuntimeId" : 5821 + "blockRuntimeId" : 5897 }, { "id" : "minecraft:stripped_crimson_stem", - "blockRuntimeId" : 6864 + "blockRuntimeId" : 6948 }, { "id" : "minecraft:warped_stem", - "blockRuntimeId" : 6377 + "blockRuntimeId" : 6486 }, { "id" : "minecraft:stripped_warped_stem", - "blockRuntimeId" : 7342 + "blockRuntimeId" : 7400 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3474 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3480 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3475 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3481 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3476 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3482 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3477 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3483 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3478 + }, + { + "id" : "minecraft:wood", + "blockRuntimeId" : 3484 }, { "id" : "minecraft:wood", @@ -1756,120 +1855,96 @@ "blockRuntimeId" : 3485 }, { - "id" : "minecraft:wood", - "blockRuntimeId" : 3480 + "id" : "minecraft:mangrove_wood", + "blockRuntimeId" : 4161 }, { - "id" : "minecraft:wood", - "blockRuntimeId" : 3486 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3481 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3487 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3482 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3488 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3483 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3489 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3484 - }, - { - "id" : "minecraft:wood", - "blockRuntimeId" : 3490 + "id" : "minecraft:stripped_mangrove_wood", + "blockRuntimeId" : 4229 }, { "id" : "minecraft:crimson_hyphae", - "blockRuntimeId" : 4242 + "blockRuntimeId" : 4294 }, { "id" : "minecraft:stripped_crimson_hyphae", - "blockRuntimeId" : 6390 + "blockRuntimeId" : 6499 }, { "id" : "minecraft:warped_hyphae", - "blockRuntimeId" : 5826 + "blockRuntimeId" : 5902 }, { "id" : "minecraft:stripped_warped_hyphae", - "blockRuntimeId" : 5529 + "blockRuntimeId" : 5579 }, { "id" : "minecraft:leaves", - "blockRuntimeId" : 6014 + "blockRuntimeId" : 6090 }, { "id" : "minecraft:leaves", - "blockRuntimeId" : 6015 + "blockRuntimeId" : 6091 }, { "id" : "minecraft:leaves", - "blockRuntimeId" : 6016 + "blockRuntimeId" : 6092 }, { "id" : "minecraft:leaves", - "blockRuntimeId" : 6017 + "blockRuntimeId" : 6093 }, { "id" : "minecraft:leaves2", - "blockRuntimeId" : 4301 + "blockRuntimeId" : 4353 }, { "id" : "minecraft:leaves2", - "blockRuntimeId" : 4302 + "blockRuntimeId" : 4354 + }, + { + "id" : "minecraft:mangrove_leaves", + "blockRuntimeId" : 6666 }, { "id" : "minecraft:azalea_leaves", - "blockRuntimeId" : 7652 + "blockRuntimeId" : 7710 }, { "id" : "minecraft:azalea_leaves_flowered", - "blockRuntimeId" : 6304 + "blockRuntimeId" : 6339 }, { "id" : "minecraft:sapling", - "blockRuntimeId" : 720 + "blockRuntimeId" : 712 }, { "id" : "minecraft:sapling", - "blockRuntimeId" : 721 + "blockRuntimeId" : 713 }, { "id" : "minecraft:sapling", - "blockRuntimeId" : 722 + "blockRuntimeId" : 714 }, { "id" : "minecraft:sapling", - "blockRuntimeId" : 723 + "blockRuntimeId" : 715 }, { "id" : "minecraft:sapling", - "blockRuntimeId" : 724 + "blockRuntimeId" : 716 }, { "id" : "minecraft:sapling", - "blockRuntimeId" : 725 + "blockRuntimeId" : 717 + }, + { + "id" : "minecraft:mangrove_propagule", + "blockRuntimeId" : 6976 }, { "id" : "minecraft:bee_nest", - "blockRuntimeId" : 5704 + "blockRuntimeId" : 5754 }, { "id" : "minecraft:wheat_seeds" @@ -1912,7 +1987,7 @@ }, { "id" : "minecraft:melon_block", - "blockRuntimeId" : 402 + "blockRuntimeId" : 392 }, { "id" : "minecraft:melon_slice" @@ -1928,97 +2003,97 @@ }, { "id" : "minecraft:pumpkin", - "blockRuntimeId" : 4509 + "blockRuntimeId" : 4577 }, { "id" : "minecraft:carved_pumpkin", - "blockRuntimeId" : 7320 + "blockRuntimeId" : 7378 }, { "id" : "minecraft:lit_pumpkin", - "blockRuntimeId" : 6559 + "blockRuntimeId" : 6685 }, { "id" : "minecraft:honeycomb" }, { "id" : "minecraft:tallgrass", - "blockRuntimeId" : 937 + "blockRuntimeId" : 929 }, { "id" : "minecraft:double_plant", - "blockRuntimeId" : 5405 + "blockRuntimeId" : 5455 }, { "id" : "minecraft:tallgrass", - "blockRuntimeId" : 936 + "blockRuntimeId" : 928 }, { "id" : "minecraft:double_plant", - "blockRuntimeId" : 5404 + "blockRuntimeId" : 5454 }, { "id" : "minecraft:nether_sprouts" }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6383 + "blockRuntimeId" : 6492 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6381 + "blockRuntimeId" : 6490 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6382 + "blockRuntimeId" : 6491 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6380 + "blockRuntimeId" : 6489 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6384 + "blockRuntimeId" : 6493 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6388 + "blockRuntimeId" : 6497 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6386 + "blockRuntimeId" : 6495 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6387 + "blockRuntimeId" : 6496 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6385 + "blockRuntimeId" : 6494 }, { "id" : "minecraft:coral", - "blockRuntimeId" : 6389 + "blockRuntimeId" : 6498 }, { "id" : "minecraft:coral_fan", - "blockRuntimeId" : 4540 + "blockRuntimeId" : 4616 }, { "id" : "minecraft:coral_fan", - "blockRuntimeId" : 4538 + "blockRuntimeId" : 4614 }, { "id" : "minecraft:coral_fan", - "blockRuntimeId" : 4539 + "blockRuntimeId" : 4615 }, { "id" : "minecraft:coral_fan", - "blockRuntimeId" : 4537 + "blockRuntimeId" : 4613 }, { "id" : "minecraft:coral_fan", - "blockRuntimeId" : 4541 + "blockRuntimeId" : 4617 }, { "id" : "minecraft:coral_fan_dead", @@ -2045,19 +2120,39 @@ }, { "id" : "minecraft:seagrass", - "blockRuntimeId" : 244 + "blockRuntimeId" : 246 }, { "id" : "minecraft:crimson_roots", - "blockRuntimeId" : 7515 + "blockRuntimeId" : 7573 }, { "id" : "minecraft:warped_roots", - "blockRuntimeId" : 4310 + "blockRuntimeId" : 4362 }, { "id" : "minecraft:yellow_flower", - "blockRuntimeId" : 316 + "blockRuntimeId" : 302 + }, + { + "id" : "minecraft:red_flower", + "blockRuntimeId" : 3616 + }, + { + "id" : "minecraft:red_flower", + "blockRuntimeId" : 3617 + }, + { + "id" : "minecraft:red_flower", + "blockRuntimeId" : 3618 + }, + { + "id" : "minecraft:red_flower", + "blockRuntimeId" : 3619 + }, + { + "id" : "minecraft:red_flower", + "blockRuntimeId" : 3620 }, { "id" : "minecraft:red_flower", @@ -2084,44 +2179,24 @@ "blockRuntimeId" : 3626 }, { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 3627 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 3628 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 3629 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 3630 - }, - { - "id" : "minecraft:red_flower", - "blockRuntimeId" : 3631 + "id" : "minecraft:double_plant", + "blockRuntimeId" : 5452 }, { "id" : "minecraft:double_plant", - "blockRuntimeId" : 5402 + "blockRuntimeId" : 5453 }, { "id" : "minecraft:double_plant", - "blockRuntimeId" : 5403 + "blockRuntimeId" : 5456 }, { "id" : "minecraft:double_plant", - "blockRuntimeId" : 5406 - }, - { - "id" : "minecraft:double_plant", - "blockRuntimeId" : 5407 + "blockRuntimeId" : 5457 }, { "id" : "minecraft:wither_rose", - "blockRuntimeId" : 6089 + "blockRuntimeId" : 6165 }, { "id" : "minecraft:white_dye" @@ -2188,43 +2263,43 @@ }, { "id" : "minecraft:vine", - "blockRuntimeId" : 902 + "blockRuntimeId" : 894 }, { "id" : "minecraft:weeping_vines", - "blockRuntimeId" : 5429 + "blockRuntimeId" : 5479 }, { "id" : "minecraft:twisting_vines", - "blockRuntimeId" : 5641 + "blockRuntimeId" : 5691 }, { "id" : "minecraft:waterlily", - "blockRuntimeId" : 1163 + "blockRuntimeId" : 1158 }, { "id" : "minecraft:deadbush", - "blockRuntimeId" : 4633 + "blockRuntimeId" : 4677 }, { "id" : "minecraft:bamboo", - "blockRuntimeId" : 3689 + "blockRuntimeId" : 3684 }, { "id" : "minecraft:snow", - "blockRuntimeId" : 4177 + "blockRuntimeId" : 4194 }, { "id" : "minecraft:ice", - "blockRuntimeId" : 6563 + "blockRuntimeId" : 6689 }, { "id" : "minecraft:packed_ice", - "blockRuntimeId" : 296 + "blockRuntimeId" : 282 }, { "id" : "minecraft:blue_ice", - "blockRuntimeId" : 6981 + "blockRuntimeId" : 7027 }, { "id" : "minecraft:snow_layer", @@ -2232,79 +2307,87 @@ }, { "id" : "minecraft:pointed_dripstone", - "blockRuntimeId" : 7358 + "blockRuntimeId" : 7416 }, { "id" : "minecraft:dripstone_block", - "blockRuntimeId" : 901 + "blockRuntimeId" : 893 }, { "id" : "minecraft:moss_carpet", - "blockRuntimeId" : 300 + "blockRuntimeId" : 286 }, { "id" : "minecraft:moss_block", - "blockRuntimeId" : 6429 + "blockRuntimeId" : 6538 }, { "id" : "minecraft:dirt_with_roots", - "blockRuntimeId" : 5347 + "blockRuntimeId" : 5397 }, { "id" : "minecraft:hanging_roots", "blockRuntimeId" : 205 }, + { + "id" : "minecraft:mangrove_roots", + "blockRuntimeId" : 6175 + }, + { + "id" : "minecraft:muddy_mangrove_roots", + "blockRuntimeId" : 345 + }, { "id" : "minecraft:big_dripleaf", - "blockRuntimeId" : 5904 + "blockRuntimeId" : 5980 }, { "id" : "minecraft:small_dripleaf_block", - "blockRuntimeId" : 4268 + "blockRuntimeId" : 4320 }, { "id" : "minecraft:spore_blossom", - "blockRuntimeId" : 7254 + "blockRuntimeId" : 7312 }, { "id" : "minecraft:azalea", - "blockRuntimeId" : 6804 + "blockRuntimeId" : 6888 }, { "id" : "minecraft:flowering_azalea", - "blockRuntimeId" : 5427 + "blockRuntimeId" : 5477 }, { "id" : "minecraft:glow_lichen", - "blockRuntimeId" : 5634 + "blockRuntimeId" : 5684 }, { "id" : "minecraft:amethyst_block", - "blockRuntimeId" : 304 + "blockRuntimeId" : 290 }, { "id" : "minecraft:budding_amethyst", - "blockRuntimeId" : 6956 + "blockRuntimeId" : 7002 }, { "id" : "minecraft:amethyst_cluster", - "blockRuntimeId" : 7752 + "blockRuntimeId" : 7810 }, { "id" : "minecraft:large_amethyst_bud", - "blockRuntimeId" : 4684 + "blockRuntimeId" : 4728 }, { "id" : "minecraft:medium_amethyst_bud", - "blockRuntimeId" : 4324 + "blockRuntimeId" : 4376 }, { "id" : "minecraft:small_amethyst_bud", - "blockRuntimeId" : 318 + "blockRuntimeId" : 304 }, { "id" : "minecraft:tuff", - "blockRuntimeId" : 360 + "blockRuntimeId" : 347 }, { "id" : "minecraft:calcite", @@ -2339,35 +2422,35 @@ }, { "id" : "minecraft:brown_mushroom", - "blockRuntimeId" : 3551 + "blockRuntimeId" : 3546 }, { "id" : "minecraft:red_mushroom", - "blockRuntimeId" : 4517 + "blockRuntimeId" : 4585 }, { "id" : "minecraft:crimson_fungus", - "blockRuntimeId" : 7695 + "blockRuntimeId" : 7753 }, { "id" : "minecraft:warped_fungus", - "blockRuntimeId" : 301 + "blockRuntimeId" : 287 }, { "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 7304 + "blockRuntimeId" : 7362 }, { "id" : "minecraft:red_mushroom_block", - "blockRuntimeId" : 3616 + "blockRuntimeId" : 3611 }, { "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 7305 + "blockRuntimeId" : 7363 }, { "id" : "minecraft:brown_mushroom_block", - "blockRuntimeId" : 7290 + "blockRuntimeId" : 7348 }, { "id" : "minecraft:egg" @@ -2386,50 +2469,66 @@ }, { "id" : "minecraft:web", - "blockRuntimeId" : 6587 + "blockRuntimeId" : 6713 }, { "id" : "minecraft:spider_eye" }, { "id" : "minecraft:mob_spawner", - "blockRuntimeId" : 411 + "blockRuntimeId" : 401 }, { "id" : "minecraft:monster_egg", - "blockRuntimeId" : 4133 + "blockRuntimeId" : 4144 }, { "id" : "minecraft:monster_egg", - "blockRuntimeId" : 4134 + "blockRuntimeId" : 4145 }, { "id" : "minecraft:monster_egg", - "blockRuntimeId" : 4135 + "blockRuntimeId" : 4146 }, { "id" : "minecraft:monster_egg", - "blockRuntimeId" : 4136 + "blockRuntimeId" : 4147 }, { "id" : "minecraft:monster_egg", - "blockRuntimeId" : 4137 + "blockRuntimeId" : 4148 }, { "id" : "minecraft:monster_egg", - "blockRuntimeId" : 4138 + "blockRuntimeId" : 4149 }, { "id" : "minecraft:infested_deepslate", - "blockRuntimeId" : 4597 + "blockRuntimeId" : 4641 }, { "id" : "minecraft:dragon_egg", - "blockRuntimeId" : 7213 + "blockRuntimeId" : 7271 }, { "id" : "minecraft:turtle_egg", - "blockRuntimeId" : 7939 + "blockRuntimeId" : 7997 + }, + { + "id" : "minecraft:frog_spawn", + "blockRuntimeId" : 4399 + }, + { + "id" : "minecraft:pearlescent_froglight", + "blockRuntimeId" : 6435 + }, + { + "id" : "minecraft:verdant_froglight", + "blockRuntimeId" : 6481 + }, + { + "id" : "minecraft:ochre_froglight", + "blockRuntimeId" : 3510 }, { "id" : "minecraft:chicken_spawn_egg" @@ -2593,6 +2692,18 @@ { "id" : "minecraft:axolotl_spawn_egg" }, + { + "id" : "minecraft:warden_spawn_egg" + }, + { + "id" : "minecraft:allay_spawn_egg" + }, + { + "id" : "minecraft:frog_spawn_egg" + }, + { + "id" : "minecraft:tadpole_spawn_egg" + }, { "id" : "minecraft:ghast_spawn_egg" }, @@ -2631,42 +2742,42 @@ }, { "id" : "minecraft:obsidian", - "blockRuntimeId" : 436 + "blockRuntimeId" : 428 }, { "id" : "minecraft:crying_obsidian", - "blockRuntimeId" : 6596 + "blockRuntimeId" : 6722 }, { "id" : "minecraft:bedrock", - "blockRuntimeId" : 6971 + "blockRuntimeId" : 7017 }, { "id" : "minecraft:soul_sand", - "blockRuntimeId" : 5739 + "blockRuntimeId" : 5831 }, { "id" : "minecraft:netherrack", - "blockRuntimeId" : 6991 + "blockRuntimeId" : 7037 }, { "id" : "minecraft:magma", - "blockRuntimeId" : 7951 + "blockRuntimeId" : 8009 }, { "id" : "minecraft:nether_wart" }, { "id" : "minecraft:end_stone", - "blockRuntimeId" : 3841 + "blockRuntimeId" : 3836 }, { "id" : "minecraft:chorus_flower", - "blockRuntimeId" : 4462 + "blockRuntimeId" : 4530 }, { "id" : "minecraft:chorus_plant", - "blockRuntimeId" : 5455 + "blockRuntimeId" : 5505 }, { "id" : "minecraft:chorus_fruit" @@ -2676,51 +2787,75 @@ }, { "id" : "minecraft:sponge", - "blockRuntimeId" : 637 + "blockRuntimeId" : 629 }, { "id" : "minecraft:sponge", - "blockRuntimeId" : 638 + "blockRuntimeId" : 630 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5193 + "blockRuntimeId" : 5237 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5194 + "blockRuntimeId" : 5238 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5195 + "blockRuntimeId" : 5239 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5196 + "blockRuntimeId" : 5240 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5197 + "blockRuntimeId" : 5241 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5198 + "blockRuntimeId" : 5242 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5199 + "blockRuntimeId" : 5243 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5200 + "blockRuntimeId" : 5244 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5201 + "blockRuntimeId" : 5245 }, { "id" : "minecraft:coral_block", - "blockRuntimeId" : 5202 + "blockRuntimeId" : 5246 + }, + { + "id" : "minecraft:sculk", + "blockRuntimeId" : 7036 + }, + { + "id" : "minecraft:sculk_vein", + "blockRuntimeId" : 7132 + }, + { + "id" : "minecraft:sculk_catalyst", + "blockRuntimeId" : 3613 + }, + { + "id" : "minecraft:sculk_shrieker", + "blockRuntimeId" : 219 + }, + { + "id" : "minecraft:sculk_sensor", + "blockRuntimeId" : 4389 + }, + { + "id" : "minecraft:reinforced_deepslate", + "blockRuntimeId" : 5832 }, { "id" : "minecraft:leather_helmet" @@ -3123,6 +3258,40 @@ { "id" : "minecraft:compass" }, + { + "id" : "minecraft:recovery_compass" + }, + { + "id" : "minecraft:goat_horn" + }, + { + "id" : "minecraft:goat_horn", + "damage" : 1 + }, + { + "id" : "minecraft:goat_horn", + "damage" : 2 + }, + { + "id" : "minecraft:goat_horn", + "damage" : 3 + }, + { + "id" : "minecraft:goat_horn", + "damage" : 4 + }, + { + "id" : "minecraft:goat_horn", + "damage" : 5 + }, + { + "id" : "minecraft:goat_horn", + "damage" : 6 + }, + { + "id" : "minecraft:goat_horn", + "damage" : 7 + }, { "id" : "minecraft:empty_map" }, @@ -3747,86 +3916,86 @@ }, { "id" : "minecraft:torch", - "blockRuntimeId" : 732 + "blockRuntimeId" : 724 }, { "id" : "minecraft:soul_torch", - "blockRuntimeId" : 4600 + "blockRuntimeId" : 4644 }, { "id" : "minecraft:sea_pickle", - "blockRuntimeId" : 5779 + "blockRuntimeId" : 5855 }, { "id" : "minecraft:lantern", - "blockRuntimeId" : 7016 + "blockRuntimeId" : 7074 }, { "id" : "minecraft:soul_lantern", - "blockRuntimeId" : 5699 + "blockRuntimeId" : 5749 }, { "id" : "minecraft:candle", - "blockRuntimeId" : 7345 + "blockRuntimeId" : 7403 }, { "id" : "minecraft:white_candle", - "blockRuntimeId" : 5250 + "blockRuntimeId" : 5300 }, { "id" : "minecraft:orange_candle", - "blockRuntimeId" : 372 + "blockRuntimeId" : 362 }, { "id" : "minecraft:magenta_candle", - "blockRuntimeId" : 428 + "blockRuntimeId" : 418 }, { "id" : "minecraft:light_blue_candle", - "blockRuntimeId" : 4501 + "blockRuntimeId" : 4569 }, { "id" : "minecraft:yellow_candle", - "blockRuntimeId" : 6115 + "blockRuntimeId" : 6192 }, { "id" : "minecraft:lime_candle", - "blockRuntimeId" : 6333 + "blockRuntimeId" : 6368 }, { "id" : "minecraft:pink_candle", - "blockRuntimeId" : 7312 + "blockRuntimeId" : 7370 }, { "id" : "minecraft:gray_candle", - "blockRuntimeId" : 947 + "blockRuntimeId" : 939 }, { "id" : "minecraft:light_gray_candle", - "blockRuntimeId" : 6147 + "blockRuntimeId" : 6224 }, { "id" : "minecraft:cyan_candle", - "blockRuntimeId" : 7668 + "blockRuntimeId" : 7726 }, { "id" : "minecraft:purple_candle", - "blockRuntimeId" : 6992 + "blockRuntimeId" : 7038 }, { "id" : "minecraft:blue_candle" }, { "id" : "minecraft:brown_candle", - "blockRuntimeId" : 5799 + "blockRuntimeId" : 5875 }, { "id" : "minecraft:green_candle", - "blockRuntimeId" : 694 + "blockRuntimeId" : 686 }, { "id" : "minecraft:red_candle", - "blockRuntimeId" : 4637 + "blockRuntimeId" : 4681 }, { "id" : "minecraft:black_candle", @@ -3834,23 +4003,23 @@ }, { "id" : "minecraft:crafting_table", - "blockRuntimeId" : 5778 + "blockRuntimeId" : 5854 }, { "id" : "minecraft:cartography_table", - "blockRuntimeId" : 8227 + "blockRuntimeId" : 8288 }, { "id" : "minecraft:fletching_table", - "blockRuntimeId" : 5757 + "blockRuntimeId" : 5833 }, { "id" : "minecraft:smithing_table", - "blockRuntimeId" : 3731 + "blockRuntimeId" : 3726 }, { "id" : "minecraft:beehive", - "blockRuntimeId" : 6032 + "blockRuntimeId" : 6108 }, { "id" : "minecraft:campfire" @@ -3860,152 +4029,152 @@ }, { "id" : "minecraft:furnace", - "blockRuntimeId" : 7744 + "blockRuntimeId" : 7802 }, { "id" : "minecraft:blast_furnace", - "blockRuntimeId" : 7509 + "blockRuntimeId" : 7567 }, { "id" : "minecraft:smoker", - "blockRuntimeId" : 655 + "blockRuntimeId" : 647 }, { "id" : "minecraft:respawn_anchor", - "blockRuntimeId" : 689 + "blockRuntimeId" : 681 }, { "id" : "minecraft:brewing_stand" }, { "id" : "minecraft:anvil", - "blockRuntimeId" : 6508 + "blockRuntimeId" : 6634 }, { "id" : "minecraft:anvil", - "blockRuntimeId" : 6512 + "blockRuntimeId" : 6638 }, { "id" : "minecraft:anvil", - "blockRuntimeId" : 6516 + "blockRuntimeId" : 6642 }, { "id" : "minecraft:grindstone", - "blockRuntimeId" : 7981 + "blockRuntimeId" : 8039 }, { "id" : "minecraft:enchanting_table", - "blockRuntimeId" : 6597 + "blockRuntimeId" : 6723 }, { "id" : "minecraft:bookshelf", - "blockRuntimeId" : 6545 + "blockRuntimeId" : 6671 }, { "id" : "minecraft:lectern", - "blockRuntimeId" : 6856 + "blockRuntimeId" : 6940 }, { "id" : "minecraft:cauldron" }, { "id" : "minecraft:composter", - "blockRuntimeId" : 5365 + "blockRuntimeId" : 5415 }, { "id" : "minecraft:chest", - "blockRuntimeId" : 7057 + "blockRuntimeId" : 7115 }, { "id" : "minecraft:trapped_chest", - "blockRuntimeId" : 5533 + "blockRuntimeId" : 5583 }, { "id" : "minecraft:ender_chest", - "blockRuntimeId" : 4317 + "blockRuntimeId" : 4369 }, { "id" : "minecraft:barrel", - "blockRuntimeId" : 4450 + "blockRuntimeId" : 4518 }, { "id" : "minecraft:undyed_shulker_box", - "blockRuntimeId" : 3686 + "blockRuntimeId" : 3681 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5266 + "blockRuntimeId" : 5316 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5274 + "blockRuntimeId" : 5324 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5273 + "blockRuntimeId" : 5323 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5281 + "blockRuntimeId" : 5331 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5278 + "blockRuntimeId" : 5328 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5280 + "blockRuntimeId" : 5330 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5267 + "blockRuntimeId" : 5317 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5270 + "blockRuntimeId" : 5320 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5271 + "blockRuntimeId" : 5321 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5279 + "blockRuntimeId" : 5329 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5275 + "blockRuntimeId" : 5325 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5269 + "blockRuntimeId" : 5319 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5277 + "blockRuntimeId" : 5327 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5276 + "blockRuntimeId" : 5326 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5268 + "blockRuntimeId" : 5318 }, { "id" : "minecraft:shulker_box", - "blockRuntimeId" : 5272 + "blockRuntimeId" : 5322 }, { "id" : "minecraft:armor_stand" }, { "id" : "minecraft:noteblock", - "blockRuntimeId" : 359 + "blockRuntimeId" : 346 }, { "id" : "minecraft:jukebox", - "blockRuntimeId" : 4830 + "blockRuntimeId" : 4874 }, { "id" : "minecraft:music_disc_13" @@ -4046,23 +4215,29 @@ { "id" : "minecraft:music_disc_otherside" }, + { + "id" : "minecraft:music_disc_5" + }, { "id" : "minecraft:music_disc_pigstep" }, + { + "id" : "minecraft:disc_fragment_5" + }, { "id" : "minecraft:glowstone_dust" }, { "id" : "minecraft:glowstone", - "blockRuntimeId" : 3874 + "blockRuntimeId" : 3885 }, { "id" : "minecraft:redstone_lamp", - "blockRuntimeId" : 265 + "blockRuntimeId" : 251 }, { "id" : "minecraft:sea_lantern", - "blockRuntimeId" : 7488 + "blockRuntimeId" : 7546 }, { "id" : "minecraft:oak_sign" @@ -4082,6 +4257,9 @@ { "id" : "minecraft:dark_oak_sign" }, + { + "id" : "minecraft:mangrove_sign" + }, { "id" : "minecraft:crimson_sign" }, @@ -4136,6 +4314,9 @@ { "id" : "minecraft:axolotl_bucket" }, + { + "id" : "minecraft:tadpole_bucket" + }, { "id" : "minecraft:skull", "damage" : 3 @@ -4165,19 +4346,19 @@ }, { "id" : "minecraft:bell", - "blockRuntimeId" : 6824 + "blockRuntimeId" : 6908 }, { "id" : "minecraft:conduit", - "blockRuntimeId" : 4196 + "blockRuntimeId" : 4232 }, { "id" : "minecraft:stonecutter_block", - "blockRuntimeId" : 7516 + "blockRuntimeId" : 7574 }, { "id" : "minecraft:end_portal_frame", - "blockRuntimeId" : 6001 + "blockRuntimeId" : 6077 }, { "id" : "minecraft:coal" @@ -4290,6 +4471,9 @@ { "id" : "minecraft:fermented_spider_eye" }, + { + "id" : "minecraft:echo_shard" + }, { "id" : "minecraft:dragon_breath" }, @@ -4313,11 +4497,11 @@ }, { "id" : "minecraft:end_rod", - "blockRuntimeId" : 5815 + "blockRuntimeId" : 5891 }, { "id" : "minecraft:lightning_rod", - "blockRuntimeId" : 1181 + "blockRuntimeId" : 1176 }, { "id" : "minecraft:end_crystal" @@ -4759,6 +4943,18 @@ "id" : "minecraft:enchanted_book", "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA=" }, + { + "id" : "minecraft:enchanted_book", + "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAEAAAA=" + }, + { + "id" : "minecraft:enchanted_book", + "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAIAAAA=" + }, + { + "id" : "minecraft:enchanted_book", + "nbt_b64" : "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAMAAAA=" + }, { "id" : "minecraft:oak_boat" }, @@ -4777,21 +4973,45 @@ { "id" : "minecraft:dark_oak_boat" }, + { + "id" : "minecraft:mangrove_boat" + }, + { + "id" : "minecraft:oak_chest_boat" + }, + { + "id" : "minecraft:spruce_chest_boat" + }, + { + "id" : "minecraft:birch_chest_boat" + }, + { + "id" : "minecraft:jungle_chest_boat" + }, + { + "id" : "minecraft:acacia_chest_boat" + }, + { + "id" : "minecraft:dark_oak_chest_boat" + }, + { + "id" : "minecraft:mangrove_chest_boat" + }, { "id" : "minecraft:rail", - "blockRuntimeId" : 3909 + "blockRuntimeId" : 3920 }, { "id" : "minecraft:golden_rail", - "blockRuntimeId" : 5282 + "blockRuntimeId" : 5332 }, { "id" : "minecraft:detector_rail", - "blockRuntimeId" : 4121 + "blockRuntimeId" : 4132 }, { "id" : "minecraft:activator_rail", - "blockRuntimeId" : 323 + "blockRuntimeId" : 309 }, { "id" : "minecraft:minecart" @@ -4810,27 +5030,27 @@ }, { "id" : "minecraft:redstone_block", - "blockRuntimeId" : 3781 + "blockRuntimeId" : 3776 }, { "id" : "minecraft:redstone_torch", - "blockRuntimeId" : 3530 + "blockRuntimeId" : 3525 }, { "id" : "minecraft:lever", - "blockRuntimeId" : 6405 + "blockRuntimeId" : 6514 }, { "id" : "minecraft:wooden_button", - "blockRuntimeId" : 6356 + "blockRuntimeId" : 6391 }, { "id" : "minecraft:spruce_button", - "blockRuntimeId" : 4269 + "blockRuntimeId" : 4321 }, { "id" : "minecraft:birch_button", - "blockRuntimeId" : 7708 + "blockRuntimeId" : 7766 }, { "id" : "minecraft:jungle_button", @@ -4838,87 +5058,95 @@ }, { "id" : "minecraft:acacia_button", - "blockRuntimeId" : 7173 + "blockRuntimeId" : 7231 }, { "id" : "minecraft:dark_oak_button", "blockRuntimeId" : 93 }, + { + "id" : "minecraft:mangrove_button", + "blockRuntimeId" : 7062 + }, { "id" : "minecraft:stone_button", - "blockRuntimeId" : 604 + "blockRuntimeId" : 596 }, { "id" : "minecraft:crimson_button", - "blockRuntimeId" : 4380 + "blockRuntimeId" : 4432 }, { "id" : "minecraft:warped_button", - "blockRuntimeId" : 7192 + "blockRuntimeId" : 7250 }, { "id" : "minecraft:polished_blackstone_button", - "blockRuntimeId" : 7732 + "blockRuntimeId" : 7790 }, { "id" : "minecraft:tripwire_hook", - "blockRuntimeId" : 5838 + "blockRuntimeId" : 5914 }, { "id" : "minecraft:wooden_pressure_plate", - "blockRuntimeId" : 8005 + "blockRuntimeId" : 8063 }, { "id" : "minecraft:spruce_pressure_plate", - "blockRuntimeId" : 3764 + "blockRuntimeId" : 3759 }, { "id" : "minecraft:birch_pressure_plate", - "blockRuntimeId" : 3560 + "blockRuntimeId" : 3555 }, { "id" : "minecraft:jungle_pressure_plate", - "blockRuntimeId" : 3640 + "blockRuntimeId" : 3635 }, { "id" : "minecraft:acacia_pressure_plate", - "blockRuntimeId" : 5203 + "blockRuntimeId" : 5247 }, { "id" : "minecraft:dark_oak_pressure_plate", - "blockRuntimeId" : 5880 + "blockRuntimeId" : 5956 + }, + { + "id" : "minecraft:mangrove_pressure_plate", + "blockRuntimeId" : 3869 }, { "id" : "minecraft:crimson_pressure_plate", - "blockRuntimeId" : 8210 + "blockRuntimeId" : 8268 }, { "id" : "minecraft:warped_pressure_plate", - "blockRuntimeId" : 270 + "blockRuntimeId" : 256 }, { "id" : "minecraft:stone_pressure_plate", - "blockRuntimeId" : 3875 + "blockRuntimeId" : 3886 }, { "id" : "minecraft:light_weighted_pressure_plate", - "blockRuntimeId" : 3670 + "blockRuntimeId" : 3665 }, { "id" : "minecraft:heavy_weighted_pressure_plate", - "blockRuntimeId" : 1165 + "blockRuntimeId" : 1160 }, { "id" : "minecraft:polished_blackstone_pressure_plate", - "blockRuntimeId" : 6197 + "blockRuntimeId" : 6232 }, { "id" : "minecraft:observer", - "blockRuntimeId" : 3518 + "blockRuntimeId" : 3513 }, { "id" : "minecraft:daylight_detector", - "blockRuntimeId" : 4180 + "blockRuntimeId" : 4197 }, { "id" : "minecraft:repeater" @@ -4931,30 +5159,30 @@ }, { "id" : "minecraft:dropper", - "blockRuntimeId" : 7327 + "blockRuntimeId" : 7385 }, { "id" : "minecraft:dispenser", - "blockRuntimeId" : 7955 + "blockRuntimeId" : 8013 }, { "id" : "minecraft:piston", - "blockRuntimeId" : 930 + "blockRuntimeId" : 922 }, { "id" : "minecraft:sticky_piston", - "blockRuntimeId" : 4312 + "blockRuntimeId" : 4364 }, { "id" : "minecraft:tnt", - "blockRuntimeId" : 6581 + "blockRuntimeId" : 6707 }, { "id" : "minecraft:name_tag" }, { "id" : "minecraft:loom", - "blockRuntimeId" : 3831 + "blockRuntimeId" : 3826 }, { "id" : "minecraft:banner" @@ -5200,7 +5428,7 @@ }, { "id" : "minecraft:target", - "blockRuntimeId" : 6355 + "blockRuntimeId" : 6390 }, { "id" : "minecraft:lodestone_compass" diff --git a/core/src/main/resources/bedrock/entity_identifiers.dat b/core/src/main/resources/bedrock/entity_identifiers.dat index b9da310f5..2e3733aa6 100644 Binary files a/core/src/main/resources/bedrock/entity_identifiers.dat and b/core/src/main/resources/bedrock/entity_identifiers.dat differ diff --git a/core/src/main/resources/bedrock/runtime_item_states.1_18_0.json b/core/src/main/resources/bedrock/runtime_item_states.1_18_0.json deleted file mode 100644 index 315547438..000000000 --- a/core/src/main/resources/bedrock/runtime_item_states.1_18_0.json +++ /dev/null @@ -1,4322 +0,0 @@ -[ - { - "name" : "minecraft:acacia_boat", - "id" : 379 - }, - { - "name" : "minecraft:acacia_button", - "id" : -140 - }, - { - "name" : "minecraft:acacia_door", - "id" : 556 - }, - { - "name" : "minecraft:acacia_fence_gate", - "id" : 187 - }, - { - "name" : "minecraft:acacia_pressure_plate", - "id" : -150 - }, - { - "name" : "minecraft:acacia_sign", - "id" : 579 - }, - { - "name" : "minecraft:acacia_stairs", - "id" : 163 - }, - { - "name" : "minecraft:acacia_standing_sign", - "id" : -190 - }, - { - "name" : "minecraft:acacia_trapdoor", - "id" : -145 - }, - { - "name" : "minecraft:acacia_wall_sign", - "id" : -191 - }, - { - "name" : "minecraft:activator_rail", - "id" : 126 - }, - { - "name" : "minecraft:agent_spawn_egg", - "id" : 487 - }, - { - "name" : "minecraft:air", - "id" : -158 - }, - { - "name" : "minecraft:allow", - "id" : 210 - }, - { - "name" : "minecraft:amethyst_block", - "id" : -327 - }, - { - "name" : "minecraft:amethyst_cluster", - "id" : -329 - }, - { - "name" : "minecraft:amethyst_shard", - "id" : 624 - }, - { - "name" : "minecraft:ancient_debris", - "id" : -271 - }, - { - "name" : "minecraft:andesite_stairs", - "id" : -171 - }, - { - "name" : "minecraft:anvil", - "id" : 145 - }, - { - "name" : "minecraft:apple", - "id" : 257 - }, - { - "name" : "minecraft:armor_stand", - "id" : 552 - }, - { - "name" : "minecraft:arrow", - "id" : 301 - }, - { - "name" : "minecraft:axolotl_bucket", - "id" : 369 - }, - { - "name" : "minecraft:axolotl_spawn_egg", - "id" : 500 - }, - { - "name" : "minecraft:azalea", - "id" : -337 - }, - { - "name" : "minecraft:azalea_leaves", - "id" : -324 - }, - { - "name" : "minecraft:azalea_leaves_flowered", - "id" : -325 - }, - { - "name" : "minecraft:baked_potato", - "id" : 281 - }, - { - "name" : "minecraft:balloon", - "id" : 597 - }, - { - "name" : "minecraft:bamboo", - "id" : -163 - }, - { - "name" : "minecraft:bamboo_sapling", - "id" : -164 - }, - { - "name" : "minecraft:banner", - "id" : 567 - }, - { - "name" : "minecraft:banner_pattern", - "id" : 629 - }, - { - "name" : "minecraft:barrel", - "id" : -203 - }, - { - "name" : "minecraft:barrier", - "id" : -161 - }, - { - "name" : "minecraft:basalt", - "id" : -234 - }, - { - "name" : "minecraft:bat_spawn_egg", - "id" : 453 - }, - { - "name" : "minecraft:beacon", - "id" : 138 - }, - { - "name" : "minecraft:bed", - "id" : 418 - }, - { - "name" : "minecraft:bedrock", - "id" : 7 - }, - { - "name" : "minecraft:bee_nest", - "id" : -218 - }, - { - "name" : "minecraft:bee_spawn_egg", - "id" : 494 - }, - { - "name" : "minecraft:beef", - "id" : 273 - }, - { - "name" : "minecraft:beehive", - "id" : -219 - }, - { - "name" : "minecraft:beetroot", - "id" : 285 - }, - { - "name" : "minecraft:beetroot_seeds", - "id" : 295 - }, - { - "name" : "minecraft:beetroot_soup", - "id" : 286 - }, - { - "name" : "minecraft:bell", - "id" : -206 - }, - { - "name" : "minecraft:big_dripleaf", - "id" : -323 - }, - { - "name" : "minecraft:birch_boat", - "id" : 376 - }, - { - "name" : "minecraft:birch_button", - "id" : -141 - }, - { - "name" : "minecraft:birch_door", - "id" : 554 - }, - { - "name" : "minecraft:birch_fence_gate", - "id" : 184 - }, - { - "name" : "minecraft:birch_pressure_plate", - "id" : -151 - }, - { - "name" : "minecraft:birch_sign", - "id" : 577 - }, - { - "name" : "minecraft:birch_stairs", - "id" : 135 - }, - { - "name" : "minecraft:birch_standing_sign", - "id" : -186 - }, - { - "name" : "minecraft:birch_trapdoor", - "id" : -146 - }, - { - "name" : "minecraft:birch_wall_sign", - "id" : -187 - }, - { - "name" : "minecraft:black_candle", - "id" : -428 - }, - { - "name" : "minecraft:black_candle_cake", - "id" : -445 - }, - { - "name" : "minecraft:black_dye", - "id" : 395 - }, - { - "name" : "minecraft:black_glazed_terracotta", - "id" : 235 - }, - { - "name" : "minecraft:blackstone", - "id" : -273 - }, - { - "name" : "minecraft:blackstone_double_slab", - "id" : -283 - }, - { - "name" : "minecraft:blackstone_slab", - "id" : -282 - }, - { - "name" : "minecraft:blackstone_stairs", - "id" : -276 - }, - { - "name" : "minecraft:blackstone_wall", - "id" : -277 - }, - { - "name" : "minecraft:blast_furnace", - "id" : -196 - }, - { - "name" : "minecraft:blaze_powder", - "id" : 429 - }, - { - "name" : "minecraft:blaze_rod", - "id" : 423 - }, - { - "name" : "minecraft:blaze_spawn_egg", - "id" : 456 - }, - { - "name" : "minecraft:bleach", - "id" : 595 - }, - { - "name" : "minecraft:blue_candle", - "id" : -424 - }, - { - "name" : "minecraft:blue_candle_cake", - "id" : -441 - }, - { - "name" : "minecraft:blue_dye", - "id" : 399 - }, - { - "name" : "minecraft:blue_glazed_terracotta", - "id" : 231 - }, - { - "name" : "minecraft:blue_ice", - "id" : -11 - }, - { - "name" : "minecraft:boat", - "id" : 627 - }, - { - "name" : "minecraft:bone", - "id" : 415 - }, - { - "name" : "minecraft:bone_block", - "id" : 216 - }, - { - "name" : "minecraft:bone_meal", - "id" : 411 - }, - { - "name" : "minecraft:book", - "id" : 387 - }, - { - "name" : "minecraft:bookshelf", - "id" : 47 - }, - { - "name" : "minecraft:border_block", - "id" : 212 - }, - { - "name" : "minecraft:bordure_indented_banner_pattern", - "id" : 586 - }, - { - "name" : "minecraft:bow", - "id" : 300 - }, - { - "name" : "minecraft:bowl", - "id" : 321 - }, - { - "name" : "minecraft:bread", - "id" : 261 - }, - { - "name" : "minecraft:brewing_stand", - "id" : 431 - }, - { - "name" : "minecraft:brewingstandblock", - "id" : 117 - }, - { - "name" : "minecraft:brick", - "id" : 383 - }, - { - "name" : "minecraft:brick_block", - "id" : 45 - }, - { - "name" : "minecraft:brick_stairs", - "id" : 108 - }, - { - "name" : "minecraft:brown_candle", - "id" : -425 - }, - { - "name" : "minecraft:brown_candle_cake", - "id" : -442 - }, - { - "name" : "minecraft:brown_dye", - "id" : 398 - }, - { - "name" : "minecraft:brown_glazed_terracotta", - "id" : 232 - }, - { - "name" : "minecraft:brown_mushroom", - "id" : 39 - }, - { - "name" : "minecraft:brown_mushroom_block", - "id" : 99 - }, - { - "name" : "minecraft:bubble_column", - "id" : -160 - }, - { - "name" : "minecraft:bucket", - "id" : 360 - }, - { - "name" : "minecraft:budding_amethyst", - "id" : -328 - }, - { - "name" : "minecraft:cactus", - "id" : 81 - }, - { - "name" : "minecraft:cake", - "id" : 417 - }, - { - "name" : "minecraft:calcite", - "id" : -326 - }, - { - "name" : "minecraft:camera", - "id" : 592 - }, - { - "name" : "minecraft:campfire", - "id" : 588 - }, - { - "name" : "minecraft:candle", - "id" : -412 - }, - { - "name" : "minecraft:candle_cake", - "id" : -429 - }, - { - "name" : "minecraft:carpet", - "id" : 171 - }, - { - "name" : "minecraft:carrot", - "id" : 279 - }, - { - "name" : "minecraft:carrot_on_a_stick", - "id" : 517 - }, - { - "name" : "minecraft:carrots", - "id" : 141 - }, - { - "name" : "minecraft:cartography_table", - "id" : -200 - }, - { - "name" : "minecraft:carved_pumpkin", - "id" : -155 - }, - { - "name" : "minecraft:cat_spawn_egg", - "id" : 488 - }, - { - "name" : "minecraft:cauldron", - "id" : 432 - }, - { - "name" : "minecraft:cave_spider_spawn_egg", - "id" : 457 - }, - { - "name" : "minecraft:cave_vines", - "id" : -322 - }, - { - "name" : "minecraft:cave_vines_body_with_berries", - "id" : -375 - }, - { - "name" : "minecraft:cave_vines_head_with_berries", - "id" : -376 - }, - { - "name" : "minecraft:chain", - "id" : 618 - }, - { - "name" : "minecraft:chain_command_block", - "id" : 189 - }, - { - "name" : "minecraft:chainmail_boots", - "id" : 342 - }, - { - "name" : "minecraft:chainmail_chestplate", - "id" : 340 - }, - { - "name" : "minecraft:chainmail_helmet", - "id" : 339 - }, - { - "name" : "minecraft:chainmail_leggings", - "id" : 341 - }, - { - "name" : "minecraft:charcoal", - "id" : 303 - }, - { - "name" : "minecraft:chemical_heat", - "id" : 192 - }, - { - "name" : "minecraft:chemistry_table", - "id" : 238 - }, - { - "name" : "minecraft:chest", - "id" : 54 - }, - { - "name" : "minecraft:chest_minecart", - "id" : 389 - }, - { - "name" : "minecraft:chicken", - "id" : 275 - }, - { - "name" : "minecraft:chicken_spawn_egg", - "id" : 435 - }, - { - "name" : "minecraft:chiseled_deepslate", - "id" : -395 - }, - { - "name" : "minecraft:chiseled_nether_bricks", - "id" : -302 - }, - { - "name" : "minecraft:chiseled_polished_blackstone", - "id" : -279 - }, - { - "name" : "minecraft:chorus_flower", - "id" : 200 - }, - { - "name" : "minecraft:chorus_fruit", - "id" : 558 - }, - { - "name" : "minecraft:chorus_plant", - "id" : 240 - }, - { - "name" : "minecraft:clay", - "id" : 82 - }, - { - "name" : "minecraft:clay_ball", - "id" : 384 - }, - { - "name" : "minecraft:client_request_placeholder_block", - "id" : -465 - }, - { - "name" : "minecraft:clock", - "id" : 393 - }, - { - "name" : "minecraft:coal", - "id" : 302 - }, - { - "name" : "minecraft:coal_block", - "id" : 173 - }, - { - "name" : "minecraft:coal_ore", - "id" : 16 - }, - { - "name" : "minecraft:cobbled_deepslate", - "id" : -379 - }, - { - "name" : "minecraft:cobbled_deepslate_double_slab", - "id" : -396 - }, - { - "name" : "minecraft:cobbled_deepslate_slab", - "id" : -380 - }, - { - "name" : "minecraft:cobbled_deepslate_stairs", - "id" : -381 - }, - { - "name" : "minecraft:cobbled_deepslate_wall", - "id" : -382 - }, - { - "name" : "minecraft:cobblestone", - "id" : 4 - }, - { - "name" : "minecraft:cobblestone_wall", - "id" : 139 - }, - { - "name" : "minecraft:cocoa", - "id" : 127 - }, - { - "name" : "minecraft:cocoa_beans", - "id" : 412 - }, - { - "name" : "minecraft:cod", - "id" : 264 - }, - { - "name" : "minecraft:cod_bucket", - "id" : 364 - }, - { - "name" : "minecraft:cod_spawn_egg", - "id" : 480 - }, - { - "name" : "minecraft:colored_torch_bp", - "id" : 204 - }, - { - "name" : "minecraft:colored_torch_rg", - "id" : 202 - }, - { - "name" : "minecraft:command_block", - "id" : 137 - }, - { - "name" : "minecraft:command_block_minecart", - "id" : 563 - }, - { - "name" : "minecraft:comparator", - "id" : 522 - }, - { - "name" : "minecraft:compass", - "id" : 391 - }, - { - "name" : "minecraft:composter", - "id" : -213 - }, - { - "name" : "minecraft:compound", - "id" : 593 - }, - { - "name" : "minecraft:concrete", - "id" : 236 - }, - { - "name" : "minecraft:concrete_powder", - "id" : 237 - }, - { - "name" : "minecraft:conduit", - "id" : -157 - }, - { - "name" : "minecraft:cooked_beef", - "id" : 274 - }, - { - "name" : "minecraft:cooked_chicken", - "id" : 276 - }, - { - "name" : "minecraft:cooked_cod", - "id" : 268 - }, - { - "name" : "minecraft:cooked_mutton", - "id" : 551 - }, - { - "name" : "minecraft:cooked_porkchop", - "id" : 263 - }, - { - "name" : "minecraft:cooked_rabbit", - "id" : 289 - }, - { - "name" : "minecraft:cooked_salmon", - "id" : 269 - }, - { - "name" : "minecraft:cookie", - "id" : 271 - }, - { - "name" : "minecraft:copper_block", - "id" : -340 - }, - { - "name" : "minecraft:copper_ingot", - "id" : 504 - }, - { - "name" : "minecraft:copper_ore", - "id" : -311 - }, - { - "name" : "minecraft:coral", - "id" : -131 - }, - { - "name" : "minecraft:coral_block", - "id" : -132 - }, - { - "name" : "minecraft:coral_fan", - "id" : -133 - }, - { - "name" : "minecraft:coral_fan_dead", - "id" : -134 - }, - { - "name" : "minecraft:coral_fan_hang", - "id" : -135 - }, - { - "name" : "minecraft:coral_fan_hang2", - "id" : -136 - }, - { - "name" : "minecraft:coral_fan_hang3", - "id" : -137 - }, - { - "name" : "minecraft:cow_spawn_egg", - "id" : 436 - }, - { - "name" : "minecraft:cracked_deepslate_bricks", - "id" : -410 - }, - { - "name" : "minecraft:cracked_deepslate_tiles", - "id" : -409 - }, - { - "name" : "minecraft:cracked_nether_bricks", - "id" : -303 - }, - { - "name" : "minecraft:cracked_polished_blackstone_bricks", - "id" : -280 - }, - { - "name" : "minecraft:crafting_table", - "id" : 58 - }, - { - "name" : "minecraft:creeper_banner_pattern", - "id" : 582 - }, - { - "name" : "minecraft:creeper_spawn_egg", - "id" : 441 - }, - { - "name" : "minecraft:crimson_button", - "id" : -260 - }, - { - "name" : "minecraft:crimson_door", - "id" : 615 - }, - { - "name" : "minecraft:crimson_double_slab", - "id" : -266 - }, - { - "name" : "minecraft:crimson_fence", - "id" : -256 - }, - { - "name" : "minecraft:crimson_fence_gate", - "id" : -258 - }, - { - "name" : "minecraft:crimson_fungus", - "id" : -228 - }, - { - "name" : "minecraft:crimson_hyphae", - "id" : -299 - }, - { - "name" : "minecraft:crimson_nylium", - "id" : -232 - }, - { - "name" : "minecraft:crimson_planks", - "id" : -242 - }, - { - "name" : "minecraft:crimson_pressure_plate", - "id" : -262 - }, - { - "name" : "minecraft:crimson_roots", - "id" : -223 - }, - { - "name" : "minecraft:crimson_sign", - "id" : 613 - }, - { - "name" : "minecraft:crimson_slab", - "id" : -264 - }, - { - "name" : "minecraft:crimson_stairs", - "id" : -254 - }, - { - "name" : "minecraft:crimson_standing_sign", - "id" : -250 - }, - { - "name" : "minecraft:crimson_stem", - "id" : -225 - }, - { - "name" : "minecraft:crimson_trapdoor", - "id" : -246 - }, - { - "name" : "minecraft:crimson_wall_sign", - "id" : -252 - }, - { - "name" : "minecraft:crossbow", - "id" : 575 - }, - { - "name" : "minecraft:crying_obsidian", - "id" : -289 - }, - { - "name" : "minecraft:cut_copper", - "id" : -347 - }, - { - "name" : "minecraft:cut_copper_slab", - "id" : -361 - }, - { - "name" : "minecraft:cut_copper_stairs", - "id" : -354 - }, - { - "name" : "minecraft:cyan_candle", - "id" : -422 - }, - { - "name" : "minecraft:cyan_candle_cake", - "id" : -439 - }, - { - "name" : "minecraft:cyan_dye", - "id" : 401 - }, - { - "name" : "minecraft:cyan_glazed_terracotta", - "id" : 229 - }, - { - "name" : "minecraft:dark_oak_boat", - "id" : 380 - }, - { - "name" : "minecraft:dark_oak_button", - "id" : -142 - }, - { - "name" : "minecraft:dark_oak_door", - "id" : 557 - }, - { - "name" : "minecraft:dark_oak_fence_gate", - "id" : 186 - }, - { - "name" : "minecraft:dark_oak_pressure_plate", - "id" : -152 - }, - { - "name" : "minecraft:dark_oak_sign", - "id" : 580 - }, - { - "name" : "minecraft:dark_oak_stairs", - "id" : 164 - }, - { - "name" : "minecraft:dark_oak_trapdoor", - "id" : -147 - }, - { - "name" : "minecraft:dark_prismarine_stairs", - "id" : -3 - }, - { - "name" : "minecraft:darkoak_standing_sign", - "id" : -192 - }, - { - "name" : "minecraft:darkoak_wall_sign", - "id" : -193 - }, - { - "name" : "minecraft:daylight_detector", - "id" : 151 - }, - { - "name" : "minecraft:daylight_detector_inverted", - "id" : 178 - }, - { - "name" : "minecraft:deadbush", - "id" : 32 - }, - { - "name" : "minecraft:deepslate", - "id" : -378 - }, - { - "name" : "minecraft:deepslate_brick_double_slab", - "id" : -399 - }, - { - "name" : "minecraft:deepslate_brick_slab", - "id" : -392 - }, - { - "name" : "minecraft:deepslate_brick_stairs", - "id" : -393 - }, - { - "name" : "minecraft:deepslate_brick_wall", - "id" : -394 - }, - { - "name" : "minecraft:deepslate_bricks", - "id" : -391 - }, - { - "name" : "minecraft:deepslate_coal_ore", - "id" : -406 - }, - { - "name" : "minecraft:deepslate_copper_ore", - "id" : -408 - }, - { - "name" : "minecraft:deepslate_diamond_ore", - "id" : -405 - }, - { - "name" : "minecraft:deepslate_emerald_ore", - "id" : -407 - }, - { - "name" : "minecraft:deepslate_gold_ore", - "id" : -402 - }, - { - "name" : "minecraft:deepslate_iron_ore", - "id" : -401 - }, - { - "name" : "minecraft:deepslate_lapis_ore", - "id" : -400 - }, - { - "name" : "minecraft:deepslate_redstone_ore", - "id" : -403 - }, - { - "name" : "minecraft:deepslate_tile_double_slab", - "id" : -398 - }, - { - "name" : "minecraft:deepslate_tile_slab", - "id" : -388 - }, - { - "name" : "minecraft:deepslate_tile_stairs", - "id" : -389 - }, - { - "name" : "minecraft:deepslate_tile_wall", - "id" : -390 - }, - { - "name" : "minecraft:deepslate_tiles", - "id" : -387 - }, - { - "name" : "minecraft:deny", - "id" : 211 - }, - { - "name" : "minecraft:detector_rail", - "id" : 28 - }, - { - "name" : "minecraft:diamond", - "id" : 304 - }, - { - "name" : "minecraft:diamond_axe", - "id" : 319 - }, - { - "name" : "minecraft:diamond_block", - "id" : 57 - }, - { - "name" : "minecraft:diamond_boots", - "id" : 350 - }, - { - "name" : "minecraft:diamond_chestplate", - "id" : 348 - }, - { - "name" : "minecraft:diamond_helmet", - "id" : 347 - }, - { - "name" : "minecraft:diamond_hoe", - "id" : 332 - }, - { - "name" : "minecraft:diamond_horse_armor", - "id" : 533 - }, - { - "name" : "minecraft:diamond_leggings", - "id" : 349 - }, - { - "name" : "minecraft:diamond_ore", - "id" : 56 - }, - { - "name" : "minecraft:diamond_pickaxe", - "id" : 318 - }, - { - "name" : "minecraft:diamond_shovel", - "id" : 317 - }, - { - "name" : "minecraft:diamond_sword", - "id" : 316 - }, - { - "name" : "minecraft:diorite_stairs", - "id" : -170 - }, - { - "name" : "minecraft:dirt", - "id" : 3 - }, - { - "name" : "minecraft:dirt_with_roots", - "id" : -318 - }, - { - "name" : "minecraft:dispenser", - "id" : 23 - }, - { - "name" : "minecraft:dolphin_spawn_egg", - "id" : 484 - }, - { - "name" : "minecraft:donkey_spawn_egg", - "id" : 465 - }, - { - "name" : "minecraft:double_cut_copper_slab", - "id" : -368 - }, - { - "name" : "minecraft:double_plant", - "id" : 175 - }, - { - "name" : "minecraft:double_stone_slab", - "id" : 44 - }, - { - "name" : "minecraft:double_stone_slab2", - "id" : 182 - }, - { - "name" : "minecraft:double_stone_slab3", - "id" : -162 - }, - { - "name" : "minecraft:double_stone_slab4", - "id" : -166 - }, - { - "name" : "minecraft:double_wooden_slab", - "id" : 157 - }, - { - "name" : "minecraft:dragon_breath", - "id" : 560 - }, - { - "name" : "minecraft:dragon_egg", - "id" : 122 - }, - { - "name" : "minecraft:dried_kelp", - "id" : 270 - }, - { - "name" : "minecraft:dried_kelp_block", - "id" : -139 - }, - { - "name" : "minecraft:dripstone_block", - "id" : -317 - }, - { - "name" : "minecraft:dropper", - "id" : 125 - }, - { - "name" : "minecraft:drowned_spawn_egg", - "id" : 483 - }, - { - "name" : "minecraft:dye", - "id" : 628 - }, - { - "name" : "minecraft:egg", - "id" : 390 - }, - { - "name" : "minecraft:elder_guardian_spawn_egg", - "id" : 471 - }, - { - "name" : "minecraft:element_0", - "id" : 36 - }, - { - "name" : "minecraft:element_1", - "id" : -12 - }, - { - "name" : "minecraft:element_10", - "id" : -21 - }, - { - "name" : "minecraft:element_100", - "id" : -111 - }, - { - "name" : "minecraft:element_101", - "id" : -112 - }, - { - "name" : "minecraft:element_102", - "id" : -113 - }, - { - "name" : "minecraft:element_103", - "id" : -114 - }, - { - "name" : "minecraft:element_104", - "id" : -115 - }, - { - "name" : "minecraft:element_105", - "id" : -116 - }, - { - "name" : "minecraft:element_106", - "id" : -117 - }, - { - "name" : "minecraft:element_107", - "id" : -118 - }, - { - "name" : "minecraft:element_108", - "id" : -119 - }, - { - "name" : "minecraft:element_109", - "id" : -120 - }, - { - "name" : "minecraft:element_11", - "id" : -22 - }, - { - "name" : "minecraft:element_110", - "id" : -121 - }, - { - "name" : "minecraft:element_111", - "id" : -122 - }, - { - "name" : "minecraft:element_112", - "id" : -123 - }, - { - "name" : "minecraft:element_113", - "id" : -124 - }, - { - "name" : "minecraft:element_114", - "id" : -125 - }, - { - "name" : "minecraft:element_115", - "id" : -126 - }, - { - "name" : "minecraft:element_116", - "id" : -127 - }, - { - "name" : "minecraft:element_117", - "id" : -128 - }, - { - "name" : "minecraft:element_118", - "id" : -129 - }, - { - "name" : "minecraft:element_12", - "id" : -23 - }, - { - "name" : "minecraft:element_13", - "id" : -24 - }, - { - "name" : "minecraft:element_14", - "id" : -25 - }, - { - "name" : "minecraft:element_15", - "id" : -26 - }, - { - "name" : "minecraft:element_16", - "id" : -27 - }, - { - "name" : "minecraft:element_17", - "id" : -28 - }, - { - "name" : "minecraft:element_18", - "id" : -29 - }, - { - "name" : "minecraft:element_19", - "id" : -30 - }, - { - "name" : "minecraft:element_2", - "id" : -13 - }, - { - "name" : "minecraft:element_20", - "id" : -31 - }, - { - "name" : "minecraft:element_21", - "id" : -32 - }, - { - "name" : "minecraft:element_22", - "id" : -33 - }, - { - "name" : "minecraft:element_23", - "id" : -34 - }, - { - "name" : "minecraft:element_24", - "id" : -35 - }, - { - "name" : "minecraft:element_25", - "id" : -36 - }, - { - "name" : "minecraft:element_26", - "id" : -37 - }, - { - "name" : "minecraft:element_27", - "id" : -38 - }, - { - "name" : "minecraft:element_28", - "id" : -39 - }, - { - "name" : "minecraft:element_29", - "id" : -40 - }, - { - "name" : "minecraft:element_3", - "id" : -14 - }, - { - "name" : "minecraft:element_30", - "id" : -41 - }, - { - "name" : "minecraft:element_31", - "id" : -42 - }, - { - "name" : "minecraft:element_32", - "id" : -43 - }, - { - "name" : "minecraft:element_33", - "id" : -44 - }, - { - "name" : "minecraft:element_34", - "id" : -45 - }, - { - "name" : "minecraft:element_35", - "id" : -46 - }, - { - "name" : "minecraft:element_36", - "id" : -47 - }, - { - "name" : "minecraft:element_37", - "id" : -48 - }, - { - "name" : "minecraft:element_38", - "id" : -49 - }, - { - "name" : "minecraft:element_39", - "id" : -50 - }, - { - "name" : "minecraft:element_4", - "id" : -15 - }, - { - "name" : "minecraft:element_40", - "id" : -51 - }, - { - "name" : "minecraft:element_41", - "id" : -52 - }, - { - "name" : "minecraft:element_42", - "id" : -53 - }, - { - "name" : "minecraft:element_43", - "id" : -54 - }, - { - "name" : "minecraft:element_44", - "id" : -55 - }, - { - "name" : "minecraft:element_45", - "id" : -56 - }, - { - "name" : "minecraft:element_46", - "id" : -57 - }, - { - "name" : "minecraft:element_47", - "id" : -58 - }, - { - "name" : "minecraft:element_48", - "id" : -59 - }, - { - "name" : "minecraft:element_49", - "id" : -60 - }, - { - "name" : "minecraft:element_5", - "id" : -16 - }, - { - "name" : "minecraft:element_50", - "id" : -61 - }, - { - "name" : "minecraft:element_51", - "id" : -62 - }, - { - "name" : "minecraft:element_52", - "id" : -63 - }, - { - "name" : "minecraft:element_53", - "id" : -64 - }, - { - "name" : "minecraft:element_54", - "id" : -65 - }, - { - "name" : "minecraft:element_55", - "id" : -66 - }, - { - "name" : "minecraft:element_56", - "id" : -67 - }, - { - "name" : "minecraft:element_57", - "id" : -68 - }, - { - "name" : "minecraft:element_58", - "id" : -69 - }, - { - "name" : "minecraft:element_59", - "id" : -70 - }, - { - "name" : "minecraft:element_6", - "id" : -17 - }, - { - "name" : "minecraft:element_60", - "id" : -71 - }, - { - "name" : "minecraft:element_61", - "id" : -72 - }, - { - "name" : "minecraft:element_62", - "id" : -73 - }, - { - "name" : "minecraft:element_63", - "id" : -74 - }, - { - "name" : "minecraft:element_64", - "id" : -75 - }, - { - "name" : "minecraft:element_65", - "id" : -76 - }, - { - "name" : "minecraft:element_66", - "id" : -77 - }, - { - "name" : "minecraft:element_67", - "id" : -78 - }, - { - "name" : "minecraft:element_68", - "id" : -79 - }, - { - "name" : "minecraft:element_69", - "id" : -80 - }, - { - "name" : "minecraft:element_7", - "id" : -18 - }, - { - "name" : "minecraft:element_70", - "id" : -81 - }, - { - "name" : "minecraft:element_71", - "id" : -82 - }, - { - "name" : "minecraft:element_72", - "id" : -83 - }, - { - "name" : "minecraft:element_73", - "id" : -84 - }, - { - "name" : "minecraft:element_74", - "id" : -85 - }, - { - "name" : "minecraft:element_75", - "id" : -86 - }, - { - "name" : "minecraft:element_76", - "id" : -87 - }, - { - "name" : "minecraft:element_77", - "id" : -88 - }, - { - "name" : "minecraft:element_78", - "id" : -89 - }, - { - "name" : "minecraft:element_79", - "id" : -90 - }, - { - "name" : "minecraft:element_8", - "id" : -19 - }, - { - "name" : "minecraft:element_80", - "id" : -91 - }, - { - "name" : "minecraft:element_81", - "id" : -92 - }, - { - "name" : "minecraft:element_82", - "id" : -93 - }, - { - "name" : "minecraft:element_83", - "id" : -94 - }, - { - "name" : "minecraft:element_84", - "id" : -95 - }, - { - "name" : "minecraft:element_85", - "id" : -96 - }, - { - "name" : "minecraft:element_86", - "id" : -97 - }, - { - "name" : "minecraft:element_87", - "id" : -98 - }, - { - "name" : "minecraft:element_88", - "id" : -99 - }, - { - "name" : "minecraft:element_89", - "id" : -100 - }, - { - "name" : "minecraft:element_9", - "id" : -20 - }, - { - "name" : "minecraft:element_90", - "id" : -101 - }, - { - "name" : "minecraft:element_91", - "id" : -102 - }, - { - "name" : "minecraft:element_92", - "id" : -103 - }, - { - "name" : "minecraft:element_93", - "id" : -104 - }, - { - "name" : "minecraft:element_94", - "id" : -105 - }, - { - "name" : "minecraft:element_95", - "id" : -106 - }, - { - "name" : "minecraft:element_96", - "id" : -107 - }, - { - "name" : "minecraft:element_97", - "id" : -108 - }, - { - "name" : "minecraft:element_98", - "id" : -109 - }, - { - "name" : "minecraft:element_99", - "id" : -110 - }, - { - "name" : "minecraft:elytra", - "id" : 564 - }, - { - "name" : "minecraft:emerald", - "id" : 512 - }, - { - "name" : "minecraft:emerald_block", - "id" : 133 - }, - { - "name" : "minecraft:emerald_ore", - "id" : 129 - }, - { - "name" : "minecraft:empty_map", - "id" : 515 - }, - { - "name" : "minecraft:enchanted_book", - "id" : 521 - }, - { - "name" : "minecraft:enchanted_golden_apple", - "id" : 259 - }, - { - "name" : "minecraft:enchanting_table", - "id" : 116 - }, - { - "name" : "minecraft:end_brick_stairs", - "id" : -178 - }, - { - "name" : "minecraft:end_bricks", - "id" : 206 - }, - { - "name" : "minecraft:end_crystal", - "id" : 631 - }, - { - "name" : "minecraft:end_gateway", - "id" : 209 - }, - { - "name" : "minecraft:end_portal", - "id" : 119 - }, - { - "name" : "minecraft:end_portal_frame", - "id" : 120 - }, - { - "name" : "minecraft:end_rod", - "id" : 208 - }, - { - "name" : "minecraft:end_stone", - "id" : 121 - }, - { - "name" : "minecraft:ender_chest", - "id" : 130 - }, - { - "name" : "minecraft:ender_eye", - "id" : 433 - }, - { - "name" : "minecraft:ender_pearl", - "id" : 422 - }, - { - "name" : "minecraft:enderman_spawn_egg", - "id" : 442 - }, - { - "name" : "minecraft:endermite_spawn_egg", - "id" : 460 - }, - { - "name" : "minecraft:evoker_spawn_egg", - "id" : 475 - }, - { - "name" : "minecraft:experience_bottle", - "id" : 508 - }, - { - "name" : "minecraft:exposed_copper", - "id" : -341 - }, - { - "name" : "minecraft:exposed_cut_copper", - "id" : -348 - }, - { - "name" : "minecraft:exposed_cut_copper_slab", - "id" : -362 - }, - { - "name" : "minecraft:exposed_cut_copper_stairs", - "id" : -355 - }, - { - "name" : "minecraft:exposed_double_cut_copper_slab", - "id" : -369 - }, - { - "name" : "minecraft:farmland", - "id" : 60 - }, - { - "name" : "minecraft:feather", - "id" : 327 - }, - { - "name" : "minecraft:fence", - "id" : 85 - }, - { - "name" : "minecraft:fence_gate", - "id" : 107 - }, - { - "name" : "minecraft:fermented_spider_eye", - "id" : 428 - }, - { - "name" : "minecraft:field_masoned_banner_pattern", - "id" : 585 - }, - { - "name" : "minecraft:filled_map", - "id" : 420 - }, - { - "name" : "minecraft:fire", - "id" : 51 - }, - { - "name" : "minecraft:fire_charge", - "id" : 509 - }, - { - "name" : "minecraft:firework_rocket", - "id" : 519 - }, - { - "name" : "minecraft:firework_star", - "id" : 520 - }, - { - "name" : "minecraft:fishing_rod", - "id" : 392 - }, - { - "name" : "minecraft:fletching_table", - "id" : -201 - }, - { - "name" : "minecraft:flint", - "id" : 356 - }, - { - "name" : "minecraft:flint_and_steel", - "id" : 299 - }, - { - "name" : "minecraft:flower_banner_pattern", - "id" : 581 - }, - { - "name" : "minecraft:flower_pot", - "id" : 514 - }, - { - "name" : "minecraft:flowering_azalea", - "id" : -338 - }, - { - "name" : "minecraft:flowing_lava", - "id" : 10 - }, - { - "name" : "minecraft:flowing_water", - "id" : 8 - }, - { - "name" : "minecraft:fox_spawn_egg", - "id" : 490 - }, - { - "name" : "minecraft:frame", - "id" : 513 - }, - { - "name" : "minecraft:frosted_ice", - "id" : 207 - }, - { - "name" : "minecraft:furnace", - "id" : 61 - }, - { - "name" : "minecraft:ghast_spawn_egg", - "id" : 454 - }, - { - "name" : "minecraft:ghast_tear", - "id" : 424 - }, - { - "name" : "minecraft:gilded_blackstone", - "id" : -281 - }, - { - "name" : "minecraft:glass", - "id" : 20 - }, - { - "name" : "minecraft:glass_bottle", - "id" : 427 - }, - { - "name" : "minecraft:glass_pane", - "id" : 102 - }, - { - "name" : "minecraft:glistering_melon_slice", - "id" : 434 - }, - { - "name" : "minecraft:glow_berries", - "id" : 632 - }, - { - "name" : "minecraft:glow_frame", - "id" : 622 - }, - { - "name" : "minecraft:glow_ink_sac", - "id" : 503 - }, - { - "name" : "minecraft:glow_lichen", - "id" : -411 - }, - { - "name" : "minecraft:glow_squid_spawn_egg", - "id" : 502 - }, - { - "name" : "minecraft:glow_stick", - "id" : 600 - }, - { - "name" : "minecraft:glowingobsidian", - "id" : 246 - }, - { - "name" : "minecraft:glowstone", - "id" : 89 - }, - { - "name" : "minecraft:glowstone_dust", - "id" : 394 - }, - { - "name" : "minecraft:goat_horn", - "id" : 623 - }, - { - "name" : "minecraft:goat_spawn_egg", - "id" : 501 - }, - { - "name" : "minecraft:gold_block", - "id" : 41 - }, - { - "name" : "minecraft:gold_ingot", - "id" : 306 - }, - { - "name" : "minecraft:gold_nugget", - "id" : 425 - }, - { - "name" : "minecraft:gold_ore", - "id" : 14 - }, - { - "name" : "minecraft:golden_apple", - "id" : 258 - }, - { - "name" : "minecraft:golden_axe", - "id" : 325 - }, - { - "name" : "minecraft:golden_boots", - "id" : 354 - }, - { - "name" : "minecraft:golden_carrot", - "id" : 283 - }, - { - "name" : "minecraft:golden_chestplate", - "id" : 352 - }, - { - "name" : "minecraft:golden_helmet", - "id" : 351 - }, - { - "name" : "minecraft:golden_hoe", - "id" : 333 - }, - { - "name" : "minecraft:golden_horse_armor", - "id" : 532 - }, - { - "name" : "minecraft:golden_leggings", - "id" : 353 - }, - { - "name" : "minecraft:golden_pickaxe", - "id" : 324 - }, - { - "name" : "minecraft:golden_rail", - "id" : 27 - }, - { - "name" : "minecraft:golden_shovel", - "id" : 323 - }, - { - "name" : "minecraft:golden_sword", - "id" : 322 - }, - { - "name" : "minecraft:granite_stairs", - "id" : -169 - }, - { - "name" : "minecraft:grass", - "id" : 2 - }, - { - "name" : "minecraft:grass_path", - "id" : 198 - }, - { - "name" : "minecraft:gravel", - "id" : 13 - }, - { - "name" : "minecraft:gray_candle", - "id" : -420 - }, - { - "name" : "minecraft:gray_candle_cake", - "id" : -437 - }, - { - "name" : "minecraft:gray_dye", - "id" : 403 - }, - { - "name" : "minecraft:gray_glazed_terracotta", - "id" : 227 - }, - { - "name" : "minecraft:green_candle", - "id" : -426 - }, - { - "name" : "minecraft:green_candle_cake", - "id" : -443 - }, - { - "name" : "minecraft:green_dye", - "id" : 397 - }, - { - "name" : "minecraft:green_glazed_terracotta", - "id" : 233 - }, - { - "name" : "minecraft:grindstone", - "id" : -195 - }, - { - "name" : "minecraft:guardian_spawn_egg", - "id" : 461 - }, - { - "name" : "minecraft:gunpowder", - "id" : 328 - }, - { - "name" : "minecraft:hanging_roots", - "id" : -319 - }, - { - "name" : "minecraft:hard_glass", - "id" : 253 - }, - { - "name" : "minecraft:hard_glass_pane", - "id" : 190 - }, - { - "name" : "minecraft:hard_stained_glass", - "id" : 254 - }, - { - "name" : "minecraft:hard_stained_glass_pane", - "id" : 191 - }, - { - "name" : "minecraft:hardened_clay", - "id" : 172 - }, - { - "name" : "minecraft:hay_block", - "id" : 170 - }, - { - "name" : "minecraft:heart_of_the_sea", - "id" : 571 - }, - { - "name" : "minecraft:heavy_weighted_pressure_plate", - "id" : 148 - }, - { - "name" : "minecraft:hoglin_spawn_egg", - "id" : 496 - }, - { - "name" : "minecraft:honey_block", - "id" : -220 - }, - { - "name" : "minecraft:honey_bottle", - "id" : 591 - }, - { - "name" : "minecraft:honeycomb", - "id" : 590 - }, - { - "name" : "minecraft:honeycomb_block", - "id" : -221 - }, - { - "name" : "minecraft:hopper", - "id" : 527 - }, - { - "name" : "minecraft:hopper_minecart", - "id" : 526 - }, - { - "name" : "minecraft:horse_spawn_egg", - "id" : 458 - }, - { - "name" : "minecraft:husk_spawn_egg", - "id" : 463 - }, - { - "name" : "minecraft:ice", - "id" : 79 - }, - { - "name" : "minecraft:ice_bomb", - "id" : 594 - }, - { - "name" : "minecraft:infested_deepslate", - "id" : -454 - }, - { - "name" : "minecraft:info_update", - "id" : 248 - }, - { - "name" : "minecraft:info_update2", - "id" : 249 - }, - { - "name" : "minecraft:ink_sac", - "id" : 413 - }, - { - "name" : "minecraft:invisiblebedrock", - "id" : 95 - }, - { - "name" : "minecraft:iron_axe", - "id" : 298 - }, - { - "name" : "minecraft:iron_bars", - "id" : 101 - }, - { - "name" : "minecraft:iron_block", - "id" : 42 - }, - { - "name" : "minecraft:iron_boots", - "id" : 346 - }, - { - "name" : "minecraft:iron_chestplate", - "id" : 344 - }, - { - "name" : "minecraft:iron_door", - "id" : 372 - }, - { - "name" : "minecraft:iron_helmet", - "id" : 343 - }, - { - "name" : "minecraft:iron_hoe", - "id" : 331 - }, - { - "name" : "minecraft:iron_horse_armor", - "id" : 531 - }, - { - "name" : "minecraft:iron_ingot", - "id" : 305 - }, - { - "name" : "minecraft:iron_leggings", - "id" : 345 - }, - { - "name" : "minecraft:iron_nugget", - "id" : 569 - }, - { - "name" : "minecraft:iron_ore", - "id" : 15 - }, - { - "name" : "minecraft:iron_pickaxe", - "id" : 297 - }, - { - "name" : "minecraft:iron_shovel", - "id" : 296 - }, - { - "name" : "minecraft:iron_sword", - "id" : 307 - }, - { - "name" : "minecraft:iron_trapdoor", - "id" : 167 - }, - { - "name" : "minecraft:item.acacia_door", - "id" : 196 - }, - { - "name" : "minecraft:item.bed", - "id" : 26 - }, - { - "name" : "minecraft:item.beetroot", - "id" : 244 - }, - { - "name" : "minecraft:item.birch_door", - "id" : 194 - }, - { - "name" : "minecraft:item.cake", - "id" : 92 - }, - { - "name" : "minecraft:item.camera", - "id" : 242 - }, - { - "name" : "minecraft:item.campfire", - "id" : -209 - }, - { - "name" : "minecraft:item.cauldron", - "id" : 118 - }, - { - "name" : "minecraft:item.chain", - "id" : -286 - }, - { - "name" : "minecraft:item.crimson_door", - "id" : -244 - }, - { - "name" : "minecraft:item.dark_oak_door", - "id" : 197 - }, - { - "name" : "minecraft:item.flower_pot", - "id" : 140 - }, - { - "name" : "minecraft:item.frame", - "id" : 199 - }, - { - "name" : "minecraft:item.glow_frame", - "id" : -339 - }, - { - "name" : "minecraft:item.hopper", - "id" : 154 - }, - { - "name" : "minecraft:item.iron_door", - "id" : 71 - }, - { - "name" : "minecraft:item.jungle_door", - "id" : 195 - }, - { - "name" : "minecraft:item.kelp", - "id" : -138 - }, - { - "name" : "minecraft:item.nether_sprouts", - "id" : -238 - }, - { - "name" : "minecraft:item.nether_wart", - "id" : 115 - }, - { - "name" : "minecraft:item.reeds", - "id" : 83 - }, - { - "name" : "minecraft:item.skull", - "id" : 144 - }, - { - "name" : "minecraft:item.soul_campfire", - "id" : -290 - }, - { - "name" : "minecraft:item.spruce_door", - "id" : 193 - }, - { - "name" : "minecraft:item.warped_door", - "id" : -245 - }, - { - "name" : "minecraft:item.wheat", - "id" : 59 - }, - { - "name" : "minecraft:item.wooden_door", - "id" : 64 - }, - { - "name" : "minecraft:jigsaw", - "id" : -211 - }, - { - "name" : "minecraft:jukebox", - "id" : 84 - }, - { - "name" : "minecraft:jungle_boat", - "id" : 377 - }, - { - "name" : "minecraft:jungle_button", - "id" : -143 - }, - { - "name" : "minecraft:jungle_door", - "id" : 555 - }, - { - "name" : "minecraft:jungle_fence_gate", - "id" : 185 - }, - { - "name" : "minecraft:jungle_pressure_plate", - "id" : -153 - }, - { - "name" : "minecraft:jungle_sign", - "id" : 578 - }, - { - "name" : "minecraft:jungle_stairs", - "id" : 136 - }, - { - "name" : "minecraft:jungle_standing_sign", - "id" : -188 - }, - { - "name" : "minecraft:jungle_trapdoor", - "id" : -148 - }, - { - "name" : "minecraft:jungle_wall_sign", - "id" : -189 - }, - { - "name" : "minecraft:kelp", - "id" : 382 - }, - { - "name" : "minecraft:ladder", - "id" : 65 - }, - { - "name" : "minecraft:lantern", - "id" : -208 - }, - { - "name" : "minecraft:lapis_block", - "id" : 22 - }, - { - "name" : "minecraft:lapis_lazuli", - "id" : 414 - }, - { - "name" : "minecraft:lapis_ore", - "id" : 21 - }, - { - "name" : "minecraft:large_amethyst_bud", - "id" : -330 - }, - { - "name" : "minecraft:lava", - "id" : 11 - }, - { - "name" : "minecraft:lava_bucket", - "id" : 363 - }, - { - "name" : "minecraft:lava_cauldron", - "id" : -210 - }, - { - "name" : "minecraft:lead", - "id" : 547 - }, - { - "name" : "minecraft:leather", - "id" : 381 - }, - { - "name" : "minecraft:leather_boots", - "id" : 338 - }, - { - "name" : "minecraft:leather_chestplate", - "id" : 336 - }, - { - "name" : "minecraft:leather_helmet", - "id" : 335 - }, - { - "name" : "minecraft:leather_horse_armor", - "id" : 530 - }, - { - "name" : "minecraft:leather_leggings", - "id" : 337 - }, - { - "name" : "minecraft:leaves", - "id" : 18 - }, - { - "name" : "minecraft:leaves2", - "id" : 161 - }, - { - "name" : "minecraft:lectern", - "id" : -194 - }, - { - "name" : "minecraft:lever", - "id" : 69 - }, - { - "name" : "minecraft:light_block", - "id" : -215 - }, - { - "name" : "minecraft:light_blue_candle", - "id" : -416 - }, - { - "name" : "minecraft:light_blue_candle_cake", - "id" : -433 - }, - { - "name" : "minecraft:light_blue_dye", - "id" : 407 - }, - { - "name" : "minecraft:light_blue_glazed_terracotta", - "id" : 223 - }, - { - "name" : "minecraft:light_gray_candle", - "id" : -421 - }, - { - "name" : "minecraft:light_gray_candle_cake", - "id" : -438 - }, - { - "name" : "minecraft:light_gray_dye", - "id" : 402 - }, - { - "name" : "minecraft:light_weighted_pressure_plate", - "id" : 147 - }, - { - "name" : "minecraft:lightning_rod", - "id" : -312 - }, - { - "name" : "minecraft:lime_candle", - "id" : -418 - }, - { - "name" : "minecraft:lime_candle_cake", - "id" : -435 - }, - { - "name" : "minecraft:lime_dye", - "id" : 405 - }, - { - "name" : "minecraft:lime_glazed_terracotta", - "id" : 225 - }, - { - "name" : "minecraft:lingering_potion", - "id" : 562 - }, - { - "name" : "minecraft:lit_blast_furnace", - "id" : -214 - }, - { - "name" : "minecraft:lit_deepslate_redstone_ore", - "id" : -404 - }, - { - "name" : "minecraft:lit_furnace", - "id" : 62 - }, - { - "name" : "minecraft:lit_pumpkin", - "id" : 91 - }, - { - "name" : "minecraft:lit_redstone_lamp", - "id" : 124 - }, - { - "name" : "minecraft:lit_redstone_ore", - "id" : 74 - }, - { - "name" : "minecraft:lit_smoker", - "id" : -199 - }, - { - "name" : "minecraft:llama_spawn_egg", - "id" : 473 - }, - { - "name" : "minecraft:lodestone", - "id" : -222 - }, - { - "name" : "minecraft:lodestone_compass", - "id" : 601 - }, - { - "name" : "minecraft:log", - "id" : 17 - }, - { - "name" : "minecraft:log2", - "id" : 162 - }, - { - "name" : "minecraft:loom", - "id" : -204 - }, - { - "name" : "minecraft:magenta_candle", - "id" : -415 - }, - { - "name" : "minecraft:magenta_candle_cake", - "id" : -432 - }, - { - "name" : "minecraft:magenta_dye", - "id" : 408 - }, - { - "name" : "minecraft:magenta_glazed_terracotta", - "id" : 222 - }, - { - "name" : "minecraft:magma", - "id" : 213 - }, - { - "name" : "minecraft:magma_cream", - "id" : 430 - }, - { - "name" : "minecraft:magma_cube_spawn_egg", - "id" : 455 - }, - { - "name" : "minecraft:medicine", - "id" : 598 - }, - { - "name" : "minecraft:medium_amethyst_bud", - "id" : -331 - }, - { - "name" : "minecraft:melon_block", - "id" : 103 - }, - { - "name" : "minecraft:melon_seeds", - "id" : 293 - }, - { - "name" : "minecraft:melon_slice", - "id" : 272 - }, - { - "name" : "minecraft:melon_stem", - "id" : 105 - }, - { - "name" : "minecraft:milk_bucket", - "id" : 361 - }, - { - "name" : "minecraft:minecart", - "id" : 370 - }, - { - "name" : "minecraft:mob_spawner", - "id" : 52 - }, - { - "name" : "minecraft:mojang_banner_pattern", - "id" : 584 - }, - { - "name" : "minecraft:monster_egg", - "id" : 97 - }, - { - "name" : "minecraft:mooshroom_spawn_egg", - "id" : 440 - }, - { - "name" : "minecraft:moss_block", - "id" : -320 - }, - { - "name" : "minecraft:moss_carpet", - "id" : -335 - }, - { - "name" : "minecraft:mossy_cobblestone", - "id" : 48 - }, - { - "name" : "minecraft:mossy_cobblestone_stairs", - "id" : -179 - }, - { - "name" : "minecraft:mossy_stone_brick_stairs", - "id" : -175 - }, - { - "name" : "minecraft:movingblock", - "id" : 250 - }, - { - "name" : "minecraft:mule_spawn_egg", - "id" : 466 - }, - { - "name" : "minecraft:mushroom_stew", - "id" : 260 - }, - { - "name" : "minecraft:music_disc_11", - "id" : 544 - }, - { - "name" : "minecraft:music_disc_13", - "id" : 534 - }, - { - "name" : "minecraft:music_disc_blocks", - "id" : 536 - }, - { - "name" : "minecraft:music_disc_cat", - "id" : 535 - }, - { - "name" : "minecraft:music_disc_chirp", - "id" : 537 - }, - { - "name" : "minecraft:music_disc_far", - "id" : 538 - }, - { - "name" : "minecraft:music_disc_mall", - "id" : 539 - }, - { - "name" : "minecraft:music_disc_mellohi", - "id" : 540 - }, - { - "name" : "minecraft:music_disc_otherside", - "id" : 626 - }, - { - "name" : "minecraft:music_disc_pigstep", - "id" : 619 - }, - { - "name" : "minecraft:music_disc_stal", - "id" : 541 - }, - { - "name" : "minecraft:music_disc_strad", - "id" : 542 - }, - { - "name" : "minecraft:music_disc_wait", - "id" : 545 - }, - { - "name" : "minecraft:music_disc_ward", - "id" : 543 - }, - { - "name" : "minecraft:mutton", - "id" : 550 - }, - { - "name" : "minecraft:mycelium", - "id" : 110 - }, - { - "name" : "minecraft:mysterious_frame", - "id" : -466 - }, - { - "name" : "minecraft:mysterious_frame_slot", - "id" : -467 - }, - { - "name" : "minecraft:name_tag", - "id" : 548 - }, - { - "name" : "minecraft:nautilus_shell", - "id" : 570 - }, - { - "name" : "minecraft:nether_brick", - "id" : 112 - }, - { - "name" : "minecraft:nether_brick_fence", - "id" : 113 - }, - { - "name" : "minecraft:nether_brick_stairs", - "id" : 114 - }, - { - "name" : "minecraft:nether_gold_ore", - "id" : -288 - }, - { - "name" : "minecraft:nether_sprouts", - "id" : 620 - }, - { - "name" : "minecraft:nether_star", - "id" : 518 - }, - { - "name" : "minecraft:nether_wart", - "id" : 294 - }, - { - "name" : "minecraft:nether_wart_block", - "id" : 214 - }, - { - "name" : "minecraft:netherbrick", - "id" : 523 - }, - { - "name" : "minecraft:netherite_axe", - "id" : 606 - }, - { - "name" : "minecraft:netherite_block", - "id" : -270 - }, - { - "name" : "minecraft:netherite_boots", - "id" : 611 - }, - { - "name" : "minecraft:netherite_chestplate", - "id" : 609 - }, - { - "name" : "minecraft:netherite_helmet", - "id" : 608 - }, - { - "name" : "minecraft:netherite_hoe", - "id" : 607 - }, - { - "name" : "minecraft:netherite_ingot", - "id" : 602 - }, - { - "name" : "minecraft:netherite_leggings", - "id" : 610 - }, - { - "name" : "minecraft:netherite_pickaxe", - "id" : 605 - }, - { - "name" : "minecraft:netherite_scrap", - "id" : 612 - }, - { - "name" : "minecraft:netherite_shovel", - "id" : 604 - }, - { - "name" : "minecraft:netherite_sword", - "id" : 603 - }, - { - "name" : "minecraft:netherrack", - "id" : 87 - }, - { - "name" : "minecraft:netherreactor", - "id" : 247 - }, - { - "name" : "minecraft:normal_stone_stairs", - "id" : -180 - }, - { - "name" : "minecraft:noteblock", - "id" : 25 - }, - { - "name" : "minecraft:npc_spawn_egg", - "id" : 470 - }, - { - "name" : "minecraft:oak_boat", - "id" : 375 - }, - { - "name" : "minecraft:oak_sign", - "id" : 358 - }, - { - "name" : "minecraft:oak_stairs", - "id" : 53 - }, - { - "name" : "minecraft:observer", - "id" : 251 - }, - { - "name" : "minecraft:obsidian", - "id" : 49 - }, - { - "name" : "minecraft:ocelot_spawn_egg", - "id" : 451 - }, - { - "name" : "minecraft:orange_candle", - "id" : -414 - }, - { - "name" : "minecraft:orange_candle_cake", - "id" : -431 - }, - { - "name" : "minecraft:orange_dye", - "id" : 409 - }, - { - "name" : "minecraft:orange_glazed_terracotta", - "id" : 221 - }, - { - "name" : "minecraft:oxidized_copper", - "id" : -343 - }, - { - "name" : "minecraft:oxidized_cut_copper", - "id" : -350 - }, - { - "name" : "minecraft:oxidized_cut_copper_slab", - "id" : -364 - }, - { - "name" : "minecraft:oxidized_cut_copper_stairs", - "id" : -357 - }, - { - "name" : "minecraft:oxidized_double_cut_copper_slab", - "id" : -371 - }, - { - "name" : "minecraft:packed_ice", - "id" : 174 - }, - { - "name" : "minecraft:painting", - "id" : 357 - }, - { - "name" : "minecraft:panda_spawn_egg", - "id" : 489 - }, - { - "name" : "minecraft:paper", - "id" : 386 - }, - { - "name" : "minecraft:parrot_spawn_egg", - "id" : 478 - }, - { - "name" : "minecraft:phantom_membrane", - "id" : 574 - }, - { - "name" : "minecraft:phantom_spawn_egg", - "id" : 486 - }, - { - "name" : "minecraft:pig_spawn_egg", - "id" : 437 - }, - { - "name" : "minecraft:piglin_banner_pattern", - "id" : 587 - }, - { - "name" : "minecraft:piglin_brute_spawn_egg", - "id" : 499 - }, - { - "name" : "minecraft:piglin_spawn_egg", - "id" : 497 - }, - { - "name" : "minecraft:pillager_spawn_egg", - "id" : 491 - }, - { - "name" : "minecraft:pink_candle", - "id" : -419 - }, - { - "name" : "minecraft:pink_candle_cake", - "id" : -436 - }, - { - "name" : "minecraft:pink_dye", - "id" : 404 - }, - { - "name" : "minecraft:pink_glazed_terracotta", - "id" : 226 - }, - { - "name" : "minecraft:piston", - "id" : 33 - }, - { - "name" : "minecraft:pistonarmcollision", - "id" : 34 - }, - { - "name" : "minecraft:planks", - "id" : 5 - }, - { - "name" : "minecraft:podzol", - "id" : 243 - }, - { - "name" : "minecraft:pointed_dripstone", - "id" : -308 - }, - { - "name" : "minecraft:poisonous_potato", - "id" : 282 - }, - { - "name" : "minecraft:polar_bear_spawn_egg", - "id" : 472 - }, - { - "name" : "minecraft:polished_andesite_stairs", - "id" : -174 - }, - { - "name" : "minecraft:polished_basalt", - "id" : -235 - }, - { - "name" : "minecraft:polished_blackstone", - "id" : -291 - }, - { - "name" : "minecraft:polished_blackstone_brick_double_slab", - "id" : -285 - }, - { - "name" : "minecraft:polished_blackstone_brick_slab", - "id" : -284 - }, - { - "name" : "minecraft:polished_blackstone_brick_stairs", - "id" : -275 - }, - { - "name" : "minecraft:polished_blackstone_brick_wall", - "id" : -278 - }, - { - "name" : "minecraft:polished_blackstone_bricks", - "id" : -274 - }, - { - "name" : "minecraft:polished_blackstone_button", - "id" : -296 - }, - { - "name" : "minecraft:polished_blackstone_double_slab", - "id" : -294 - }, - { - "name" : "minecraft:polished_blackstone_pressure_plate", - "id" : -295 - }, - { - "name" : "minecraft:polished_blackstone_slab", - "id" : -293 - }, - { - "name" : "minecraft:polished_blackstone_stairs", - "id" : -292 - }, - { - "name" : "minecraft:polished_blackstone_wall", - "id" : -297 - }, - { - "name" : "minecraft:polished_deepslate", - "id" : -383 - }, - { - "name" : "minecraft:polished_deepslate_double_slab", - "id" : -397 - }, - { - "name" : "minecraft:polished_deepslate_slab", - "id" : -384 - }, - { - "name" : "minecraft:polished_deepslate_stairs", - "id" : -385 - }, - { - "name" : "minecraft:polished_deepslate_wall", - "id" : -386 - }, - { - "name" : "minecraft:polished_diorite_stairs", - "id" : -173 - }, - { - "name" : "minecraft:polished_granite_stairs", - "id" : -172 - }, - { - "name" : "minecraft:popped_chorus_fruit", - "id" : 559 - }, - { - "name" : "minecraft:porkchop", - "id" : 262 - }, - { - "name" : "minecraft:portal", - "id" : 90 - }, - { - "name" : "minecraft:potato", - "id" : 280 - }, - { - "name" : "minecraft:potatoes", - "id" : 142 - }, - { - "name" : "minecraft:potion", - "id" : 426 - }, - { - "name" : "minecraft:powder_snow", - "id" : -306 - }, - { - "name" : "minecraft:powder_snow_bucket", - "id" : 368 - }, - { - "name" : "minecraft:powered_comparator", - "id" : 150 - }, - { - "name" : "minecraft:powered_repeater", - "id" : 94 - }, - { - "name" : "minecraft:prismarine", - "id" : 168 - }, - { - "name" : "minecraft:prismarine_bricks_stairs", - "id" : -4 - }, - { - "name" : "minecraft:prismarine_crystals", - "id" : 549 - }, - { - "name" : "minecraft:prismarine_shard", - "id" : 565 - }, - { - "name" : "minecraft:prismarine_stairs", - "id" : -2 - }, - { - "name" : "minecraft:pufferfish", - "id" : 267 - }, - { - "name" : "minecraft:pufferfish_bucket", - "id" : 367 - }, - { - "name" : "minecraft:pufferfish_spawn_egg", - "id" : 481 - }, - { - "name" : "minecraft:pumpkin", - "id" : 86 - }, - { - "name" : "minecraft:pumpkin_pie", - "id" : 284 - }, - { - "name" : "minecraft:pumpkin_seeds", - "id" : 292 - }, - { - "name" : "minecraft:pumpkin_stem", - "id" : 104 - }, - { - "name" : "minecraft:purple_candle", - "id" : -423 - }, - { - "name" : "minecraft:purple_candle_cake", - "id" : -440 - }, - { - "name" : "minecraft:purple_dye", - "id" : 400 - }, - { - "name" : "minecraft:purple_glazed_terracotta", - "id" : 219 - }, - { - "name" : "minecraft:purpur_block", - "id" : 201 - }, - { - "name" : "minecraft:purpur_stairs", - "id" : 203 - }, - { - "name" : "minecraft:quartz", - "id" : 524 - }, - { - "name" : "minecraft:quartz_block", - "id" : 155 - }, - { - "name" : "minecraft:quartz_bricks", - "id" : -304 - }, - { - "name" : "minecraft:quartz_ore", - "id" : 153 - }, - { - "name" : "minecraft:quartz_stairs", - "id" : 156 - }, - { - "name" : "minecraft:rabbit", - "id" : 288 - }, - { - "name" : "minecraft:rabbit_foot", - "id" : 528 - }, - { - "name" : "minecraft:rabbit_hide", - "id" : 529 - }, - { - "name" : "minecraft:rabbit_spawn_egg", - "id" : 459 - }, - { - "name" : "minecraft:rabbit_stew", - "id" : 290 - }, - { - "name" : "minecraft:rail", - "id" : 66 - }, - { - "name" : "minecraft:rapid_fertilizer", - "id" : 596 - }, - { - "name" : "minecraft:ravager_spawn_egg", - "id" : 493 - }, - { - "name" : "minecraft:raw_copper", - "id" : 507 - }, - { - "name" : "minecraft:raw_copper_block", - "id" : -452 - }, - { - "name" : "minecraft:raw_gold", - "id" : 506 - }, - { - "name" : "minecraft:raw_gold_block", - "id" : -453 - }, - { - "name" : "minecraft:raw_iron", - "id" : 505 - }, - { - "name" : "minecraft:raw_iron_block", - "id" : -451 - }, - { - "name" : "minecraft:real_double_stone_slab", - "id" : 43 - }, - { - "name" : "minecraft:real_double_stone_slab2", - "id" : 181 - }, - { - "name" : "minecraft:real_double_stone_slab3", - "id" : -167 - }, - { - "name" : "minecraft:real_double_stone_slab4", - "id" : -168 - }, - { - "name" : "minecraft:red_candle", - "id" : -427 - }, - { - "name" : "minecraft:red_candle_cake", - "id" : -444 - }, - { - "name" : "minecraft:red_dye", - "id" : 396 - }, - { - "name" : "minecraft:red_flower", - "id" : 38 - }, - { - "name" : "minecraft:red_glazed_terracotta", - "id" : 234 - }, - { - "name" : "minecraft:red_mushroom", - "id" : 40 - }, - { - "name" : "minecraft:red_mushroom_block", - "id" : 100 - }, - { - "name" : "minecraft:red_nether_brick", - "id" : 215 - }, - { - "name" : "minecraft:red_nether_brick_stairs", - "id" : -184 - }, - { - "name" : "minecraft:red_sandstone", - "id" : 179 - }, - { - "name" : "minecraft:red_sandstone_stairs", - "id" : 180 - }, - { - "name" : "minecraft:redstone", - "id" : 373 - }, - { - "name" : "minecraft:redstone_block", - "id" : 152 - }, - { - "name" : "minecraft:redstone_lamp", - "id" : 123 - }, - { - "name" : "minecraft:redstone_ore", - "id" : 73 - }, - { - "name" : "minecraft:redstone_torch", - "id" : 76 - }, - { - "name" : "minecraft:redstone_wire", - "id" : 55 - }, - { - "name" : "minecraft:repeater", - "id" : 419 - }, - { - "name" : "minecraft:repeating_command_block", - "id" : 188 - }, - { - "name" : "minecraft:reserved6", - "id" : 255 - }, - { - "name" : "minecraft:respawn_anchor", - "id" : -272 - }, - { - "name" : "minecraft:rotten_flesh", - "id" : 277 - }, - { - "name" : "minecraft:saddle", - "id" : 371 - }, - { - "name" : "minecraft:salmon", - "id" : 265 - }, - { - "name" : "minecraft:salmon_bucket", - "id" : 365 - }, - { - "name" : "minecraft:salmon_spawn_egg", - "id" : 482 - }, - { - "name" : "minecraft:sand", - "id" : 12 - }, - { - "name" : "minecraft:sandstone", - "id" : 24 - }, - { - "name" : "minecraft:sandstone_stairs", - "id" : 128 - }, - { - "name" : "minecraft:sapling", - "id" : 6 - }, - { - "name" : "minecraft:scaffolding", - "id" : -165 - }, - { - "name" : "minecraft:sculk", - "id" : -458 - }, - { - "name" : "minecraft:sculk_catalyst", - "id" : -460 - }, - { - "name" : "minecraft:sculk_sensor", - "id" : -307 - }, - { - "name" : "minecraft:sculk_shrieker", - "id" : -461 - }, - { - "name" : "minecraft:sculk_vein", - "id" : -459 - }, - { - "name" : "minecraft:scute", - "id" : 572 - }, - { - "name" : "minecraft:sea_pickle", - "id" : -156 - }, - { - "name" : "minecraft:seagrass", - "id" : -130 - }, - { - "name" : "minecraft:sealantern", - "id" : 169 - }, - { - "name" : "minecraft:shears", - "id" : 421 - }, - { - "name" : "minecraft:sheep_spawn_egg", - "id" : 438 - }, - { - "name" : "minecraft:shield", - "id" : 355 - }, - { - "name" : "minecraft:shroomlight", - "id" : -230 - }, - { - "name" : "minecraft:shulker_box", - "id" : 218 - }, - { - "name" : "minecraft:shulker_shell", - "id" : 566 - }, - { - "name" : "minecraft:shulker_spawn_egg", - "id" : 469 - }, - { - "name" : "minecraft:silver_glazed_terracotta", - "id" : 228 - }, - { - "name" : "minecraft:silverfish_spawn_egg", - "id" : 443 - }, - { - "name" : "minecraft:skeleton_horse_spawn_egg", - "id" : 467 - }, - { - "name" : "minecraft:skeleton_spawn_egg", - "id" : 444 - }, - { - "name" : "minecraft:skull", - "id" : 516 - }, - { - "name" : "minecraft:skull_banner_pattern", - "id" : 583 - }, - { - "name" : "minecraft:slime", - "id" : 165 - }, - { - "name" : "minecraft:slime_ball", - "id" : 388 - }, - { - "name" : "minecraft:slime_spawn_egg", - "id" : 445 - }, - { - "name" : "minecraft:small_amethyst_bud", - "id" : -332 - }, - { - "name" : "minecraft:small_dripleaf_block", - "id" : -336 - }, - { - "name" : "minecraft:smithing_table", - "id" : -202 - }, - { - "name" : "minecraft:smoker", - "id" : -198 - }, - { - "name" : "minecraft:smooth_basalt", - "id" : -377 - }, - { - "name" : "minecraft:smooth_quartz_stairs", - "id" : -185 - }, - { - "name" : "minecraft:smooth_red_sandstone_stairs", - "id" : -176 - }, - { - "name" : "minecraft:smooth_sandstone_stairs", - "id" : -177 - }, - { - "name" : "minecraft:smooth_stone", - "id" : -183 - }, - { - "name" : "minecraft:snow", - "id" : 80 - }, - { - "name" : "minecraft:snow_layer", - "id" : 78 - }, - { - "name" : "minecraft:snowball", - "id" : 374 - }, - { - "name" : "minecraft:soul_campfire", - "id" : 621 - }, - { - "name" : "minecraft:soul_fire", - "id" : -237 - }, - { - "name" : "minecraft:soul_lantern", - "id" : -269 - }, - { - "name" : "minecraft:soul_sand", - "id" : 88 - }, - { - "name" : "minecraft:soul_soil", - "id" : -236 - }, - { - "name" : "minecraft:soul_torch", - "id" : -268 - }, - { - "name" : "minecraft:sparkler", - "id" : 599 - }, - { - "name" : "minecraft:spawn_egg", - "id" : 630 - }, - { - "name" : "minecraft:spider_eye", - "id" : 278 - }, - { - "name" : "minecraft:spider_spawn_egg", - "id" : 446 - }, - { - "name" : "minecraft:splash_potion", - "id" : 561 - }, - { - "name" : "minecraft:sponge", - "id" : 19 - }, - { - "name" : "minecraft:spore_blossom", - "id" : -321 - }, - { - "name" : "minecraft:spruce_boat", - "id" : 378 - }, - { - "name" : "minecraft:spruce_button", - "id" : -144 - }, - { - "name" : "minecraft:spruce_door", - "id" : 553 - }, - { - "name" : "minecraft:spruce_fence_gate", - "id" : 183 - }, - { - "name" : "minecraft:spruce_pressure_plate", - "id" : -154 - }, - { - "name" : "minecraft:spruce_sign", - "id" : 576 - }, - { - "name" : "minecraft:spruce_stairs", - "id" : 134 - }, - { - "name" : "minecraft:spruce_standing_sign", - "id" : -181 - }, - { - "name" : "minecraft:spruce_trapdoor", - "id" : -149 - }, - { - "name" : "minecraft:spruce_wall_sign", - "id" : -182 - }, - { - "name" : "minecraft:spyglass", - "id" : 625 - }, - { - "name" : "minecraft:squid_spawn_egg", - "id" : 450 - }, - { - "name" : "minecraft:stained_glass", - "id" : 241 - }, - { - "name" : "minecraft:stained_glass_pane", - "id" : 160 - }, - { - "name" : "minecraft:stained_hardened_clay", - "id" : 159 - }, - { - "name" : "minecraft:standing_banner", - "id" : 176 - }, - { - "name" : "minecraft:standing_sign", - "id" : 63 - }, - { - "name" : "minecraft:stick", - "id" : 320 - }, - { - "name" : "minecraft:sticky_piston", - "id" : 29 - }, - { - "name" : "minecraft:stickypistonarmcollision", - "id" : -217 - }, - { - "name" : "minecraft:stone", - "id" : 1 - }, - { - "name" : "minecraft:stone_axe", - "id" : 315 - }, - { - "name" : "minecraft:stone_brick_stairs", - "id" : 109 - }, - { - "name" : "minecraft:stone_button", - "id" : 77 - }, - { - "name" : "minecraft:stone_hoe", - "id" : 330 - }, - { - "name" : "minecraft:stone_pickaxe", - "id" : 314 - }, - { - "name" : "minecraft:stone_pressure_plate", - "id" : 70 - }, - { - "name" : "minecraft:stone_shovel", - "id" : 313 - }, - { - "name" : "minecraft:stone_stairs", - "id" : 67 - }, - { - "name" : "minecraft:stone_sword", - "id" : 312 - }, - { - "name" : "minecraft:stonebrick", - "id" : 98 - }, - { - "name" : "minecraft:stonecutter", - "id" : 245 - }, - { - "name" : "minecraft:stonecutter_block", - "id" : -197 - }, - { - "name" : "minecraft:stray_spawn_egg", - "id" : 462 - }, - { - "name" : "minecraft:strider_spawn_egg", - "id" : 495 - }, - { - "name" : "minecraft:string", - "id" : 326 - }, - { - "name" : "minecraft:stripped_acacia_log", - "id" : -8 - }, - { - "name" : "minecraft:stripped_birch_log", - "id" : -6 - }, - { - "name" : "minecraft:stripped_crimson_hyphae", - "id" : -300 - }, - { - "name" : "minecraft:stripped_crimson_stem", - "id" : -240 - }, - { - "name" : "minecraft:stripped_dark_oak_log", - "id" : -9 - }, - { - "name" : "minecraft:stripped_jungle_log", - "id" : -7 - }, - { - "name" : "minecraft:stripped_oak_log", - "id" : -10 - }, - { - "name" : "minecraft:stripped_spruce_log", - "id" : -5 - }, - { - "name" : "minecraft:stripped_warped_hyphae", - "id" : -301 - }, - { - "name" : "minecraft:stripped_warped_stem", - "id" : -241 - }, - { - "name" : "minecraft:structure_block", - "id" : 252 - }, - { - "name" : "minecraft:structure_void", - "id" : 217 - }, - { - "name" : "minecraft:sugar", - "id" : 416 - }, - { - "name" : "minecraft:sugar_cane", - "id" : 385 - }, - { - "name" : "minecraft:suspicious_stew", - "id" : 589 - }, - { - "name" : "minecraft:sweet_berries", - "id" : 287 - }, - { - "name" : "minecraft:sweet_berry_bush", - "id" : -207 - }, - { - "name" : "minecraft:tallgrass", - "id" : 31 - }, - { - "name" : "minecraft:target", - "id" : -239 - }, - { - "name" : "minecraft:tinted_glass", - "id" : -334 - }, - { - "name" : "minecraft:tnt", - "id" : 46 - }, - { - "name" : "minecraft:tnt_minecart", - "id" : 525 - }, - { - "name" : "minecraft:torch", - "id" : 50 - }, - { - "name" : "minecraft:totem_of_undying", - "id" : 568 - }, - { - "name" : "minecraft:trapdoor", - "id" : 96 - }, - { - "name" : "minecraft:trapped_chest", - "id" : 146 - }, - { - "name" : "minecraft:trident", - "id" : 546 - }, - { - "name" : "minecraft:tripwire", - "id" : 132 - }, - { - "name" : "minecraft:tripwire_hook", - "id" : 131 - }, - { - "name" : "minecraft:tropical_fish", - "id" : 266 - }, - { - "name" : "minecraft:tropical_fish_bucket", - "id" : 366 - }, - { - "name" : "minecraft:tropical_fish_spawn_egg", - "id" : 479 - }, - { - "name" : "minecraft:tuff", - "id" : -333 - }, - { - "name" : "minecraft:turtle_egg", - "id" : -159 - }, - { - "name" : "minecraft:turtle_helmet", - "id" : 573 - }, - { - "name" : "minecraft:turtle_spawn_egg", - "id" : 485 - }, - { - "name" : "minecraft:twisting_vines", - "id" : -287 - }, - { - "name" : "minecraft:underwater_torch", - "id" : 239 - }, - { - "name" : "minecraft:undyed_shulker_box", - "id" : 205 - }, - { - "name" : "minecraft:unknown", - "id" : -305 - }, - { - "name" : "minecraft:unlit_redstone_torch", - "id" : 75 - }, - { - "name" : "minecraft:unpowered_comparator", - "id" : 149 - }, - { - "name" : "minecraft:unpowered_repeater", - "id" : 93 - }, - { - "name" : "minecraft:vex_spawn_egg", - "id" : 476 - }, - { - "name" : "minecraft:villager_spawn_egg", - "id" : 449 - }, - { - "name" : "minecraft:vindicator_spawn_egg", - "id" : 474 - }, - { - "name" : "minecraft:vine", - "id" : 106 - }, - { - "name" : "minecraft:wall_banner", - "id" : 177 - }, - { - "name" : "minecraft:wall_sign", - "id" : 68 - }, - { - "name" : "minecraft:wandering_trader_spawn_egg", - "id" : 492 - }, - { - "name" : "minecraft:warped_button", - "id" : -261 - }, - { - "name" : "minecraft:warped_door", - "id" : 616 - }, - { - "name" : "minecraft:warped_double_slab", - "id" : -267 - }, - { - "name" : "minecraft:warped_fence", - "id" : -257 - }, - { - "name" : "minecraft:warped_fence_gate", - "id" : -259 - }, - { - "name" : "minecraft:warped_fungus", - "id" : -229 - }, - { - "name" : "minecraft:warped_fungus_on_a_stick", - "id" : 617 - }, - { - "name" : "minecraft:warped_hyphae", - "id" : -298 - }, - { - "name" : "minecraft:warped_nylium", - "id" : -233 - }, - { - "name" : "minecraft:warped_planks", - "id" : -243 - }, - { - "name" : "minecraft:warped_pressure_plate", - "id" : -263 - }, - { - "name" : "minecraft:warped_roots", - "id" : -224 - }, - { - "name" : "minecraft:warped_sign", - "id" : 614 - }, - { - "name" : "minecraft:warped_slab", - "id" : -265 - }, - { - "name" : "minecraft:warped_stairs", - "id" : -255 - }, - { - "name" : "minecraft:warped_standing_sign", - "id" : -251 - }, - { - "name" : "minecraft:warped_stem", - "id" : -226 - }, - { - "name" : "minecraft:warped_trapdoor", - "id" : -247 - }, - { - "name" : "minecraft:warped_wall_sign", - "id" : -253 - }, - { - "name" : "minecraft:warped_wart_block", - "id" : -227 - }, - { - "name" : "minecraft:water", - "id" : 9 - }, - { - "name" : "minecraft:water_bucket", - "id" : 362 - }, - { - "name" : "minecraft:waterlily", - "id" : 111 - }, - { - "name" : "minecraft:waxed_copper", - "id" : -344 - }, - { - "name" : "minecraft:waxed_cut_copper", - "id" : -351 - }, - { - "name" : "minecraft:waxed_cut_copper_slab", - "id" : -365 - }, - { - "name" : "minecraft:waxed_cut_copper_stairs", - "id" : -358 - }, - { - "name" : "minecraft:waxed_double_cut_copper_slab", - "id" : -372 - }, - { - "name" : "minecraft:waxed_exposed_copper", - "id" : -345 - }, - { - "name" : "minecraft:waxed_exposed_cut_copper", - "id" : -352 - }, - { - "name" : "minecraft:waxed_exposed_cut_copper_slab", - "id" : -366 - }, - { - "name" : "minecraft:waxed_exposed_cut_copper_stairs", - "id" : -359 - }, - { - "name" : "minecraft:waxed_exposed_double_cut_copper_slab", - "id" : -373 - }, - { - "name" : "minecraft:waxed_oxidized_copper", - "id" : -446 - }, - { - "name" : "minecraft:waxed_oxidized_cut_copper", - "id" : -447 - }, - { - "name" : "minecraft:waxed_oxidized_cut_copper_slab", - "id" : -449 - }, - { - "name" : "minecraft:waxed_oxidized_cut_copper_stairs", - "id" : -448 - }, - { - "name" : "minecraft:waxed_oxidized_double_cut_copper_slab", - "id" : -450 - }, - { - "name" : "minecraft:waxed_weathered_copper", - "id" : -346 - }, - { - "name" : "minecraft:waxed_weathered_cut_copper", - "id" : -353 - }, - { - "name" : "minecraft:waxed_weathered_cut_copper_slab", - "id" : -367 - }, - { - "name" : "minecraft:waxed_weathered_cut_copper_stairs", - "id" : -360 - }, - { - "name" : "minecraft:waxed_weathered_double_cut_copper_slab", - "id" : -374 - }, - { - "name" : "minecraft:weathered_copper", - "id" : -342 - }, - { - "name" : "minecraft:weathered_cut_copper", - "id" : -349 - }, - { - "name" : "minecraft:weathered_cut_copper_slab", - "id" : -363 - }, - { - "name" : "minecraft:weathered_cut_copper_stairs", - "id" : -356 - }, - { - "name" : "minecraft:weathered_double_cut_copper_slab", - "id" : -370 - }, - { - "name" : "minecraft:web", - "id" : 30 - }, - { - "name" : "minecraft:weeping_vines", - "id" : -231 - }, - { - "name" : "minecraft:wheat", - "id" : 334 - }, - { - "name" : "minecraft:wheat_seeds", - "id" : 291 - }, - { - "name" : "minecraft:white_candle", - "id" : -413 - }, - { - "name" : "minecraft:white_candle_cake", - "id" : -430 - }, - { - "name" : "minecraft:white_dye", - "id" : 410 - }, - { - "name" : "minecraft:white_glazed_terracotta", - "id" : 220 - }, - { - "name" : "minecraft:witch_spawn_egg", - "id" : 452 - }, - { - "name" : "minecraft:wither_rose", - "id" : -216 - }, - { - "name" : "minecraft:wither_skeleton_spawn_egg", - "id" : 464 - }, - { - "name" : "minecraft:wolf_spawn_egg", - "id" : 439 - }, - { - "name" : "minecraft:wood", - "id" : -212 - }, - { - "name" : "minecraft:wooden_axe", - "id" : 311 - }, - { - "name" : "minecraft:wooden_button", - "id" : 143 - }, - { - "name" : "minecraft:wooden_door", - "id" : 359 - }, - { - "name" : "minecraft:wooden_hoe", - "id" : 329 - }, - { - "name" : "minecraft:wooden_pickaxe", - "id" : 310 - }, - { - "name" : "minecraft:wooden_pressure_plate", - "id" : 72 - }, - { - "name" : "minecraft:wooden_shovel", - "id" : 309 - }, - { - "name" : "minecraft:wooden_slab", - "id" : 158 - }, - { - "name" : "minecraft:wooden_sword", - "id" : 308 - }, - { - "name" : "minecraft:wool", - "id" : 35 - }, - { - "name" : "minecraft:writable_book", - "id" : 510 - }, - { - "name" : "minecraft:written_book", - "id" : 511 - }, - { - "name" : "minecraft:yellow_candle", - "id" : -417 - }, - { - "name" : "minecraft:yellow_candle_cake", - "id" : -434 - }, - { - "name" : "minecraft:yellow_dye", - "id" : 406 - }, - { - "name" : "minecraft:yellow_flower", - "id" : 37 - }, - { - "name" : "minecraft:yellow_glazed_terracotta", - "id" : 224 - }, - { - "name" : "minecraft:zoglin_spawn_egg", - "id" : 498 - }, - { - "name" : "minecraft:zombie_horse_spawn_egg", - "id" : 468 - }, - { - "name" : "minecraft:zombie_pigman_spawn_egg", - "id" : 448 - }, - { - "name" : "minecraft:zombie_spawn_egg", - "id" : 447 - }, - { - "name" : "minecraft:zombie_villager_spawn_egg", - "id" : 477 - } -] \ No newline at end of file diff --git a/core/src/main/resources/bedrock/runtime_item_states.1_18_10.json b/core/src/main/resources/bedrock/runtime_item_states.1_18_10.json deleted file mode 100644 index 5bebcaf99..000000000 --- a/core/src/main/resources/bedrock/runtime_item_states.1_18_10.json +++ /dev/null @@ -1,4362 +0,0 @@ -[ - { - "name" : "minecraft:acacia_boat", - "id" : 379 - }, - { - "name" : "minecraft:acacia_button", - "id" : -140 - }, - { - "name" : "minecraft:acacia_door", - "id" : 556 - }, - { - "name" : "minecraft:acacia_fence_gate", - "id" : 187 - }, - { - "name" : "minecraft:acacia_pressure_plate", - "id" : -150 - }, - { - "name" : "minecraft:acacia_sign", - "id" : 579 - }, - { - "name" : "minecraft:acacia_stairs", - "id" : 163 - }, - { - "name" : "minecraft:acacia_standing_sign", - "id" : -190 - }, - { - "name" : "minecraft:acacia_trapdoor", - "id" : -145 - }, - { - "name" : "minecraft:acacia_wall_sign", - "id" : -191 - }, - { - "name" : "minecraft:activator_rail", - "id" : 126 - }, - { - "name" : "minecraft:agent_spawn_egg", - "id" : 487 - }, - { - "name" : "minecraft:air", - "id" : -158 - }, - { - "name" : "minecraft:allay_spawn_egg", - "id" : 631 - }, - { - "name" : "minecraft:allow", - "id" : 210 - }, - { - "name" : "minecraft:amethyst_block", - "id" : -327 - }, - { - "name" : "minecraft:amethyst_cluster", - "id" : -329 - }, - { - "name" : "minecraft:amethyst_shard", - "id" : 625 - }, - { - "name" : "minecraft:ancient_debris", - "id" : -271 - }, - { - "name" : "minecraft:andesite_stairs", - "id" : -171 - }, - { - "name" : "minecraft:anvil", - "id" : 145 - }, - { - "name" : "minecraft:apple", - "id" : 257 - }, - { - "name" : "minecraft:armor_stand", - "id" : 552 - }, - { - "name" : "minecraft:arrow", - "id" : 301 - }, - { - "name" : "minecraft:axolotl_bucket", - "id" : 369 - }, - { - "name" : "minecraft:axolotl_spawn_egg", - "id" : 500 - }, - { - "name" : "minecraft:azalea", - "id" : -337 - }, - { - "name" : "minecraft:azalea_leaves", - "id" : -324 - }, - { - "name" : "minecraft:azalea_leaves_flowered", - "id" : -325 - }, - { - "name" : "minecraft:baked_potato", - "id" : 281 - }, - { - "name" : "minecraft:balloon", - "id" : 598 - }, - { - "name" : "minecraft:bamboo", - "id" : -163 - }, - { - "name" : "minecraft:bamboo_sapling", - "id" : -164 - }, - { - "name" : "minecraft:banner", - "id" : 567 - }, - { - "name" : "minecraft:banner_pattern", - "id" : 635 - }, - { - "name" : "minecraft:barrel", - "id" : -203 - }, - { - "name" : "minecraft:barrier", - "id" : -161 - }, - { - "name" : "minecraft:basalt", - "id" : -234 - }, - { - "name" : "minecraft:bat_spawn_egg", - "id" : 453 - }, - { - "name" : "minecraft:beacon", - "id" : 138 - }, - { - "name" : "minecraft:bed", - "id" : 418 - }, - { - "name" : "minecraft:bedrock", - "id" : 7 - }, - { - "name" : "minecraft:bee_nest", - "id" : -218 - }, - { - "name" : "minecraft:bee_spawn_egg", - "id" : 494 - }, - { - "name" : "minecraft:beef", - "id" : 273 - }, - { - "name" : "minecraft:beehive", - "id" : -219 - }, - { - "name" : "minecraft:beetroot", - "id" : 285 - }, - { - "name" : "minecraft:beetroot_seeds", - "id" : 295 - }, - { - "name" : "minecraft:beetroot_soup", - "id" : 286 - }, - { - "name" : "minecraft:bell", - "id" : -206 - }, - { - "name" : "minecraft:big_dripleaf", - "id" : -323 - }, - { - "name" : "minecraft:birch_boat", - "id" : 376 - }, - { - "name" : "minecraft:birch_button", - "id" : -141 - }, - { - "name" : "minecraft:birch_door", - "id" : 554 - }, - { - "name" : "minecraft:birch_fence_gate", - "id" : 184 - }, - { - "name" : "minecraft:birch_pressure_plate", - "id" : -151 - }, - { - "name" : "minecraft:birch_sign", - "id" : 577 - }, - { - "name" : "minecraft:birch_stairs", - "id" : 135 - }, - { - "name" : "minecraft:birch_standing_sign", - "id" : -186 - }, - { - "name" : "minecraft:birch_trapdoor", - "id" : -146 - }, - { - "name" : "minecraft:birch_wall_sign", - "id" : -187 - }, - { - "name" : "minecraft:black_candle", - "id" : -428 - }, - { - "name" : "minecraft:black_candle_cake", - "id" : -445 - }, - { - "name" : "minecraft:black_dye", - "id" : 395 - }, - { - "name" : "minecraft:black_glazed_terracotta", - "id" : 235 - }, - { - "name" : "minecraft:blackstone", - "id" : -273 - }, - { - "name" : "minecraft:blackstone_double_slab", - "id" : -283 - }, - { - "name" : "minecraft:blackstone_slab", - "id" : -282 - }, - { - "name" : "minecraft:blackstone_stairs", - "id" : -276 - }, - { - "name" : "minecraft:blackstone_wall", - "id" : -277 - }, - { - "name" : "minecraft:blast_furnace", - "id" : -196 - }, - { - "name" : "minecraft:blaze_powder", - "id" : 429 - }, - { - "name" : "minecraft:blaze_rod", - "id" : 423 - }, - { - "name" : "minecraft:blaze_spawn_egg", - "id" : 456 - }, - { - "name" : "minecraft:bleach", - "id" : 596 - }, - { - "name" : "minecraft:blue_candle", - "id" : -424 - }, - { - "name" : "minecraft:blue_candle_cake", - "id" : -441 - }, - { - "name" : "minecraft:blue_dye", - "id" : 399 - }, - { - "name" : "minecraft:blue_glazed_terracotta", - "id" : 231 - }, - { - "name" : "minecraft:blue_ice", - "id" : -11 - }, - { - "name" : "minecraft:boat", - "id" : 633 - }, - { - "name" : "minecraft:bone", - "id" : 415 - }, - { - "name" : "minecraft:bone_block", - "id" : 216 - }, - { - "name" : "minecraft:bone_meal", - "id" : 411 - }, - { - "name" : "minecraft:book", - "id" : 387 - }, - { - "name" : "minecraft:bookshelf", - "id" : 47 - }, - { - "name" : "minecraft:border_block", - "id" : 212 - }, - { - "name" : "minecraft:bordure_indented_banner_pattern", - "id" : 586 - }, - { - "name" : "minecraft:bow", - "id" : 300 - }, - { - "name" : "minecraft:bowl", - "id" : 321 - }, - { - "name" : "minecraft:bread", - "id" : 261 - }, - { - "name" : "minecraft:brewing_stand", - "id" : 431 - }, - { - "name" : "minecraft:brewingstandblock", - "id" : 117 - }, - { - "name" : "minecraft:brick", - "id" : 383 - }, - { - "name" : "minecraft:brick_block", - "id" : 45 - }, - { - "name" : "minecraft:brick_stairs", - "id" : 108 - }, - { - "name" : "minecraft:brown_candle", - "id" : -425 - }, - { - "name" : "minecraft:brown_candle_cake", - "id" : -442 - }, - { - "name" : "minecraft:brown_dye", - "id" : 398 - }, - { - "name" : "minecraft:brown_glazed_terracotta", - "id" : 232 - }, - { - "name" : "minecraft:brown_mushroom", - "id" : 39 - }, - { - "name" : "minecraft:brown_mushroom_block", - "id" : 99 - }, - { - "name" : "minecraft:bubble_column", - "id" : -160 - }, - { - "name" : "minecraft:bucket", - "id" : 360 - }, - { - "name" : "minecraft:budding_amethyst", - "id" : -328 - }, - { - "name" : "minecraft:cactus", - "id" : 81 - }, - { - "name" : "minecraft:cake", - "id" : 417 - }, - { - "name" : "minecraft:calcite", - "id" : -326 - }, - { - "name" : "minecraft:camera", - "id" : 593 - }, - { - "name" : "minecraft:campfire", - "id" : 589 - }, - { - "name" : "minecraft:candle", - "id" : -412 - }, - { - "name" : "minecraft:candle_cake", - "id" : -429 - }, - { - "name" : "minecraft:carpet", - "id" : 171 - }, - { - "name" : "minecraft:carrot", - "id" : 279 - }, - { - "name" : "minecraft:carrot_on_a_stick", - "id" : 517 - }, - { - "name" : "minecraft:carrots", - "id" : 141 - }, - { - "name" : "minecraft:cartography_table", - "id" : -200 - }, - { - "name" : "minecraft:carved_pumpkin", - "id" : -155 - }, - { - "name" : "minecraft:cat_spawn_egg", - "id" : 488 - }, - { - "name" : "minecraft:cauldron", - "id" : 432 - }, - { - "name" : "minecraft:cave_spider_spawn_egg", - "id" : 457 - }, - { - "name" : "minecraft:cave_vines", - "id" : -322 - }, - { - "name" : "minecraft:cave_vines_body_with_berries", - "id" : -375 - }, - { - "name" : "minecraft:cave_vines_head_with_berries", - "id" : -376 - }, - { - "name" : "minecraft:chain", - "id" : 619 - }, - { - "name" : "minecraft:chain_command_block", - "id" : 189 - }, - { - "name" : "minecraft:chainmail_boots", - "id" : 342 - }, - { - "name" : "minecraft:chainmail_chestplate", - "id" : 340 - }, - { - "name" : "minecraft:chainmail_helmet", - "id" : 339 - }, - { - "name" : "minecraft:chainmail_leggings", - "id" : 341 - }, - { - "name" : "minecraft:charcoal", - "id" : 303 - }, - { - "name" : "minecraft:chemical_heat", - "id" : 192 - }, - { - "name" : "minecraft:chemistry_table", - "id" : 238 - }, - { - "name" : "minecraft:chest", - "id" : 54 - }, - { - "name" : "minecraft:chest_minecart", - "id" : 389 - }, - { - "name" : "minecraft:chicken", - "id" : 275 - }, - { - "name" : "minecraft:chicken_spawn_egg", - "id" : 435 - }, - { - "name" : "minecraft:chiseled_deepslate", - "id" : -395 - }, - { - "name" : "minecraft:chiseled_nether_bricks", - "id" : -302 - }, - { - "name" : "minecraft:chiseled_polished_blackstone", - "id" : -279 - }, - { - "name" : "minecraft:chorus_flower", - "id" : 200 - }, - { - "name" : "minecraft:chorus_fruit", - "id" : 558 - }, - { - "name" : "minecraft:chorus_plant", - "id" : 240 - }, - { - "name" : "minecraft:clay", - "id" : 82 - }, - { - "name" : "minecraft:clay_ball", - "id" : 384 - }, - { - "name" : "minecraft:client_request_placeholder_block", - "id" : -465 - }, - { - "name" : "minecraft:clock", - "id" : 393 - }, - { - "name" : "minecraft:coal", - "id" : 302 - }, - { - "name" : "minecraft:coal_block", - "id" : 173 - }, - { - "name" : "minecraft:coal_ore", - "id" : 16 - }, - { - "name" : "minecraft:cobbled_deepslate", - "id" : -379 - }, - { - "name" : "minecraft:cobbled_deepslate_double_slab", - "id" : -396 - }, - { - "name" : "minecraft:cobbled_deepslate_slab", - "id" : -380 - }, - { - "name" : "minecraft:cobbled_deepslate_stairs", - "id" : -381 - }, - { - "name" : "minecraft:cobbled_deepslate_wall", - "id" : -382 - }, - { - "name" : "minecraft:cobblestone", - "id" : 4 - }, - { - "name" : "minecraft:cobblestone_wall", - "id" : 139 - }, - { - "name" : "minecraft:cocoa", - "id" : 127 - }, - { - "name" : "minecraft:cocoa_beans", - "id" : 412 - }, - { - "name" : "minecraft:cod", - "id" : 264 - }, - { - "name" : "minecraft:cod_bucket", - "id" : 364 - }, - { - "name" : "minecraft:cod_spawn_egg", - "id" : 480 - }, - { - "name" : "minecraft:colored_torch_bp", - "id" : 204 - }, - { - "name" : "minecraft:colored_torch_rg", - "id" : 202 - }, - { - "name" : "minecraft:command_block", - "id" : 137 - }, - { - "name" : "minecraft:command_block_minecart", - "id" : 563 - }, - { - "name" : "minecraft:comparator", - "id" : 522 - }, - { - "name" : "minecraft:compass", - "id" : 391 - }, - { - "name" : "minecraft:composter", - "id" : -213 - }, - { - "name" : "minecraft:compound", - "id" : 594 - }, - { - "name" : "minecraft:concrete", - "id" : 236 - }, - { - "name" : "minecraft:concrete_powder", - "id" : 237 - }, - { - "name" : "minecraft:conduit", - "id" : -157 - }, - { - "name" : "minecraft:cooked_beef", - "id" : 274 - }, - { - "name" : "minecraft:cooked_chicken", - "id" : 276 - }, - { - "name" : "minecraft:cooked_cod", - "id" : 268 - }, - { - "name" : "minecraft:cooked_mutton", - "id" : 551 - }, - { - "name" : "minecraft:cooked_porkchop", - "id" : 263 - }, - { - "name" : "minecraft:cooked_rabbit", - "id" : 289 - }, - { - "name" : "minecraft:cooked_salmon", - "id" : 269 - }, - { - "name" : "minecraft:cookie", - "id" : 271 - }, - { - "name" : "minecraft:copper_block", - "id" : -340 - }, - { - "name" : "minecraft:copper_ingot", - "id" : 504 - }, - { - "name" : "minecraft:copper_ore", - "id" : -311 - }, - { - "name" : "minecraft:coral", - "id" : -131 - }, - { - "name" : "minecraft:coral_block", - "id" : -132 - }, - { - "name" : "minecraft:coral_fan", - "id" : -133 - }, - { - "name" : "minecraft:coral_fan_dead", - "id" : -134 - }, - { - "name" : "minecraft:coral_fan_hang", - "id" : -135 - }, - { - "name" : "minecraft:coral_fan_hang2", - "id" : -136 - }, - { - "name" : "minecraft:coral_fan_hang3", - "id" : -137 - }, - { - "name" : "minecraft:cow_spawn_egg", - "id" : 436 - }, - { - "name" : "minecraft:cracked_deepslate_bricks", - "id" : -410 - }, - { - "name" : "minecraft:cracked_deepslate_tiles", - "id" : -409 - }, - { - "name" : "minecraft:cracked_nether_bricks", - "id" : -303 - }, - { - "name" : "minecraft:cracked_polished_blackstone_bricks", - "id" : -280 - }, - { - "name" : "minecraft:crafting_table", - "id" : 58 - }, - { - "name" : "minecraft:creeper_banner_pattern", - "id" : 582 - }, - { - "name" : "minecraft:creeper_spawn_egg", - "id" : 441 - }, - { - "name" : "minecraft:crimson_button", - "id" : -260 - }, - { - "name" : "minecraft:crimson_door", - "id" : 616 - }, - { - "name" : "minecraft:crimson_double_slab", - "id" : -266 - }, - { - "name" : "minecraft:crimson_fence", - "id" : -256 - }, - { - "name" : "minecraft:crimson_fence_gate", - "id" : -258 - }, - { - "name" : "minecraft:crimson_fungus", - "id" : -228 - }, - { - "name" : "minecraft:crimson_hyphae", - "id" : -299 - }, - { - "name" : "minecraft:crimson_nylium", - "id" : -232 - }, - { - "name" : "minecraft:crimson_planks", - "id" : -242 - }, - { - "name" : "minecraft:crimson_pressure_plate", - "id" : -262 - }, - { - "name" : "minecraft:crimson_roots", - "id" : -223 - }, - { - "name" : "minecraft:crimson_sign", - "id" : 614 - }, - { - "name" : "minecraft:crimson_slab", - "id" : -264 - }, - { - "name" : "minecraft:crimson_stairs", - "id" : -254 - }, - { - "name" : "minecraft:crimson_standing_sign", - "id" : -250 - }, - { - "name" : "minecraft:crimson_stem", - "id" : -225 - }, - { - "name" : "minecraft:crimson_trapdoor", - "id" : -246 - }, - { - "name" : "minecraft:crimson_wall_sign", - "id" : -252 - }, - { - "name" : "minecraft:crossbow", - "id" : 575 - }, - { - "name" : "minecraft:crying_obsidian", - "id" : -289 - }, - { - "name" : "minecraft:cut_copper", - "id" : -347 - }, - { - "name" : "minecraft:cut_copper_slab", - "id" : -361 - }, - { - "name" : "minecraft:cut_copper_stairs", - "id" : -354 - }, - { - "name" : "minecraft:cyan_candle", - "id" : -422 - }, - { - "name" : "minecraft:cyan_candle_cake", - "id" : -439 - }, - { - "name" : "minecraft:cyan_dye", - "id" : 401 - }, - { - "name" : "minecraft:cyan_glazed_terracotta", - "id" : 229 - }, - { - "name" : "minecraft:dark_oak_boat", - "id" : 380 - }, - { - "name" : "minecraft:dark_oak_button", - "id" : -142 - }, - { - "name" : "minecraft:dark_oak_door", - "id" : 557 - }, - { - "name" : "minecraft:dark_oak_fence_gate", - "id" : 186 - }, - { - "name" : "minecraft:dark_oak_pressure_plate", - "id" : -152 - }, - { - "name" : "minecraft:dark_oak_sign", - "id" : 580 - }, - { - "name" : "minecraft:dark_oak_stairs", - "id" : 164 - }, - { - "name" : "minecraft:dark_oak_trapdoor", - "id" : -147 - }, - { - "name" : "minecraft:dark_prismarine_stairs", - "id" : -3 - }, - { - "name" : "minecraft:darkoak_standing_sign", - "id" : -192 - }, - { - "name" : "minecraft:darkoak_wall_sign", - "id" : -193 - }, - { - "name" : "minecraft:daylight_detector", - "id" : 151 - }, - { - "name" : "minecraft:daylight_detector_inverted", - "id" : 178 - }, - { - "name" : "minecraft:deadbush", - "id" : 32 - }, - { - "name" : "minecraft:deepslate", - "id" : -378 - }, - { - "name" : "minecraft:deepslate_brick_double_slab", - "id" : -399 - }, - { - "name" : "minecraft:deepslate_brick_slab", - "id" : -392 - }, - { - "name" : "minecraft:deepslate_brick_stairs", - "id" : -393 - }, - { - "name" : "minecraft:deepslate_brick_wall", - "id" : -394 - }, - { - "name" : "minecraft:deepslate_bricks", - "id" : -391 - }, - { - "name" : "minecraft:deepslate_coal_ore", - "id" : -406 - }, - { - "name" : "minecraft:deepslate_copper_ore", - "id" : -408 - }, - { - "name" : "minecraft:deepslate_diamond_ore", - "id" : -405 - }, - { - "name" : "minecraft:deepslate_emerald_ore", - "id" : -407 - }, - { - "name" : "minecraft:deepslate_gold_ore", - "id" : -402 - }, - { - "name" : "minecraft:deepslate_iron_ore", - "id" : -401 - }, - { - "name" : "minecraft:deepslate_lapis_ore", - "id" : -400 - }, - { - "name" : "minecraft:deepslate_redstone_ore", - "id" : -403 - }, - { - "name" : "minecraft:deepslate_tile_double_slab", - "id" : -398 - }, - { - "name" : "minecraft:deepslate_tile_slab", - "id" : -388 - }, - { - "name" : "minecraft:deepslate_tile_stairs", - "id" : -389 - }, - { - "name" : "minecraft:deepslate_tile_wall", - "id" : -390 - }, - { - "name" : "minecraft:deepslate_tiles", - "id" : -387 - }, - { - "name" : "minecraft:deny", - "id" : 211 - }, - { - "name" : "minecraft:detector_rail", - "id" : 28 - }, - { - "name" : "minecraft:diamond", - "id" : 304 - }, - { - "name" : "minecraft:diamond_axe", - "id" : 319 - }, - { - "name" : "minecraft:diamond_block", - "id" : 57 - }, - { - "name" : "minecraft:diamond_boots", - "id" : 350 - }, - { - "name" : "minecraft:diamond_chestplate", - "id" : 348 - }, - { - "name" : "minecraft:diamond_helmet", - "id" : 347 - }, - { - "name" : "minecraft:diamond_hoe", - "id" : 332 - }, - { - "name" : "minecraft:diamond_horse_armor", - "id" : 533 - }, - { - "name" : "minecraft:diamond_leggings", - "id" : 349 - }, - { - "name" : "minecraft:diamond_ore", - "id" : 56 - }, - { - "name" : "minecraft:diamond_pickaxe", - "id" : 318 - }, - { - "name" : "minecraft:diamond_shovel", - "id" : 317 - }, - { - "name" : "minecraft:diamond_sword", - "id" : 316 - }, - { - "name" : "minecraft:diorite_stairs", - "id" : -170 - }, - { - "name" : "minecraft:dirt", - "id" : 3 - }, - { - "name" : "minecraft:dirt_with_roots", - "id" : -318 - }, - { - "name" : "minecraft:dispenser", - "id" : 23 - }, - { - "name" : "minecraft:dolphin_spawn_egg", - "id" : 484 - }, - { - "name" : "minecraft:donkey_spawn_egg", - "id" : 465 - }, - { - "name" : "minecraft:double_cut_copper_slab", - "id" : -368 - }, - { - "name" : "minecraft:double_plant", - "id" : 175 - }, - { - "name" : "minecraft:double_stone_slab", - "id" : 44 - }, - { - "name" : "minecraft:double_stone_slab2", - "id" : 182 - }, - { - "name" : "minecraft:double_stone_slab3", - "id" : -162 - }, - { - "name" : "minecraft:double_stone_slab4", - "id" : -166 - }, - { - "name" : "minecraft:double_wooden_slab", - "id" : 157 - }, - { - "name" : "minecraft:dragon_breath", - "id" : 560 - }, - { - "name" : "minecraft:dragon_egg", - "id" : 122 - }, - { - "name" : "minecraft:dried_kelp", - "id" : 270 - }, - { - "name" : "minecraft:dried_kelp_block", - "id" : -139 - }, - { - "name" : "minecraft:dripstone_block", - "id" : -317 - }, - { - "name" : "minecraft:dropper", - "id" : 125 - }, - { - "name" : "minecraft:drowned_spawn_egg", - "id" : 483 - }, - { - "name" : "minecraft:dye", - "id" : 634 - }, - { - "name" : "minecraft:egg", - "id" : 390 - }, - { - "name" : "minecraft:elder_guardian_spawn_egg", - "id" : 471 - }, - { - "name" : "minecraft:element_0", - "id" : 36 - }, - { - "name" : "minecraft:element_1", - "id" : -12 - }, - { - "name" : "minecraft:element_10", - "id" : -21 - }, - { - "name" : "minecraft:element_100", - "id" : -111 - }, - { - "name" : "minecraft:element_101", - "id" : -112 - }, - { - "name" : "minecraft:element_102", - "id" : -113 - }, - { - "name" : "minecraft:element_103", - "id" : -114 - }, - { - "name" : "minecraft:element_104", - "id" : -115 - }, - { - "name" : "minecraft:element_105", - "id" : -116 - }, - { - "name" : "minecraft:element_106", - "id" : -117 - }, - { - "name" : "minecraft:element_107", - "id" : -118 - }, - { - "name" : "minecraft:element_108", - "id" : -119 - }, - { - "name" : "minecraft:element_109", - "id" : -120 - }, - { - "name" : "minecraft:element_11", - "id" : -22 - }, - { - "name" : "minecraft:element_110", - "id" : -121 - }, - { - "name" : "minecraft:element_111", - "id" : -122 - }, - { - "name" : "minecraft:element_112", - "id" : -123 - }, - { - "name" : "minecraft:element_113", - "id" : -124 - }, - { - "name" : "minecraft:element_114", - "id" : -125 - }, - { - "name" : "minecraft:element_115", - "id" : -126 - }, - { - "name" : "minecraft:element_116", - "id" : -127 - }, - { - "name" : "minecraft:element_117", - "id" : -128 - }, - { - "name" : "minecraft:element_118", - "id" : -129 - }, - { - "name" : "minecraft:element_12", - "id" : -23 - }, - { - "name" : "minecraft:element_13", - "id" : -24 - }, - { - "name" : "minecraft:element_14", - "id" : -25 - }, - { - "name" : "minecraft:element_15", - "id" : -26 - }, - { - "name" : "minecraft:element_16", - "id" : -27 - }, - { - "name" : "minecraft:element_17", - "id" : -28 - }, - { - "name" : "minecraft:element_18", - "id" : -29 - }, - { - "name" : "minecraft:element_19", - "id" : -30 - }, - { - "name" : "minecraft:element_2", - "id" : -13 - }, - { - "name" : "minecraft:element_20", - "id" : -31 - }, - { - "name" : "minecraft:element_21", - "id" : -32 - }, - { - "name" : "minecraft:element_22", - "id" : -33 - }, - { - "name" : "minecraft:element_23", - "id" : -34 - }, - { - "name" : "minecraft:element_24", - "id" : -35 - }, - { - "name" : "minecraft:element_25", - "id" : -36 - }, - { - "name" : "minecraft:element_26", - "id" : -37 - }, - { - "name" : "minecraft:element_27", - "id" : -38 - }, - { - "name" : "minecraft:element_28", - "id" : -39 - }, - { - "name" : "minecraft:element_29", - "id" : -40 - }, - { - "name" : "minecraft:element_3", - "id" : -14 - }, - { - "name" : "minecraft:element_30", - "id" : -41 - }, - { - "name" : "minecraft:element_31", - "id" : -42 - }, - { - "name" : "minecraft:element_32", - "id" : -43 - }, - { - "name" : "minecraft:element_33", - "id" : -44 - }, - { - "name" : "minecraft:element_34", - "id" : -45 - }, - { - "name" : "minecraft:element_35", - "id" : -46 - }, - { - "name" : "minecraft:element_36", - "id" : -47 - }, - { - "name" : "minecraft:element_37", - "id" : -48 - }, - { - "name" : "minecraft:element_38", - "id" : -49 - }, - { - "name" : "minecraft:element_39", - "id" : -50 - }, - { - "name" : "minecraft:element_4", - "id" : -15 - }, - { - "name" : "minecraft:element_40", - "id" : -51 - }, - { - "name" : "minecraft:element_41", - "id" : -52 - }, - { - "name" : "minecraft:element_42", - "id" : -53 - }, - { - "name" : "minecraft:element_43", - "id" : -54 - }, - { - "name" : "minecraft:element_44", - "id" : -55 - }, - { - "name" : "minecraft:element_45", - "id" : -56 - }, - { - "name" : "minecraft:element_46", - "id" : -57 - }, - { - "name" : "minecraft:element_47", - "id" : -58 - }, - { - "name" : "minecraft:element_48", - "id" : -59 - }, - { - "name" : "minecraft:element_49", - "id" : -60 - }, - { - "name" : "minecraft:element_5", - "id" : -16 - }, - { - "name" : "minecraft:element_50", - "id" : -61 - }, - { - "name" : "minecraft:element_51", - "id" : -62 - }, - { - "name" : "minecraft:element_52", - "id" : -63 - }, - { - "name" : "minecraft:element_53", - "id" : -64 - }, - { - "name" : "minecraft:element_54", - "id" : -65 - }, - { - "name" : "minecraft:element_55", - "id" : -66 - }, - { - "name" : "minecraft:element_56", - "id" : -67 - }, - { - "name" : "minecraft:element_57", - "id" : -68 - }, - { - "name" : "minecraft:element_58", - "id" : -69 - }, - { - "name" : "minecraft:element_59", - "id" : -70 - }, - { - "name" : "minecraft:element_6", - "id" : -17 - }, - { - "name" : "minecraft:element_60", - "id" : -71 - }, - { - "name" : "minecraft:element_61", - "id" : -72 - }, - { - "name" : "minecraft:element_62", - "id" : -73 - }, - { - "name" : "minecraft:element_63", - "id" : -74 - }, - { - "name" : "minecraft:element_64", - "id" : -75 - }, - { - "name" : "minecraft:element_65", - "id" : -76 - }, - { - "name" : "minecraft:element_66", - "id" : -77 - }, - { - "name" : "minecraft:element_67", - "id" : -78 - }, - { - "name" : "minecraft:element_68", - "id" : -79 - }, - { - "name" : "minecraft:element_69", - "id" : -80 - }, - { - "name" : "minecraft:element_7", - "id" : -18 - }, - { - "name" : "minecraft:element_70", - "id" : -81 - }, - { - "name" : "minecraft:element_71", - "id" : -82 - }, - { - "name" : "minecraft:element_72", - "id" : -83 - }, - { - "name" : "minecraft:element_73", - "id" : -84 - }, - { - "name" : "minecraft:element_74", - "id" : -85 - }, - { - "name" : "minecraft:element_75", - "id" : -86 - }, - { - "name" : "minecraft:element_76", - "id" : -87 - }, - { - "name" : "minecraft:element_77", - "id" : -88 - }, - { - "name" : "minecraft:element_78", - "id" : -89 - }, - { - "name" : "minecraft:element_79", - "id" : -90 - }, - { - "name" : "minecraft:element_8", - "id" : -19 - }, - { - "name" : "minecraft:element_80", - "id" : -91 - }, - { - "name" : "minecraft:element_81", - "id" : -92 - }, - { - "name" : "minecraft:element_82", - "id" : -93 - }, - { - "name" : "minecraft:element_83", - "id" : -94 - }, - { - "name" : "minecraft:element_84", - "id" : -95 - }, - { - "name" : "minecraft:element_85", - "id" : -96 - }, - { - "name" : "minecraft:element_86", - "id" : -97 - }, - { - "name" : "minecraft:element_87", - "id" : -98 - }, - { - "name" : "minecraft:element_88", - "id" : -99 - }, - { - "name" : "minecraft:element_89", - "id" : -100 - }, - { - "name" : "minecraft:element_9", - "id" : -20 - }, - { - "name" : "minecraft:element_90", - "id" : -101 - }, - { - "name" : "minecraft:element_91", - "id" : -102 - }, - { - "name" : "minecraft:element_92", - "id" : -103 - }, - { - "name" : "minecraft:element_93", - "id" : -104 - }, - { - "name" : "minecraft:element_94", - "id" : -105 - }, - { - "name" : "minecraft:element_95", - "id" : -106 - }, - { - "name" : "minecraft:element_96", - "id" : -107 - }, - { - "name" : "minecraft:element_97", - "id" : -108 - }, - { - "name" : "minecraft:element_98", - "id" : -109 - }, - { - "name" : "minecraft:element_99", - "id" : -110 - }, - { - "name" : "minecraft:elytra", - "id" : 564 - }, - { - "name" : "minecraft:emerald", - "id" : 512 - }, - { - "name" : "minecraft:emerald_block", - "id" : 133 - }, - { - "name" : "minecraft:emerald_ore", - "id" : 129 - }, - { - "name" : "minecraft:empty_map", - "id" : 515 - }, - { - "name" : "minecraft:enchanted_book", - "id" : 521 - }, - { - "name" : "minecraft:enchanted_golden_apple", - "id" : 259 - }, - { - "name" : "minecraft:enchanting_table", - "id" : 116 - }, - { - "name" : "minecraft:end_brick_stairs", - "id" : -178 - }, - { - "name" : "minecraft:end_bricks", - "id" : 206 - }, - { - "name" : "minecraft:end_crystal", - "id" : 637 - }, - { - "name" : "minecraft:end_gateway", - "id" : 209 - }, - { - "name" : "minecraft:end_portal", - "id" : 119 - }, - { - "name" : "minecraft:end_portal_frame", - "id" : 120 - }, - { - "name" : "minecraft:end_rod", - "id" : 208 - }, - { - "name" : "minecraft:end_stone", - "id" : 121 - }, - { - "name" : "minecraft:ender_chest", - "id" : 130 - }, - { - "name" : "minecraft:ender_eye", - "id" : 433 - }, - { - "name" : "minecraft:ender_pearl", - "id" : 422 - }, - { - "name" : "minecraft:enderman_spawn_egg", - "id" : 442 - }, - { - "name" : "minecraft:endermite_spawn_egg", - "id" : 460 - }, - { - "name" : "minecraft:evoker_spawn_egg", - "id" : 475 - }, - { - "name" : "minecraft:experience_bottle", - "id" : 508 - }, - { - "name" : "minecraft:exposed_copper", - "id" : -341 - }, - { - "name" : "minecraft:exposed_cut_copper", - "id" : -348 - }, - { - "name" : "minecraft:exposed_cut_copper_slab", - "id" : -362 - }, - { - "name" : "minecraft:exposed_cut_copper_stairs", - "id" : -355 - }, - { - "name" : "minecraft:exposed_double_cut_copper_slab", - "id" : -369 - }, - { - "name" : "minecraft:farmland", - "id" : 60 - }, - { - "name" : "minecraft:feather", - "id" : 327 - }, - { - "name" : "minecraft:fence", - "id" : 85 - }, - { - "name" : "minecraft:fence_gate", - "id" : 107 - }, - { - "name" : "minecraft:fermented_spider_eye", - "id" : 428 - }, - { - "name" : "minecraft:field_masoned_banner_pattern", - "id" : 585 - }, - { - "name" : "minecraft:filled_map", - "id" : 420 - }, - { - "name" : "minecraft:fire", - "id" : 51 - }, - { - "name" : "minecraft:fire_charge", - "id" : 509 - }, - { - "name" : "minecraft:firefly_spawn_egg", - "id" : 632 - }, - { - "name" : "minecraft:firework_rocket", - "id" : 519 - }, - { - "name" : "minecraft:firework_star", - "id" : 520 - }, - { - "name" : "minecraft:fishing_rod", - "id" : 392 - }, - { - "name" : "minecraft:fletching_table", - "id" : -201 - }, - { - "name" : "minecraft:flint", - "id" : 356 - }, - { - "name" : "minecraft:flint_and_steel", - "id" : 299 - }, - { - "name" : "minecraft:flower_banner_pattern", - "id" : 581 - }, - { - "name" : "minecraft:flower_pot", - "id" : 514 - }, - { - "name" : "minecraft:flowering_azalea", - "id" : -338 - }, - { - "name" : "minecraft:flowing_lava", - "id" : 10 - }, - { - "name" : "minecraft:flowing_water", - "id" : 8 - }, - { - "name" : "minecraft:fox_spawn_egg", - "id" : 490 - }, - { - "name" : "minecraft:frame", - "id" : 513 - }, - { - "name" : "minecraft:frog_egg", - "id" : -468 - }, - { - "name" : "minecraft:frog_spawn_egg", - "id" : 628 - }, - { - "name" : "minecraft:frosted_ice", - "id" : 207 - }, - { - "name" : "minecraft:furnace", - "id" : 61 - }, - { - "name" : "minecraft:ghast_spawn_egg", - "id" : 454 - }, - { - "name" : "minecraft:ghast_tear", - "id" : 424 - }, - { - "name" : "minecraft:gilded_blackstone", - "id" : -281 - }, - { - "name" : "minecraft:glass", - "id" : 20 - }, - { - "name" : "minecraft:glass_bottle", - "id" : 427 - }, - { - "name" : "minecraft:glass_pane", - "id" : 102 - }, - { - "name" : "minecraft:glistering_melon_slice", - "id" : 434 - }, - { - "name" : "minecraft:globe_banner_pattern", - "id" : 588 - }, - { - "name" : "minecraft:glow_berries", - "id" : 638 - }, - { - "name" : "minecraft:glow_frame", - "id" : 623 - }, - { - "name" : "minecraft:glow_ink_sac", - "id" : 503 - }, - { - "name" : "minecraft:glow_lichen", - "id" : -411 - }, - { - "name" : "minecraft:glow_squid_spawn_egg", - "id" : 502 - }, - { - "name" : "minecraft:glow_stick", - "id" : 601 - }, - { - "name" : "minecraft:glowingobsidian", - "id" : 246 - }, - { - "name" : "minecraft:glowstone", - "id" : 89 - }, - { - "name" : "minecraft:glowstone_dust", - "id" : 394 - }, - { - "name" : "minecraft:goat_horn", - "id" : 624 - }, - { - "name" : "minecraft:goat_spawn_egg", - "id" : 501 - }, - { - "name" : "minecraft:gold_block", - "id" : 41 - }, - { - "name" : "minecraft:gold_ingot", - "id" : 306 - }, - { - "name" : "minecraft:gold_nugget", - "id" : 425 - }, - { - "name" : "minecraft:gold_ore", - "id" : 14 - }, - { - "name" : "minecraft:golden_apple", - "id" : 258 - }, - { - "name" : "minecraft:golden_axe", - "id" : 325 - }, - { - "name" : "minecraft:golden_boots", - "id" : 354 - }, - { - "name" : "minecraft:golden_carrot", - "id" : 283 - }, - { - "name" : "minecraft:golden_chestplate", - "id" : 352 - }, - { - "name" : "minecraft:golden_helmet", - "id" : 351 - }, - { - "name" : "minecraft:golden_hoe", - "id" : 333 - }, - { - "name" : "minecraft:golden_horse_armor", - "id" : 532 - }, - { - "name" : "minecraft:golden_leggings", - "id" : 353 - }, - { - "name" : "minecraft:golden_pickaxe", - "id" : 324 - }, - { - "name" : "minecraft:golden_rail", - "id" : 27 - }, - { - "name" : "minecraft:golden_shovel", - "id" : 323 - }, - { - "name" : "minecraft:golden_sword", - "id" : 322 - }, - { - "name" : "minecraft:granite_stairs", - "id" : -169 - }, - { - "name" : "minecraft:grass", - "id" : 2 - }, - { - "name" : "minecraft:grass_path", - "id" : 198 - }, - { - "name" : "minecraft:gravel", - "id" : 13 - }, - { - "name" : "minecraft:gray_candle", - "id" : -420 - }, - { - "name" : "minecraft:gray_candle_cake", - "id" : -437 - }, - { - "name" : "minecraft:gray_dye", - "id" : 403 - }, - { - "name" : "minecraft:gray_glazed_terracotta", - "id" : 227 - }, - { - "name" : "minecraft:green_candle", - "id" : -426 - }, - { - "name" : "minecraft:green_candle_cake", - "id" : -443 - }, - { - "name" : "minecraft:green_dye", - "id" : 397 - }, - { - "name" : "minecraft:green_glazed_terracotta", - "id" : 233 - }, - { - "name" : "minecraft:grindstone", - "id" : -195 - }, - { - "name" : "minecraft:guardian_spawn_egg", - "id" : 461 - }, - { - "name" : "minecraft:gunpowder", - "id" : 328 - }, - { - "name" : "minecraft:hanging_roots", - "id" : -319 - }, - { - "name" : "minecraft:hard_glass", - "id" : 253 - }, - { - "name" : "minecraft:hard_glass_pane", - "id" : 190 - }, - { - "name" : "minecraft:hard_stained_glass", - "id" : 254 - }, - { - "name" : "minecraft:hard_stained_glass_pane", - "id" : 191 - }, - { - "name" : "minecraft:hardened_clay", - "id" : 172 - }, - { - "name" : "minecraft:hay_block", - "id" : 170 - }, - { - "name" : "minecraft:heart_of_the_sea", - "id" : 571 - }, - { - "name" : "minecraft:heavy_weighted_pressure_plate", - "id" : 148 - }, - { - "name" : "minecraft:hoglin_spawn_egg", - "id" : 496 - }, - { - "name" : "minecraft:honey_block", - "id" : -220 - }, - { - "name" : "minecraft:honey_bottle", - "id" : 592 - }, - { - "name" : "minecraft:honeycomb", - "id" : 591 - }, - { - "name" : "minecraft:honeycomb_block", - "id" : -221 - }, - { - "name" : "minecraft:hopper", - "id" : 527 - }, - { - "name" : "minecraft:hopper_minecart", - "id" : 526 - }, - { - "name" : "minecraft:horse_spawn_egg", - "id" : 458 - }, - { - "name" : "minecraft:husk_spawn_egg", - "id" : 463 - }, - { - "name" : "minecraft:ice", - "id" : 79 - }, - { - "name" : "minecraft:ice_bomb", - "id" : 595 - }, - { - "name" : "minecraft:infested_deepslate", - "id" : -454 - }, - { - "name" : "minecraft:info_update", - "id" : 248 - }, - { - "name" : "minecraft:info_update2", - "id" : 249 - }, - { - "name" : "minecraft:ink_sac", - "id" : 413 - }, - { - "name" : "minecraft:invisiblebedrock", - "id" : 95 - }, - { - "name" : "minecraft:iron_axe", - "id" : 298 - }, - { - "name" : "minecraft:iron_bars", - "id" : 101 - }, - { - "name" : "minecraft:iron_block", - "id" : 42 - }, - { - "name" : "minecraft:iron_boots", - "id" : 346 - }, - { - "name" : "minecraft:iron_chestplate", - "id" : 344 - }, - { - "name" : "minecraft:iron_door", - "id" : 372 - }, - { - "name" : "minecraft:iron_helmet", - "id" : 343 - }, - { - "name" : "minecraft:iron_hoe", - "id" : 331 - }, - { - "name" : "minecraft:iron_horse_armor", - "id" : 531 - }, - { - "name" : "minecraft:iron_ingot", - "id" : 305 - }, - { - "name" : "minecraft:iron_leggings", - "id" : 345 - }, - { - "name" : "minecraft:iron_nugget", - "id" : 569 - }, - { - "name" : "minecraft:iron_ore", - "id" : 15 - }, - { - "name" : "minecraft:iron_pickaxe", - "id" : 297 - }, - { - "name" : "minecraft:iron_shovel", - "id" : 296 - }, - { - "name" : "minecraft:iron_sword", - "id" : 307 - }, - { - "name" : "minecraft:iron_trapdoor", - "id" : 167 - }, - { - "name" : "minecraft:item.acacia_door", - "id" : 196 - }, - { - "name" : "minecraft:item.bed", - "id" : 26 - }, - { - "name" : "minecraft:item.beetroot", - "id" : 244 - }, - { - "name" : "minecraft:item.birch_door", - "id" : 194 - }, - { - "name" : "minecraft:item.cake", - "id" : 92 - }, - { - "name" : "minecraft:item.camera", - "id" : 242 - }, - { - "name" : "minecraft:item.campfire", - "id" : -209 - }, - { - "name" : "minecraft:item.cauldron", - "id" : 118 - }, - { - "name" : "minecraft:item.chain", - "id" : -286 - }, - { - "name" : "minecraft:item.crimson_door", - "id" : -244 - }, - { - "name" : "minecraft:item.dark_oak_door", - "id" : 197 - }, - { - "name" : "minecraft:item.flower_pot", - "id" : 140 - }, - { - "name" : "minecraft:item.frame", - "id" : 199 - }, - { - "name" : "minecraft:item.glow_frame", - "id" : -339 - }, - { - "name" : "minecraft:item.hopper", - "id" : 154 - }, - { - "name" : "minecraft:item.iron_door", - "id" : 71 - }, - { - "name" : "minecraft:item.jungle_door", - "id" : 195 - }, - { - "name" : "minecraft:item.kelp", - "id" : -138 - }, - { - "name" : "minecraft:item.nether_sprouts", - "id" : -238 - }, - { - "name" : "minecraft:item.nether_wart", - "id" : 115 - }, - { - "name" : "minecraft:item.reeds", - "id" : 83 - }, - { - "name" : "minecraft:item.skull", - "id" : 144 - }, - { - "name" : "minecraft:item.soul_campfire", - "id" : -290 - }, - { - "name" : "minecraft:item.spruce_door", - "id" : 193 - }, - { - "name" : "minecraft:item.warped_door", - "id" : -245 - }, - { - "name" : "minecraft:item.wheat", - "id" : 59 - }, - { - "name" : "minecraft:item.wooden_door", - "id" : 64 - }, - { - "name" : "minecraft:jigsaw", - "id" : -211 - }, - { - "name" : "minecraft:jukebox", - "id" : 84 - }, - { - "name" : "minecraft:jungle_boat", - "id" : 377 - }, - { - "name" : "minecraft:jungle_button", - "id" : -143 - }, - { - "name" : "minecraft:jungle_door", - "id" : 555 - }, - { - "name" : "minecraft:jungle_fence_gate", - "id" : 185 - }, - { - "name" : "minecraft:jungle_pressure_plate", - "id" : -153 - }, - { - "name" : "minecraft:jungle_sign", - "id" : 578 - }, - { - "name" : "minecraft:jungle_stairs", - "id" : 136 - }, - { - "name" : "minecraft:jungle_standing_sign", - "id" : -188 - }, - { - "name" : "minecraft:jungle_trapdoor", - "id" : -148 - }, - { - "name" : "minecraft:jungle_wall_sign", - "id" : -189 - }, - { - "name" : "minecraft:kelp", - "id" : 382 - }, - { - "name" : "minecraft:ladder", - "id" : 65 - }, - { - "name" : "minecraft:lantern", - "id" : -208 - }, - { - "name" : "minecraft:lapis_block", - "id" : 22 - }, - { - "name" : "minecraft:lapis_lazuli", - "id" : 414 - }, - { - "name" : "minecraft:lapis_ore", - "id" : 21 - }, - { - "name" : "minecraft:large_amethyst_bud", - "id" : -330 - }, - { - "name" : "minecraft:lava", - "id" : 11 - }, - { - "name" : "minecraft:lava_bucket", - "id" : 363 - }, - { - "name" : "minecraft:lava_cauldron", - "id" : -210 - }, - { - "name" : "minecraft:lead", - "id" : 547 - }, - { - "name" : "minecraft:leather", - "id" : 381 - }, - { - "name" : "minecraft:leather_boots", - "id" : 338 - }, - { - "name" : "minecraft:leather_chestplate", - "id" : 336 - }, - { - "name" : "minecraft:leather_helmet", - "id" : 335 - }, - { - "name" : "minecraft:leather_horse_armor", - "id" : 530 - }, - { - "name" : "minecraft:leather_leggings", - "id" : 337 - }, - { - "name" : "minecraft:leaves", - "id" : 18 - }, - { - "name" : "minecraft:leaves2", - "id" : 161 - }, - { - "name" : "minecraft:lectern", - "id" : -194 - }, - { - "name" : "minecraft:lever", - "id" : 69 - }, - { - "name" : "minecraft:light_block", - "id" : -215 - }, - { - "name" : "minecraft:light_blue_candle", - "id" : -416 - }, - { - "name" : "minecraft:light_blue_candle_cake", - "id" : -433 - }, - { - "name" : "minecraft:light_blue_dye", - "id" : 407 - }, - { - "name" : "minecraft:light_blue_glazed_terracotta", - "id" : 223 - }, - { - "name" : "minecraft:light_gray_candle", - "id" : -421 - }, - { - "name" : "minecraft:light_gray_candle_cake", - "id" : -438 - }, - { - "name" : "minecraft:light_gray_dye", - "id" : 402 - }, - { - "name" : "minecraft:light_weighted_pressure_plate", - "id" : 147 - }, - { - "name" : "minecraft:lightning_rod", - "id" : -312 - }, - { - "name" : "minecraft:lime_candle", - "id" : -418 - }, - { - "name" : "minecraft:lime_candle_cake", - "id" : -435 - }, - { - "name" : "minecraft:lime_dye", - "id" : 405 - }, - { - "name" : "minecraft:lime_glazed_terracotta", - "id" : 225 - }, - { - "name" : "minecraft:lingering_potion", - "id" : 562 - }, - { - "name" : "minecraft:lit_blast_furnace", - "id" : -214 - }, - { - "name" : "minecraft:lit_deepslate_redstone_ore", - "id" : -404 - }, - { - "name" : "minecraft:lit_furnace", - "id" : 62 - }, - { - "name" : "minecraft:lit_pumpkin", - "id" : 91 - }, - { - "name" : "minecraft:lit_redstone_lamp", - "id" : 124 - }, - { - "name" : "minecraft:lit_redstone_ore", - "id" : 74 - }, - { - "name" : "minecraft:lit_smoker", - "id" : -199 - }, - { - "name" : "minecraft:llama_spawn_egg", - "id" : 473 - }, - { - "name" : "minecraft:lodestone", - "id" : -222 - }, - { - "name" : "minecraft:lodestone_compass", - "id" : 602 - }, - { - "name" : "minecraft:log", - "id" : 17 - }, - { - "name" : "minecraft:log2", - "id" : 162 - }, - { - "name" : "minecraft:loom", - "id" : -204 - }, - { - "name" : "minecraft:magenta_candle", - "id" : -415 - }, - { - "name" : "minecraft:magenta_candle_cake", - "id" : -432 - }, - { - "name" : "minecraft:magenta_dye", - "id" : 408 - }, - { - "name" : "minecraft:magenta_glazed_terracotta", - "id" : 222 - }, - { - "name" : "minecraft:magma", - "id" : 213 - }, - { - "name" : "minecraft:magma_cream", - "id" : 430 - }, - { - "name" : "minecraft:magma_cube_spawn_egg", - "id" : 455 - }, - { - "name" : "minecraft:medicine", - "id" : 599 - }, - { - "name" : "minecraft:medium_amethyst_bud", - "id" : -331 - }, - { - "name" : "minecraft:melon_block", - "id" : 103 - }, - { - "name" : "minecraft:melon_seeds", - "id" : 293 - }, - { - "name" : "minecraft:melon_slice", - "id" : 272 - }, - { - "name" : "minecraft:melon_stem", - "id" : 105 - }, - { - "name" : "minecraft:milk_bucket", - "id" : 361 - }, - { - "name" : "minecraft:minecart", - "id" : 370 - }, - { - "name" : "minecraft:mob_spawner", - "id" : 52 - }, - { - "name" : "minecraft:mojang_banner_pattern", - "id" : 584 - }, - { - "name" : "minecraft:monster_egg", - "id" : 97 - }, - { - "name" : "minecraft:mooshroom_spawn_egg", - "id" : 440 - }, - { - "name" : "minecraft:moss_block", - "id" : -320 - }, - { - "name" : "minecraft:moss_carpet", - "id" : -335 - }, - { - "name" : "minecraft:mossy_cobblestone", - "id" : 48 - }, - { - "name" : "minecraft:mossy_cobblestone_stairs", - "id" : -179 - }, - { - "name" : "minecraft:mossy_stone_brick_stairs", - "id" : -175 - }, - { - "name" : "minecraft:movingblock", - "id" : 250 - }, - { - "name" : "minecraft:mule_spawn_egg", - "id" : 466 - }, - { - "name" : "minecraft:mushroom_stew", - "id" : 260 - }, - { - "name" : "minecraft:music_disc_11", - "id" : 544 - }, - { - "name" : "minecraft:music_disc_13", - "id" : 534 - }, - { - "name" : "minecraft:music_disc_blocks", - "id" : 536 - }, - { - "name" : "minecraft:music_disc_cat", - "id" : 535 - }, - { - "name" : "minecraft:music_disc_chirp", - "id" : 537 - }, - { - "name" : "minecraft:music_disc_far", - "id" : 538 - }, - { - "name" : "minecraft:music_disc_mall", - "id" : 539 - }, - { - "name" : "minecraft:music_disc_mellohi", - "id" : 540 - }, - { - "name" : "minecraft:music_disc_otherside", - "id" : 627 - }, - { - "name" : "minecraft:music_disc_pigstep", - "id" : 620 - }, - { - "name" : "minecraft:music_disc_stal", - "id" : 541 - }, - { - "name" : "minecraft:music_disc_strad", - "id" : 542 - }, - { - "name" : "minecraft:music_disc_wait", - "id" : 545 - }, - { - "name" : "minecraft:music_disc_ward", - "id" : 543 - }, - { - "name" : "minecraft:mutton", - "id" : 550 - }, - { - "name" : "minecraft:mycelium", - "id" : 110 - }, - { - "name" : "minecraft:mysterious_frame", - "id" : -466 - }, - { - "name" : "minecraft:mysterious_frame_slot", - "id" : -467 - }, - { - "name" : "minecraft:name_tag", - "id" : 548 - }, - { - "name" : "minecraft:nautilus_shell", - "id" : 570 - }, - { - "name" : "minecraft:nether_brick", - "id" : 112 - }, - { - "name" : "minecraft:nether_brick_fence", - "id" : 113 - }, - { - "name" : "minecraft:nether_brick_stairs", - "id" : 114 - }, - { - "name" : "minecraft:nether_gold_ore", - "id" : -288 - }, - { - "name" : "minecraft:nether_sprouts", - "id" : 621 - }, - { - "name" : "minecraft:nether_star", - "id" : 518 - }, - { - "name" : "minecraft:nether_wart", - "id" : 294 - }, - { - "name" : "minecraft:nether_wart_block", - "id" : 214 - }, - { - "name" : "minecraft:netherbrick", - "id" : 523 - }, - { - "name" : "minecraft:netherite_axe", - "id" : 607 - }, - { - "name" : "minecraft:netherite_block", - "id" : -270 - }, - { - "name" : "minecraft:netherite_boots", - "id" : 612 - }, - { - "name" : "minecraft:netherite_chestplate", - "id" : 610 - }, - { - "name" : "minecraft:netherite_helmet", - "id" : 609 - }, - { - "name" : "minecraft:netherite_hoe", - "id" : 608 - }, - { - "name" : "minecraft:netherite_ingot", - "id" : 603 - }, - { - "name" : "minecraft:netherite_leggings", - "id" : 611 - }, - { - "name" : "minecraft:netherite_pickaxe", - "id" : 606 - }, - { - "name" : "minecraft:netherite_scrap", - "id" : 613 - }, - { - "name" : "minecraft:netherite_shovel", - "id" : 605 - }, - { - "name" : "minecraft:netherite_sword", - "id" : 604 - }, - { - "name" : "minecraft:netherrack", - "id" : 87 - }, - { - "name" : "minecraft:netherreactor", - "id" : 247 - }, - { - "name" : "minecraft:normal_stone_stairs", - "id" : -180 - }, - { - "name" : "minecraft:noteblock", - "id" : 25 - }, - { - "name" : "minecraft:npc_spawn_egg", - "id" : 470 - }, - { - "name" : "minecraft:oak_boat", - "id" : 375 - }, - { - "name" : "minecraft:oak_sign", - "id" : 358 - }, - { - "name" : "minecraft:oak_stairs", - "id" : 53 - }, - { - "name" : "minecraft:observer", - "id" : 251 - }, - { - "name" : "minecraft:obsidian", - "id" : 49 - }, - { - "name" : "minecraft:ocelot_spawn_egg", - "id" : 451 - }, - { - "name" : "minecraft:ochre_froglight", - "id" : -471 - }, - { - "name" : "minecraft:orange_candle", - "id" : -414 - }, - { - "name" : "minecraft:orange_candle_cake", - "id" : -431 - }, - { - "name" : "minecraft:orange_dye", - "id" : 409 - }, - { - "name" : "minecraft:orange_glazed_terracotta", - "id" : 221 - }, - { - "name" : "minecraft:oxidized_copper", - "id" : -343 - }, - { - "name" : "minecraft:oxidized_cut_copper", - "id" : -350 - }, - { - "name" : "minecraft:oxidized_cut_copper_slab", - "id" : -364 - }, - { - "name" : "minecraft:oxidized_cut_copper_stairs", - "id" : -357 - }, - { - "name" : "minecraft:oxidized_double_cut_copper_slab", - "id" : -371 - }, - { - "name" : "minecraft:packed_ice", - "id" : 174 - }, - { - "name" : "minecraft:painting", - "id" : 357 - }, - { - "name" : "minecraft:panda_spawn_egg", - "id" : 489 - }, - { - "name" : "minecraft:paper", - "id" : 386 - }, - { - "name" : "minecraft:parrot_spawn_egg", - "id" : 478 - }, - { - "name" : "minecraft:pearlescent_froglight", - "id" : -469 - }, - { - "name" : "minecraft:phantom_membrane", - "id" : 574 - }, - { - "name" : "minecraft:phantom_spawn_egg", - "id" : 486 - }, - { - "name" : "minecraft:pig_spawn_egg", - "id" : 437 - }, - { - "name" : "minecraft:piglin_banner_pattern", - "id" : 587 - }, - { - "name" : "minecraft:piglin_brute_spawn_egg", - "id" : 499 - }, - { - "name" : "minecraft:piglin_spawn_egg", - "id" : 497 - }, - { - "name" : "minecraft:pillager_spawn_egg", - "id" : 491 - }, - { - "name" : "minecraft:pink_candle", - "id" : -419 - }, - { - "name" : "minecraft:pink_candle_cake", - "id" : -436 - }, - { - "name" : "minecraft:pink_dye", - "id" : 404 - }, - { - "name" : "minecraft:pink_glazed_terracotta", - "id" : 226 - }, - { - "name" : "minecraft:piston", - "id" : 33 - }, - { - "name" : "minecraft:pistonarmcollision", - "id" : 34 - }, - { - "name" : "minecraft:planks", - "id" : 5 - }, - { - "name" : "minecraft:podzol", - "id" : 243 - }, - { - "name" : "minecraft:pointed_dripstone", - "id" : -308 - }, - { - "name" : "minecraft:poisonous_potato", - "id" : 282 - }, - { - "name" : "minecraft:polar_bear_spawn_egg", - "id" : 472 - }, - { - "name" : "minecraft:polished_andesite_stairs", - "id" : -174 - }, - { - "name" : "minecraft:polished_basalt", - "id" : -235 - }, - { - "name" : "minecraft:polished_blackstone", - "id" : -291 - }, - { - "name" : "minecraft:polished_blackstone_brick_double_slab", - "id" : -285 - }, - { - "name" : "minecraft:polished_blackstone_brick_slab", - "id" : -284 - }, - { - "name" : "minecraft:polished_blackstone_brick_stairs", - "id" : -275 - }, - { - "name" : "minecraft:polished_blackstone_brick_wall", - "id" : -278 - }, - { - "name" : "minecraft:polished_blackstone_bricks", - "id" : -274 - }, - { - "name" : "minecraft:polished_blackstone_button", - "id" : -296 - }, - { - "name" : "minecraft:polished_blackstone_double_slab", - "id" : -294 - }, - { - "name" : "minecraft:polished_blackstone_pressure_plate", - "id" : -295 - }, - { - "name" : "minecraft:polished_blackstone_slab", - "id" : -293 - }, - { - "name" : "minecraft:polished_blackstone_stairs", - "id" : -292 - }, - { - "name" : "minecraft:polished_blackstone_wall", - "id" : -297 - }, - { - "name" : "minecraft:polished_deepslate", - "id" : -383 - }, - { - "name" : "minecraft:polished_deepslate_double_slab", - "id" : -397 - }, - { - "name" : "minecraft:polished_deepslate_slab", - "id" : -384 - }, - { - "name" : "minecraft:polished_deepslate_stairs", - "id" : -385 - }, - { - "name" : "minecraft:polished_deepslate_wall", - "id" : -386 - }, - { - "name" : "minecraft:polished_diorite_stairs", - "id" : -173 - }, - { - "name" : "minecraft:polished_granite_stairs", - "id" : -172 - }, - { - "name" : "minecraft:popped_chorus_fruit", - "id" : 559 - }, - { - "name" : "minecraft:porkchop", - "id" : 262 - }, - { - "name" : "minecraft:portal", - "id" : 90 - }, - { - "name" : "minecraft:potato", - "id" : 280 - }, - { - "name" : "minecraft:potatoes", - "id" : 142 - }, - { - "name" : "minecraft:potion", - "id" : 426 - }, - { - "name" : "minecraft:powder_snow", - "id" : -306 - }, - { - "name" : "minecraft:powder_snow_bucket", - "id" : 368 - }, - { - "name" : "minecraft:powered_comparator", - "id" : 150 - }, - { - "name" : "minecraft:powered_repeater", - "id" : 94 - }, - { - "name" : "minecraft:prismarine", - "id" : 168 - }, - { - "name" : "minecraft:prismarine_bricks_stairs", - "id" : -4 - }, - { - "name" : "minecraft:prismarine_crystals", - "id" : 549 - }, - { - "name" : "minecraft:prismarine_shard", - "id" : 565 - }, - { - "name" : "minecraft:prismarine_stairs", - "id" : -2 - }, - { - "name" : "minecraft:pufferfish", - "id" : 267 - }, - { - "name" : "minecraft:pufferfish_bucket", - "id" : 367 - }, - { - "name" : "minecraft:pufferfish_spawn_egg", - "id" : 481 - }, - { - "name" : "minecraft:pumpkin", - "id" : 86 - }, - { - "name" : "minecraft:pumpkin_pie", - "id" : 284 - }, - { - "name" : "minecraft:pumpkin_seeds", - "id" : 292 - }, - { - "name" : "minecraft:pumpkin_stem", - "id" : 104 - }, - { - "name" : "minecraft:purple_candle", - "id" : -423 - }, - { - "name" : "minecraft:purple_candle_cake", - "id" : -440 - }, - { - "name" : "minecraft:purple_dye", - "id" : 400 - }, - { - "name" : "minecraft:purple_glazed_terracotta", - "id" : 219 - }, - { - "name" : "minecraft:purpur_block", - "id" : 201 - }, - { - "name" : "minecraft:purpur_stairs", - "id" : 203 - }, - { - "name" : "minecraft:quartz", - "id" : 524 - }, - { - "name" : "minecraft:quartz_block", - "id" : 155 - }, - { - "name" : "minecraft:quartz_bricks", - "id" : -304 - }, - { - "name" : "minecraft:quartz_ore", - "id" : 153 - }, - { - "name" : "minecraft:quartz_stairs", - "id" : 156 - }, - { - "name" : "minecraft:rabbit", - "id" : 288 - }, - { - "name" : "minecraft:rabbit_foot", - "id" : 528 - }, - { - "name" : "minecraft:rabbit_hide", - "id" : 529 - }, - { - "name" : "minecraft:rabbit_spawn_egg", - "id" : 459 - }, - { - "name" : "minecraft:rabbit_stew", - "id" : 290 - }, - { - "name" : "minecraft:rail", - "id" : 66 - }, - { - "name" : "minecraft:rapid_fertilizer", - "id" : 597 - }, - { - "name" : "minecraft:ravager_spawn_egg", - "id" : 493 - }, - { - "name" : "minecraft:raw_copper", - "id" : 507 - }, - { - "name" : "minecraft:raw_copper_block", - "id" : -452 - }, - { - "name" : "minecraft:raw_gold", - "id" : 506 - }, - { - "name" : "minecraft:raw_gold_block", - "id" : -453 - }, - { - "name" : "minecraft:raw_iron", - "id" : 505 - }, - { - "name" : "minecraft:raw_iron_block", - "id" : -451 - }, - { - "name" : "minecraft:real_double_stone_slab", - "id" : 43 - }, - { - "name" : "minecraft:real_double_stone_slab2", - "id" : 181 - }, - { - "name" : "minecraft:real_double_stone_slab3", - "id" : -167 - }, - { - "name" : "minecraft:real_double_stone_slab4", - "id" : -168 - }, - { - "name" : "minecraft:red_candle", - "id" : -427 - }, - { - "name" : "minecraft:red_candle_cake", - "id" : -444 - }, - { - "name" : "minecraft:red_dye", - "id" : 396 - }, - { - "name" : "minecraft:red_flower", - "id" : 38 - }, - { - "name" : "minecraft:red_glazed_terracotta", - "id" : 234 - }, - { - "name" : "minecraft:red_mushroom", - "id" : 40 - }, - { - "name" : "minecraft:red_mushroom_block", - "id" : 100 - }, - { - "name" : "minecraft:red_nether_brick", - "id" : 215 - }, - { - "name" : "minecraft:red_nether_brick_stairs", - "id" : -184 - }, - { - "name" : "minecraft:red_sandstone", - "id" : 179 - }, - { - "name" : "minecraft:red_sandstone_stairs", - "id" : 180 - }, - { - "name" : "minecraft:redstone", - "id" : 373 - }, - { - "name" : "minecraft:redstone_block", - "id" : 152 - }, - { - "name" : "minecraft:redstone_lamp", - "id" : 123 - }, - { - "name" : "minecraft:redstone_ore", - "id" : 73 - }, - { - "name" : "minecraft:redstone_torch", - "id" : 76 - }, - { - "name" : "minecraft:redstone_wire", - "id" : 55 - }, - { - "name" : "minecraft:repeater", - "id" : 419 - }, - { - "name" : "minecraft:repeating_command_block", - "id" : 188 - }, - { - "name" : "minecraft:reserved6", - "id" : 255 - }, - { - "name" : "minecraft:respawn_anchor", - "id" : -272 - }, - { - "name" : "minecraft:rotten_flesh", - "id" : 277 - }, - { - "name" : "minecraft:saddle", - "id" : 371 - }, - { - "name" : "minecraft:salmon", - "id" : 265 - }, - { - "name" : "minecraft:salmon_bucket", - "id" : 365 - }, - { - "name" : "minecraft:salmon_spawn_egg", - "id" : 482 - }, - { - "name" : "minecraft:sand", - "id" : 12 - }, - { - "name" : "minecraft:sandstone", - "id" : 24 - }, - { - "name" : "minecraft:sandstone_stairs", - "id" : 128 - }, - { - "name" : "minecraft:sapling", - "id" : 6 - }, - { - "name" : "minecraft:scaffolding", - "id" : -165 - }, - { - "name" : "minecraft:sculk", - "id" : -458 - }, - { - "name" : "minecraft:sculk_catalyst", - "id" : -460 - }, - { - "name" : "minecraft:sculk_sensor", - "id" : -307 - }, - { - "name" : "minecraft:sculk_shrieker", - "id" : -461 - }, - { - "name" : "minecraft:sculk_vein", - "id" : -459 - }, - { - "name" : "minecraft:scute", - "id" : 572 - }, - { - "name" : "minecraft:sea_pickle", - "id" : -156 - }, - { - "name" : "minecraft:seagrass", - "id" : -130 - }, - { - "name" : "minecraft:sealantern", - "id" : 169 - }, - { - "name" : "minecraft:shears", - "id" : 421 - }, - { - "name" : "minecraft:sheep_spawn_egg", - "id" : 438 - }, - { - "name" : "minecraft:shield", - "id" : 355 - }, - { - "name" : "minecraft:shroomlight", - "id" : -230 - }, - { - "name" : "minecraft:shulker_box", - "id" : 218 - }, - { - "name" : "minecraft:shulker_shell", - "id" : 566 - }, - { - "name" : "minecraft:shulker_spawn_egg", - "id" : 469 - }, - { - "name" : "minecraft:silver_glazed_terracotta", - "id" : 228 - }, - { - "name" : "minecraft:silverfish_spawn_egg", - "id" : 443 - }, - { - "name" : "minecraft:skeleton_horse_spawn_egg", - "id" : 467 - }, - { - "name" : "minecraft:skeleton_spawn_egg", - "id" : 444 - }, - { - "name" : "minecraft:skull", - "id" : 516 - }, - { - "name" : "minecraft:skull_banner_pattern", - "id" : 583 - }, - { - "name" : "minecraft:slime", - "id" : 165 - }, - { - "name" : "minecraft:slime_ball", - "id" : 388 - }, - { - "name" : "minecraft:slime_spawn_egg", - "id" : 445 - }, - { - "name" : "minecraft:small_amethyst_bud", - "id" : -332 - }, - { - "name" : "minecraft:small_dripleaf_block", - "id" : -336 - }, - { - "name" : "minecraft:smithing_table", - "id" : -202 - }, - { - "name" : "minecraft:smoker", - "id" : -198 - }, - { - "name" : "minecraft:smooth_basalt", - "id" : -377 - }, - { - "name" : "minecraft:smooth_quartz_stairs", - "id" : -185 - }, - { - "name" : "minecraft:smooth_red_sandstone_stairs", - "id" : -176 - }, - { - "name" : "minecraft:smooth_sandstone_stairs", - "id" : -177 - }, - { - "name" : "minecraft:smooth_stone", - "id" : -183 - }, - { - "name" : "minecraft:snow", - "id" : 80 - }, - { - "name" : "minecraft:snow_layer", - "id" : 78 - }, - { - "name" : "minecraft:snowball", - "id" : 374 - }, - { - "name" : "minecraft:soul_campfire", - "id" : 622 - }, - { - "name" : "minecraft:soul_fire", - "id" : -237 - }, - { - "name" : "minecraft:soul_lantern", - "id" : -269 - }, - { - "name" : "minecraft:soul_sand", - "id" : 88 - }, - { - "name" : "minecraft:soul_soil", - "id" : -236 - }, - { - "name" : "minecraft:soul_torch", - "id" : -268 - }, - { - "name" : "minecraft:sparkler", - "id" : 600 - }, - { - "name" : "minecraft:spawn_egg", - "id" : 636 - }, - { - "name" : "minecraft:spider_eye", - "id" : 278 - }, - { - "name" : "minecraft:spider_spawn_egg", - "id" : 446 - }, - { - "name" : "minecraft:splash_potion", - "id" : 561 - }, - { - "name" : "minecraft:sponge", - "id" : 19 - }, - { - "name" : "minecraft:spore_blossom", - "id" : -321 - }, - { - "name" : "minecraft:spruce_boat", - "id" : 378 - }, - { - "name" : "minecraft:spruce_button", - "id" : -144 - }, - { - "name" : "minecraft:spruce_door", - "id" : 553 - }, - { - "name" : "minecraft:spruce_fence_gate", - "id" : 183 - }, - { - "name" : "minecraft:spruce_pressure_plate", - "id" : -154 - }, - { - "name" : "minecraft:spruce_sign", - "id" : 576 - }, - { - "name" : "minecraft:spruce_stairs", - "id" : 134 - }, - { - "name" : "minecraft:spruce_standing_sign", - "id" : -181 - }, - { - "name" : "minecraft:spruce_trapdoor", - "id" : -149 - }, - { - "name" : "minecraft:spruce_wall_sign", - "id" : -182 - }, - { - "name" : "minecraft:spyglass", - "id" : 626 - }, - { - "name" : "minecraft:squid_spawn_egg", - "id" : 450 - }, - { - "name" : "minecraft:stained_glass", - "id" : 241 - }, - { - "name" : "minecraft:stained_glass_pane", - "id" : 160 - }, - { - "name" : "minecraft:stained_hardened_clay", - "id" : 159 - }, - { - "name" : "minecraft:standing_banner", - "id" : 176 - }, - { - "name" : "minecraft:standing_sign", - "id" : 63 - }, - { - "name" : "minecraft:stick", - "id" : 320 - }, - { - "name" : "minecraft:sticky_piston", - "id" : 29 - }, - { - "name" : "minecraft:stickypistonarmcollision", - "id" : -217 - }, - { - "name" : "minecraft:stone", - "id" : 1 - }, - { - "name" : "minecraft:stone_axe", - "id" : 315 - }, - { - "name" : "minecraft:stone_brick_stairs", - "id" : 109 - }, - { - "name" : "minecraft:stone_button", - "id" : 77 - }, - { - "name" : "minecraft:stone_hoe", - "id" : 330 - }, - { - "name" : "minecraft:stone_pickaxe", - "id" : 314 - }, - { - "name" : "minecraft:stone_pressure_plate", - "id" : 70 - }, - { - "name" : "minecraft:stone_shovel", - "id" : 313 - }, - { - "name" : "minecraft:stone_stairs", - "id" : 67 - }, - { - "name" : "minecraft:stone_sword", - "id" : 312 - }, - { - "name" : "minecraft:stonebrick", - "id" : 98 - }, - { - "name" : "minecraft:stonecutter", - "id" : 245 - }, - { - "name" : "minecraft:stonecutter_block", - "id" : -197 - }, - { - "name" : "minecraft:stray_spawn_egg", - "id" : 462 - }, - { - "name" : "minecraft:strider_spawn_egg", - "id" : 495 - }, - { - "name" : "minecraft:string", - "id" : 326 - }, - { - "name" : "minecraft:stripped_acacia_log", - "id" : -8 - }, - { - "name" : "minecraft:stripped_birch_log", - "id" : -6 - }, - { - "name" : "minecraft:stripped_crimson_hyphae", - "id" : -300 - }, - { - "name" : "minecraft:stripped_crimson_stem", - "id" : -240 - }, - { - "name" : "minecraft:stripped_dark_oak_log", - "id" : -9 - }, - { - "name" : "minecraft:stripped_jungle_log", - "id" : -7 - }, - { - "name" : "minecraft:stripped_oak_log", - "id" : -10 - }, - { - "name" : "minecraft:stripped_spruce_log", - "id" : -5 - }, - { - "name" : "minecraft:stripped_warped_hyphae", - "id" : -301 - }, - { - "name" : "minecraft:stripped_warped_stem", - "id" : -241 - }, - { - "name" : "minecraft:structure_block", - "id" : 252 - }, - { - "name" : "minecraft:structure_void", - "id" : 217 - }, - { - "name" : "minecraft:sugar", - "id" : 416 - }, - { - "name" : "minecraft:sugar_cane", - "id" : 385 - }, - { - "name" : "minecraft:suspicious_stew", - "id" : 590 - }, - { - "name" : "minecraft:sweet_berries", - "id" : 287 - }, - { - "name" : "minecraft:sweet_berry_bush", - "id" : -207 - }, - { - "name" : "minecraft:tadpole_bucket", - "id" : 630 - }, - { - "name" : "minecraft:tadpole_spawn_egg", - "id" : 629 - }, - { - "name" : "minecraft:tallgrass", - "id" : 31 - }, - { - "name" : "minecraft:target", - "id" : -239 - }, - { - "name" : "minecraft:tinted_glass", - "id" : -334 - }, - { - "name" : "minecraft:tnt", - "id" : 46 - }, - { - "name" : "minecraft:tnt_minecart", - "id" : 525 - }, - { - "name" : "minecraft:torch", - "id" : 50 - }, - { - "name" : "minecraft:totem_of_undying", - "id" : 568 - }, - { - "name" : "minecraft:trapdoor", - "id" : 96 - }, - { - "name" : "minecraft:trapped_chest", - "id" : 146 - }, - { - "name" : "minecraft:trident", - "id" : 546 - }, - { - "name" : "minecraft:tripwire", - "id" : 132 - }, - { - "name" : "minecraft:tripwire_hook", - "id" : 131 - }, - { - "name" : "minecraft:tropical_fish", - "id" : 266 - }, - { - "name" : "minecraft:tropical_fish_bucket", - "id" : 366 - }, - { - "name" : "minecraft:tropical_fish_spawn_egg", - "id" : 479 - }, - { - "name" : "minecraft:tuff", - "id" : -333 - }, - { - "name" : "minecraft:turtle_egg", - "id" : -159 - }, - { - "name" : "minecraft:turtle_helmet", - "id" : 573 - }, - { - "name" : "minecraft:turtle_spawn_egg", - "id" : 485 - }, - { - "name" : "minecraft:twisting_vines", - "id" : -287 - }, - { - "name" : "minecraft:underwater_torch", - "id" : 239 - }, - { - "name" : "minecraft:undyed_shulker_box", - "id" : 205 - }, - { - "name" : "minecraft:unknown", - "id" : -305 - }, - { - "name" : "minecraft:unlit_redstone_torch", - "id" : 75 - }, - { - "name" : "minecraft:unpowered_comparator", - "id" : 149 - }, - { - "name" : "minecraft:unpowered_repeater", - "id" : 93 - }, - { - "name" : "minecraft:verdant_froglight", - "id" : -470 - }, - { - "name" : "minecraft:vex_spawn_egg", - "id" : 476 - }, - { - "name" : "minecraft:villager_spawn_egg", - "id" : 449 - }, - { - "name" : "minecraft:vindicator_spawn_egg", - "id" : 474 - }, - { - "name" : "minecraft:vine", - "id" : 106 - }, - { - "name" : "minecraft:wall_banner", - "id" : 177 - }, - { - "name" : "minecraft:wall_sign", - "id" : 68 - }, - { - "name" : "minecraft:wandering_trader_spawn_egg", - "id" : 492 - }, - { - "name" : "minecraft:warped_button", - "id" : -261 - }, - { - "name" : "minecraft:warped_door", - "id" : 617 - }, - { - "name" : "minecraft:warped_double_slab", - "id" : -267 - }, - { - "name" : "minecraft:warped_fence", - "id" : -257 - }, - { - "name" : "minecraft:warped_fence_gate", - "id" : -259 - }, - { - "name" : "minecraft:warped_fungus", - "id" : -229 - }, - { - "name" : "minecraft:warped_fungus_on_a_stick", - "id" : 618 - }, - { - "name" : "minecraft:warped_hyphae", - "id" : -298 - }, - { - "name" : "minecraft:warped_nylium", - "id" : -233 - }, - { - "name" : "minecraft:warped_planks", - "id" : -243 - }, - { - "name" : "minecraft:warped_pressure_plate", - "id" : -263 - }, - { - "name" : "minecraft:warped_roots", - "id" : -224 - }, - { - "name" : "minecraft:warped_sign", - "id" : 615 - }, - { - "name" : "minecraft:warped_slab", - "id" : -265 - }, - { - "name" : "minecraft:warped_stairs", - "id" : -255 - }, - { - "name" : "minecraft:warped_standing_sign", - "id" : -251 - }, - { - "name" : "minecraft:warped_stem", - "id" : -226 - }, - { - "name" : "minecraft:warped_trapdoor", - "id" : -247 - }, - { - "name" : "minecraft:warped_wall_sign", - "id" : -253 - }, - { - "name" : "minecraft:warped_wart_block", - "id" : -227 - }, - { - "name" : "minecraft:water", - "id" : 9 - }, - { - "name" : "minecraft:water_bucket", - "id" : 362 - }, - { - "name" : "minecraft:waterlily", - "id" : 111 - }, - { - "name" : "minecraft:waxed_copper", - "id" : -344 - }, - { - "name" : "minecraft:waxed_cut_copper", - "id" : -351 - }, - { - "name" : "minecraft:waxed_cut_copper_slab", - "id" : -365 - }, - { - "name" : "minecraft:waxed_cut_copper_stairs", - "id" : -358 - }, - { - "name" : "minecraft:waxed_double_cut_copper_slab", - "id" : -372 - }, - { - "name" : "minecraft:waxed_exposed_copper", - "id" : -345 - }, - { - "name" : "minecraft:waxed_exposed_cut_copper", - "id" : -352 - }, - { - "name" : "minecraft:waxed_exposed_cut_copper_slab", - "id" : -366 - }, - { - "name" : "minecraft:waxed_exposed_cut_copper_stairs", - "id" : -359 - }, - { - "name" : "minecraft:waxed_exposed_double_cut_copper_slab", - "id" : -373 - }, - { - "name" : "minecraft:waxed_oxidized_copper", - "id" : -446 - }, - { - "name" : "minecraft:waxed_oxidized_cut_copper", - "id" : -447 - }, - { - "name" : "minecraft:waxed_oxidized_cut_copper_slab", - "id" : -449 - }, - { - "name" : "minecraft:waxed_oxidized_cut_copper_stairs", - "id" : -448 - }, - { - "name" : "minecraft:waxed_oxidized_double_cut_copper_slab", - "id" : -450 - }, - { - "name" : "minecraft:waxed_weathered_copper", - "id" : -346 - }, - { - "name" : "minecraft:waxed_weathered_cut_copper", - "id" : -353 - }, - { - "name" : "minecraft:waxed_weathered_cut_copper_slab", - "id" : -367 - }, - { - "name" : "minecraft:waxed_weathered_cut_copper_stairs", - "id" : -360 - }, - { - "name" : "minecraft:waxed_weathered_double_cut_copper_slab", - "id" : -374 - }, - { - "name" : "minecraft:weathered_copper", - "id" : -342 - }, - { - "name" : "minecraft:weathered_cut_copper", - "id" : -349 - }, - { - "name" : "minecraft:weathered_cut_copper_slab", - "id" : -363 - }, - { - "name" : "minecraft:weathered_cut_copper_stairs", - "id" : -356 - }, - { - "name" : "minecraft:weathered_double_cut_copper_slab", - "id" : -370 - }, - { - "name" : "minecraft:web", - "id" : 30 - }, - { - "name" : "minecraft:weeping_vines", - "id" : -231 - }, - { - "name" : "minecraft:wheat", - "id" : 334 - }, - { - "name" : "minecraft:wheat_seeds", - "id" : 291 - }, - { - "name" : "minecraft:white_candle", - "id" : -413 - }, - { - "name" : "minecraft:white_candle_cake", - "id" : -430 - }, - { - "name" : "minecraft:white_dye", - "id" : 410 - }, - { - "name" : "minecraft:white_glazed_terracotta", - "id" : 220 - }, - { - "name" : "minecraft:witch_spawn_egg", - "id" : 452 - }, - { - "name" : "minecraft:wither_rose", - "id" : -216 - }, - { - "name" : "minecraft:wither_skeleton_spawn_egg", - "id" : 464 - }, - { - "name" : "minecraft:wolf_spawn_egg", - "id" : 439 - }, - { - "name" : "minecraft:wood", - "id" : -212 - }, - { - "name" : "minecraft:wooden_axe", - "id" : 311 - }, - { - "name" : "minecraft:wooden_button", - "id" : 143 - }, - { - "name" : "minecraft:wooden_door", - "id" : 359 - }, - { - "name" : "minecraft:wooden_hoe", - "id" : 329 - }, - { - "name" : "minecraft:wooden_pickaxe", - "id" : 310 - }, - { - "name" : "minecraft:wooden_pressure_plate", - "id" : 72 - }, - { - "name" : "minecraft:wooden_shovel", - "id" : 309 - }, - { - "name" : "minecraft:wooden_slab", - "id" : 158 - }, - { - "name" : "minecraft:wooden_sword", - "id" : 308 - }, - { - "name" : "minecraft:wool", - "id" : 35 - }, - { - "name" : "minecraft:writable_book", - "id" : 510 - }, - { - "name" : "minecraft:written_book", - "id" : 511 - }, - { - "name" : "minecraft:yellow_candle", - "id" : -417 - }, - { - "name" : "minecraft:yellow_candle_cake", - "id" : -434 - }, - { - "name" : "minecraft:yellow_dye", - "id" : 406 - }, - { - "name" : "minecraft:yellow_flower", - "id" : 37 - }, - { - "name" : "minecraft:yellow_glazed_terracotta", - "id" : 224 - }, - { - "name" : "minecraft:zoglin_spawn_egg", - "id" : 498 - }, - { - "name" : "minecraft:zombie_horse_spawn_egg", - "id" : 468 - }, - { - "name" : "minecraft:zombie_pigman_spawn_egg", - "id" : 448 - }, - { - "name" : "minecraft:zombie_spawn_egg", - "id" : 447 - }, - { - "name" : "minecraft:zombie_villager_spawn_egg", - "id" : 477 - } -] \ No newline at end of file diff --git a/core/src/main/resources/bedrock/runtime_item_states.1_18_30.json b/core/src/main/resources/bedrock/runtime_item_states.1_19_0.json similarity index 97% rename from core/src/main/resources/bedrock/runtime_item_states.1_18_30.json rename to core/src/main/resources/bedrock/runtime_item_states.1_19_0.json index 4e609c7c0..b1ffe6353 100644 --- a/core/src/main/resources/bedrock/runtime_item_states.1_18_30.json +++ b/core/src/main/resources/bedrock/runtime_item_states.1_19_0.json @@ -9,7 +9,7 @@ }, { "name" : "minecraft:acacia_chest_boat", - "id" : 637 + "id" : 643 }, { "name" : "minecraft:acacia_door", @@ -57,7 +57,7 @@ }, { "name" : "minecraft:allay_spawn_egg", - "id" : 630 + "id" : 631 }, { "name" : "minecraft:allow", @@ -141,7 +141,7 @@ }, { "name" : "minecraft:banner_pattern", - "id" : 642 + "id" : 651 }, { "name" : "minecraft:barrel", @@ -217,7 +217,7 @@ }, { "name" : "minecraft:birch_chest_boat", - "id" : 634 + "id" : 640 }, { "name" : "minecraft:birch_door", @@ -329,7 +329,7 @@ }, { "name" : "minecraft:boat", - "id" : 640 + "id" : 649 }, { "name" : "minecraft:bone", @@ -541,7 +541,7 @@ }, { "name" : "minecraft:chest_boat", - "id" : 639 + "id" : 646 }, { "name" : "minecraft:chest_minecart", @@ -921,7 +921,7 @@ }, { "name" : "minecraft:dark_oak_chest_boat", - "id" : 638 + "id" : 644 }, { "name" : "minecraft:dark_oak_door", @@ -1119,6 +1119,10 @@ "name" : "minecraft:dirt_with_roots", "id" : -318 }, + { + "name" : "minecraft:disc_fragment_5", + "id" : 638 + }, { "name" : "minecraft:dispenser", "id" : 23 @@ -1140,20 +1144,20 @@ "id" : 175 }, { - "name" : "minecraft:double_stone_slab", - "id" : 44 + "name" : "minecraft:double_stone_block_slab", + "id" : 43 }, { - "name" : "minecraft:double_stone_slab2", - "id" : 182 + "name" : "minecraft:double_stone_block_slab2", + "id" : 181 }, { - "name" : "minecraft:double_stone_slab3", - "id" : -162 + "name" : "minecraft:double_stone_block_slab3", + "id" : -167 }, { - "name" : "minecraft:double_stone_slab4", - "id" : -166 + "name" : "minecraft:double_stone_block_slab4", + "id" : -168 }, { "name" : "minecraft:double_wooden_slab", @@ -1189,7 +1193,11 @@ }, { "name" : "minecraft:dye", - "id" : 641 + "id" : 650 + }, + { + "name" : "minecraft:echo_shard", + "id" : 648 }, { "name" : "minecraft:egg", @@ -1717,7 +1725,7 @@ }, { "name" : "minecraft:end_crystal", - "id" : 644 + "id" : 653 }, { "name" : "minecraft:end_gateway", @@ -1825,7 +1833,7 @@ }, { "name" : "minecraft:firefly_spawn_egg", - "id" : 632 + "id" : 633 }, { "name" : "minecraft:firework_rocket", @@ -1885,7 +1893,7 @@ }, { "name" : "minecraft:frog_spawn_egg", - "id" : 627 + "id" : 628 }, { "name" : "minecraft:frosted_ice", @@ -1929,7 +1937,7 @@ }, { "name" : "minecraft:glow_berries", - "id" : 645 + "id" : 654 }, { "name" : "minecraft:glow_frame", @@ -1963,6 +1971,10 @@ "name" : "minecraft:glowstone_dust", "id" : 394 }, + { + "name" : "minecraft:goat_horn", + "id" : 627 + }, { "name" : "minecraft:goat_spawn_egg", "id" : 501 @@ -2339,6 +2351,10 @@ "name" : "minecraft:item.kelp", "id" : -138 }, + { + "name" : "minecraft:item.mangrove_door", + "id" : -493 + }, { "name" : "minecraft:item.nether_sprouts", "id" : -238 @@ -2393,7 +2409,7 @@ }, { "name" : "minecraft:jungle_chest_boat", - "id" : 635 + "id" : 641 }, { "name" : "minecraft:jungle_door", @@ -2651,17 +2667,85 @@ "name" : "minecraft:magma_cube_spawn_egg", "id" : 455 }, + { + "name" : "minecraft:mangrove_boat", + "id" : 636 + }, + { + "name" : "minecraft:mangrove_button", + "id" : -487 + }, + { + "name" : "minecraft:mangrove_chest_boat", + "id" : 645 + }, + { + "name" : "minecraft:mangrove_door", + "id" : 634 + }, + { + "name" : "minecraft:mangrove_double_slab", + "id" : -499 + }, + { + "name" : "minecraft:mangrove_fence", + "id" : -491 + }, + { + "name" : "minecraft:mangrove_fence_gate", + "id" : -492 + }, { "name" : "minecraft:mangrove_leaves", "id" : -472 }, + { + "name" : "minecraft:mangrove_log", + "id" : -484 + }, + { + "name" : "minecraft:mangrove_planks", + "id" : -486 + }, + { + "name" : "minecraft:mangrove_pressure_plate", + "id" : -490 + }, { "name" : "minecraft:mangrove_propagule", "id" : -474 }, { - "name" : "minecraft:mangrove_propagule_hanging", - "id" : -476 + "name" : "minecraft:mangrove_roots", + "id" : -482 + }, + { + "name" : "minecraft:mangrove_sign", + "id" : 635 + }, + { + "name" : "minecraft:mangrove_slab", + "id" : -489 + }, + { + "name" : "minecraft:mangrove_stairs", + "id" : -488 + }, + { + "name" : "minecraft:mangrove_standing_sign", + "id" : -494 + }, + { + "name" : "minecraft:mangrove_trapdoor", + "id" : -496 + }, + { + "name" : "minecraft:mangrove_wall_sign", + "id" : -495 + }, + { + "name" : "minecraft:mangrove_wood", + "id" : -497 }, { "name" : "minecraft:medicine", @@ -2759,6 +2843,10 @@ "name" : "minecraft:mud_bricks", "id" : -475 }, + { + "name" : "minecraft:muddy_mangrove_roots", + "id" : -483 + }, { "name" : "minecraft:mule_spawn_egg", "id" : 466 @@ -2775,6 +2863,10 @@ "name" : "minecraft:music_disc_13", "id" : 534 }, + { + "name" : "minecraft:music_disc_5", + "id" : 637 + }, { "name" : "minecraft:music_disc_blocks", "id" : 536 @@ -2949,7 +3041,7 @@ }, { "name" : "minecraft:oak_chest_boat", - "id" : 633 + "id" : 639 }, { "name" : "minecraft:oak_sign", @@ -3384,20 +3476,8 @@ "id" : -451 }, { - "name" : "minecraft:real_double_stone_slab", - "id" : 43 - }, - { - "name" : "minecraft:real_double_stone_slab2", - "id" : 181 - }, - { - "name" : "minecraft:real_double_stone_slab3", - "id" : -167 - }, - { - "name" : "minecraft:real_double_stone_slab4", - "id" : -168 + "name" : "minecraft:recovery_compass", + "id" : 647 }, { "name" : "minecraft:red_candle", @@ -3705,7 +3785,7 @@ }, { "name" : "minecraft:spawn_egg", - "id" : 643 + "id" : 652 }, { "name" : "minecraft:spider_eye", @@ -3737,7 +3817,7 @@ }, { "name" : "minecraft:spruce_chest_boat", - "id" : 636 + "id" : 642 }, { "name" : "minecraft:spruce_door", @@ -3819,6 +3899,22 @@ "name" : "minecraft:stone_axe", "id" : 315 }, + { + "name" : "minecraft:stone_block_slab", + "id" : 44 + }, + { + "name" : "minecraft:stone_block_slab2", + "id" : 182 + }, + { + "name" : "minecraft:stone_block_slab3", + "id" : -162 + }, + { + "name" : "minecraft:stone_block_slab4", + "id" : -166 + }, { "name" : "minecraft:stone_brick_stairs", "id" : 109 @@ -3899,6 +3995,14 @@ "name" : "minecraft:stripped_jungle_log", "id" : -7 }, + { + "name" : "minecraft:stripped_mangrove_log", + "id" : -485 + }, + { + "name" : "minecraft:stripped_mangrove_wood", + "id" : -498 + }, { "name" : "minecraft:stripped_oak_log", "id" : -10 @@ -3945,11 +4049,11 @@ }, { "name" : "minecraft:tadpole_bucket", - "id" : 629 + "id" : 630 }, { "name" : "minecraft:tadpole_spawn_egg", - "id" : 628 + "id" : 629 }, { "name" : "minecraft:tallgrass", @@ -4089,7 +4193,7 @@ }, { "name" : "minecraft:warden_spawn_egg", - "id" : 631 + "id" : 632 }, { "name" : "minecraft:warped_button", diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml index 2582e4d4d..d1a956187 100644 --- a/core/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -148,6 +148,13 @@ cache-images: 0 # Allows custom skulls to be displayed. Keeping them enabled may cause a performance decrease on older/weaker devices. allow-custom-skulls: true +# The maximum number of custom skulls to be displayed per player. Increasing this may decrease performance on weaker devices. +# Setting this to -1 will cause all custom skulls to be displayed regardless of distance or number. +max-visible-custom-skulls: 128 + +# The radius in blocks around the player in which custom skulls are displayed. +custom-skull-render-distance: 32 + # Whether to add (at this time, only) the furnace minecart as a separate item in the game, which normally does not exist in Bedrock Edition. # This should only need to be disabled if using a proxy that does not use the "transfer packet" style of server switching. # If this is disabled, furnace minecart items will be mapped to hopper minecart items. diff --git a/core/src/main/resources/mappings b/core/src/main/resources/mappings index f73b45844..99a1f8070 160000 --- a/core/src/main/resources/mappings +++ b/core/src/main/resources/mappings @@ -1 +1 @@ -Subproject commit f73b45844f1185c3898db3052ce4ea0d18246168 +Subproject commit 99a1f8070e844d059454dacbb6e8b203521eed23 diff --git a/settings.gradle.kts b/settings.gradle.kts index 9f210114c..0bc694b43 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,7 +12,7 @@ dependencyResolutionManagement { } // Paper, Velocity - maven("https://papermc.io/repo/repository/maven-public") + maven("https://repo.papermc.io/repository/maven-public") // Spigot maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots") { mavenContent { snapshotsOnly() }