Merge remote-tracking branch 'refs/remotes/upstream/master' into feature/1.21.4

# Conflicts:
#	gradle.properties
This commit is contained in:
onebeastchris 2024-12-03 23:14:05 +08:00
commit 5162aeb9b3
44 changed files with 2668 additions and 43132 deletions

View file

@ -15,7 +15,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!
## Supported Versions
Geyser is currently supporting Minecraft Bedrock 1.20.80 - 1.21.44 and Minecraft Java 1.21.2/1.21.3. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/).
Geyser is currently supporting Minecraft Bedrock 1.21.40 - 1.21.50 and Minecraft Java 1.21.2/1.21.3. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/).
## Setting Up
Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser.

View file

@ -39,7 +39,6 @@ import org.cloudburstmc.protocol.bedrock.packet.UpdateAttributesPacket;
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.level.BedrockDimension;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.AttributeUtils;
import org.geysermc.geyser.util.DimensionUtils;
@ -235,12 +234,7 @@ public class SessionPlayerEntity extends PlayerEntity {
// the bubbles visually pop
setFlag(EntityFlag.BREATHING, amount >= this.lastAirSupply);
this.lastAirSupply = amount;
if (amount == getMaxAir() && GameProtocol.isPre1_21_0(session)) {
super.setAirSupply(0); // Hide the bubble counter from the UI for the player
} else {
super.setAirSupply(amount);
}
super.setAirSupply(amount);
}
@Override

View file

@ -36,14 +36,14 @@ import java.util.UUID;
public class SessionLoadResourcePacksEventImpl extends SessionLoadResourcePacksEvent {
private final Map<String, ResourcePack> packs;
private final Map<UUID, ResourcePack> packs;
public SessionLoadResourcePacksEventImpl(GeyserSession session, Map<String, ResourcePack> packMap) {
public SessionLoadResourcePacksEventImpl(GeyserSession session, Map<UUID, ResourcePack> packMap) {
super(session);
this.packs = packMap;
}
public @NonNull Map<String, ResourcePack> getPacks() {
public @NonNull Map<UUID, ResourcePack> getPacks() {
return packs;
}
@ -54,16 +54,16 @@ public class SessionLoadResourcePacksEventImpl extends SessionLoadResourcePacksE
@Override
public boolean register(@NonNull ResourcePack resourcePack) {
String packID = resourcePack.manifest().header().uuid().toString();
UUID packID = resourcePack.manifest().header().uuid();
if (packs.containsValue(resourcePack) || packs.containsKey(packID)) {
return false;
}
packs.put(resourcePack.manifest().header().uuid().toString(), resourcePack);
packs.put(resourcePack.manifest().header().uuid(), resourcePack);
return true;
}
@Override
public boolean unregister(@NonNull UUID uuid) {
return packs.remove(uuid.toString()) != null;
return packs.remove(uuid) != null;
}
}

View file

@ -43,13 +43,14 @@ public class CameraDefinitions {
static {
CAMERA_PRESETS = List.of(
new CameraPreset(CameraPerspective.FIRST_PERSON.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null, null, null, OptionalBoolean.empty(), OptionalBoolean.empty()),
new CameraPreset(CameraPerspective.FREE.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null, null, null, OptionalBoolean.empty(), OptionalBoolean.empty()),
new CameraPreset(CameraPerspective.THIRD_PERSON.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null, null, null, OptionalBoolean.empty(), OptionalBoolean.empty()),
new CameraPreset(CameraPerspective.THIRD_PERSON_FRONT.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null, null, null, OptionalBoolean.empty(), OptionalBoolean.empty()),
new CameraPreset("geyser:free_audio", "minecraft:free", null, null, null, null, null, CameraAudioListener.PLAYER, OptionalBoolean.empty(), null, OptionalBoolean.of(false), null, null, null, OptionalBoolean.empty(), OptionalBoolean.empty()),
new CameraPreset("geyser:free_effects", "minecraft:free", null, null, null, null, null, CameraAudioListener.CAMERA, OptionalBoolean.empty(), null, OptionalBoolean.of(true), null, null, null, OptionalBoolean.empty(), OptionalBoolean.empty()),
new CameraPreset("geyser:free_audio_effects", "minecraft:free", null, null, null, null, null, CameraAudioListener.PLAYER, OptionalBoolean.empty(), null, OptionalBoolean.of(true), null, null, null, OptionalBoolean.empty(), OptionalBoolean.empty()));
CameraPreset.builder().identifier(CameraPerspective.FIRST_PERSON.id()).build(),
CameraPreset.builder().identifier(CameraPerspective.FREE.id()).build(),
CameraPreset.builder().identifier(CameraPerspective.THIRD_PERSON.id()).build(),
CameraPreset.builder().identifier(CameraPerspective.THIRD_PERSON_FRONT.id()).build(),
CameraPreset.builder().identifier("geyser:free_audio").parentPreset(CameraPerspective.FREE.id()).listener(CameraAudioListener.PLAYER).playEffect(OptionalBoolean.of(false)).build(),
CameraPreset.builder().identifier("geyser:free_effects").parentPreset(CameraPerspective.FREE.id()).listener(CameraAudioListener.CAMERA).playEffect(OptionalBoolean.of(true)).build(),
CameraPreset.builder().identifier("geyser:free_audio_effects").parentPreset(CameraPerspective.FREE.id()).listener(CameraAudioListener.PLAYER).playEffect(OptionalBoolean.of(true)).build()
);
SimpleDefinitionRegistry.Builder<NamedDefinition> builder = SimpleDefinitionRegistry.builder();
for (int i = 0; i < CAMERA_PRESETS.size(); i++) {

View file

@ -34,7 +34,9 @@ import org.geysermc.geyser.inventory.item.Potion;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
import org.geysermc.geyser.translator.item.CustomItemTranslator;
import org.geysermc.geyser.translator.item.ItemTranslator;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.PotionContents;
@ -68,6 +70,17 @@ public class PotionItem extends Item {
return super.translateToBedrock(session, count, components, mapping, mappings);
}
@Override
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
// Make custom effect information visible
PotionContents potionContents = components.get(DataComponentType.POTION_CONTENTS);
if (potionContents != null) {
ItemTranslator.addPotionEffectLore(potionContents, builder, session.locale());
}
super.translateComponentsToBedrock(session, components, builder);
}
@Override
public @NonNull GeyserItemStack translateToJava(GeyserSession session, @NonNull ItemData itemData, @NonNull ItemMapping mapping, @NonNull ItemMappings mappings) {
Potion potion = Potion.getByBedrockId(itemData.getDamage());

View file

@ -25,12 +25,15 @@
package org.geysermc.geyser.item.type;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.inventory.item.Potion;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
import org.geysermc.geyser.translator.item.ItemTranslator;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.PotionContents;
@ -57,4 +60,15 @@ public class TippedArrowItem extends ArrowItem {
}
return super.translateToBedrock(session, count, components, mapping, mappings);
}
@Override
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
// Make custom effect information visible
PotionContents potionContents = components.get(DataComponentType.POTION_CONTENTS);
if (potionContents != null) {
ItemTranslator.addPotionEffectLore(potionContents, builder, session.locale());
}
super.translateComponentsToBedrock(session, components, builder);
}
}

View file

@ -416,40 +416,6 @@ public class CollisionManager {
return BlockUtils.getCollision(blockId);
}
public boolean isOnGround() {
// Temporary until pre-1.21.30 support is dropped.
Vector3d bottomCenter = playerBoundingBox.getBottomCenter();
Vector3i groundPos = Vector3i.from(bottomCenter.getX(), bottomCenter.getY() - 1, bottomCenter.getZ());
BlockCollision collision = BlockUtils.getCollisionAt(session, groundPos);
if (collision == null) {
return false; // Probably air.
}
// Hack to not check below the player
playerBoundingBox.setSizeY(playerBoundingBox.getSizeY() - 0.001);
playerBoundingBox.setMiddleY(playerBoundingBox.getMiddleY() + 0.002);
boolean intersected = collision.checkIntersection(groundPos.getX(), groundPos.getY(), groundPos.getZ(), playerBoundingBox);
playerBoundingBox.setSizeY(playerBoundingBox.getSizeY() + 0.001);
playerBoundingBox.setMiddleY(playerBoundingBox.getMiddleY() - 0.002);
boolean result;
if (intersected) {
result = true;
} else {
// Hack to check slightly below the player
playerBoundingBox.setSizeY(playerBoundingBox.getSizeY() + 0.001);
playerBoundingBox.setMiddleY(playerBoundingBox.getMiddleY() - 0.002);
result = collision.checkIntersection(groundPos.getX(), groundPos.getY(), groundPos.getZ(), playerBoundingBox);
playerBoundingBox.setSizeY(playerBoundingBox.getSizeY() - 0.001);
playerBoundingBox.setMiddleY(playerBoundingBox.getMiddleY() + 0.002);
}
return result;
}
/**
* @return if the player is currently in a water block
*/

View file

@ -27,14 +27,9 @@ package org.geysermc.geyser.network;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.cloudburstmc.protocol.bedrock.codec.v671.Bedrock_v671;
import org.cloudburstmc.protocol.bedrock.codec.v685.Bedrock_v685;
import org.cloudburstmc.protocol.bedrock.codec.v686.Bedrock_v686;
import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712;
import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.mcprotocollib.protocol.codec.MinecraftCodec;
import org.geysermc.mcprotocollib.protocol.codec.PacketCodec;
@ -51,8 +46,9 @@ 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 BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v748.CODEC.toBuilder()
.minecraftVersion("1.21.44")
public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v765.CODEC.toBuilder()
.minecraftVersion("1.21.50")
.protocolVersion(766)
.build());
/**
@ -67,24 +63,10 @@ public final class GameProtocol {
private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC;
static {
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v671.CODEC.toBuilder()
.minecraftVersion("1.20.80/1.20.81")
.build()));
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v685.CODEC.toBuilder()
.minecraftVersion("1.21.0/1.21.1")
.build()));
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v686.CODEC.toBuilder()
.minecraftVersion("1.21.2/1.21.3")
.build()));
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v712.CODEC.toBuilder()
.minecraftVersion("1.21.20 - 1.21.23")
.build()));
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v729.CODEC.toBuilder()
.minecraftVersion("1.21.30/1.21.31")
.build()));
SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC.toBuilder()
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v748.CODEC.toBuilder()
.minecraftVersion("1.21.40 - 1.21.44")
.build());
.build()));
SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC);
}
/**
@ -103,22 +85,6 @@ public final class GameProtocol {
/* Bedrock convenience methods to gatekeep features and easily remove the check on version removal */
public static boolean isPre1_21_0(GeyserSession session) {
return session.getUpstream().getProtocolVersion() < Bedrock_v685.CODEC.getProtocolVersion();
}
public static boolean isPre1_21_2(GeyserSession session) {
return session.getUpstream().getProtocolVersion() < Bedrock_v686.CODEC.getProtocolVersion();
}
public static boolean isPre1_21_30(GeyserSession session) {
return session.getUpstream().getProtocolVersion() < Bedrock_v729.CODEC.getProtocolVersion();
}
public static boolean isPre1_21_40(GeyserSession session) {
return session.getUpstream().getProtocolVersion() < Bedrock_v748.CODEC.getProtocolVersion();
}
/**
* Gets the {@link PacketCodec} for Minecraft: Java Edition.
*

View file

@ -77,11 +77,12 @@ import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.OptionalInt;
import java.util.UUID;
public class UpstreamPacketHandler extends LoggingPacketHandler {
private boolean networkSettingsRequested = false;
private final Deque<String> packsToSent = new ArrayDeque<>();
private final Deque<String> packsToSend = new ArrayDeque<>();
private final CompressionStrategy compressionStrategy;
private SessionLoadResourcePacksEventImpl resourcePackLoadEvent;
@ -133,8 +134,6 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
}
session.getUpstream().getSession().setCodec(packetCodec);
// FIXME temporary until 1.20.80 is dropped
session.getPlayerEntity().resetAir();
return true;
}
@ -209,10 +208,12 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
PackCodec codec = pack.codec();
ResourcePackManifest.Header header = pack.manifest().header();
resourcePacksInfo.getResourcePackInfos().add(new ResourcePacksInfoPacket.Entry(
header.uuid().toString(), header.version().toString(), codec.size(), pack.contentKey(),
header.uuid(), header.version().toString(), codec.size(), pack.contentKey(),
"", header.uuid().toString(), false, false, false, ""));
}
resourcePacksInfo.setForcedToAccept(GeyserImpl.getInstance().getConfig().isForceResourcePacks());
resourcePacksInfo.setWorldTemplateId(UUID.randomUUID());
resourcePacksInfo.setWorldTemplateVersion("*");
session.sendUpstreamPacket(resourcePacksInfo);
GeyserLocale.loadGeyserLocale(session.locale());
@ -233,8 +234,8 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
break;
case SEND_PACKS:
packsToSent.addAll(packet.getPackIds());
sendPackDataInfo(packsToSent.pop());
packsToSend.addAll(packet.getPackIds());
sendPackDataInfo(packsToSend.pop());
break;
case HAVE_ALL_PACKS:
@ -311,7 +312,7 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
@Override
public PacketSignal handle(ResourcePackChunkRequestPacket packet) {
ResourcePackChunkDataPacket data = new ResourcePackChunkDataPacket();
ResourcePack pack = this.resourcePackLoadEvent.getPacks().get(packet.getPackId().toString());
ResourcePack pack = this.resourcePackLoadEvent.getPacks().get(packet.getPackId());
PackCodec codec = pack.codec();
data.setChunkIndex(packet.getChunkIndex());
@ -335,8 +336,8 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
session.sendUpstreamPacket(data);
// Check if it is the last chunk and send next pack in queue when available.
if (remainingSize <= GeyserResourcePack.CHUNK_SIZE && !packsToSent.isEmpty()) {
sendPackDataInfo(packsToSent.pop());
if (remainingSize <= GeyserResourcePack.CHUNK_SIZE && !packsToSend.isEmpty()) {
sendPackDataInfo(packsToSend.pop());
}
return PacketSignal.HANDLED;
@ -345,7 +346,8 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
private void sendPackDataInfo(String id) {
ResourcePackDataInfoPacket data = new ResourcePackDataInfoPacket();
String[] packID = id.split("_");
ResourcePack pack = this.resourcePackLoadEvent.getPacks().get(packID[0]);
UUID uuid = UUID.fromString(packID[0]);
ResourcePack pack = this.resourcePackLoadEvent.getPacks().get(uuid);
PackCodec codec = pack.codec();
ResourcePackManifest.Header header = pack.manifest().header();

View file

@ -70,6 +70,7 @@ import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* Holds all the common registries in Geyser.
@ -163,7 +164,7 @@ public final class Registries {
/**
* A mapped registry holding {@link ResourcePack}'s with the pack uuid as keys.
*/
public static final SimpleMappedDeferredRegistry<String, ResourcePack> RESOURCE_PACKS = SimpleMappedDeferredRegistry.create(GeyserImpl.getInstance().packDirectory(), RegistryLoaders.RESOURCE_PACKS);
public static final SimpleMappedDeferredRegistry<UUID, ResourcePack> RESOURCE_PACKS = SimpleMappedDeferredRegistry.create(GeyserImpl.getInstance().packDirectory(), RegistryLoaders.RESOURCE_PACKS);
/**
* A versioned registry holding most Bedrock tags, with the Java item list (sorted) being the key, and the tag name as the value.

View file

@ -45,6 +45,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -54,7 +55,7 @@ import java.util.zip.ZipFile;
/**
* Loads {@link ResourcePack}s within a {@link Path} directory, firing the {@link GeyserLoadResourcePacksEvent}.
*/
public class ResourcePackLoader implements RegistryLoader<Path, Map<String, ResourcePack>> {
public class ResourcePackLoader implements RegistryLoader<Path, Map<UUID, ResourcePack>> {
static final PathMatcher PACK_MATCHER = FileSystems.getDefault().getPathMatcher("glob:**.{zip,mcpack}");
@ -64,8 +65,8 @@ public class ResourcePackLoader implements RegistryLoader<Path, Map<String, Reso
* Loop through the packs directory and locate valid resource pack files
*/
@Override
public Map<String, ResourcePack> load(Path directory) {
Map<String, ResourcePack> packMap = new HashMap<>();
public Map<UUID, ResourcePack> load(Path directory) {
Map<UUID, ResourcePack> packMap = new HashMap<>();
if (!Files.exists(directory)) {
try {
@ -100,7 +101,7 @@ public class ResourcePackLoader implements RegistryLoader<Path, Map<String, Reso
for (Path path : event.resourcePacks()) {
try {
GeyserResourcePack pack = readPack(path);
packMap.put(pack.manifest().header().uuid().toString(), pack);
packMap.put(pack.manifest().header().uuid(), pack);
} catch (Exception e) {
e.printStackTrace();
}

View file

@ -44,11 +44,8 @@ import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
import org.cloudburstmc.nbt.NbtType;
import org.cloudburstmc.nbt.NbtUtils;
import org.cloudburstmc.protocol.bedrock.codec.v671.Bedrock_v671;
import org.cloudburstmc.protocol.bedrock.codec.v685.Bedrock_v685;
import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712;
import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData;
import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition;
import org.geysermc.geyser.GeyserImpl;
@ -69,6 +66,7 @@ import org.geysermc.geyser.registry.type.BlockMappings;
import org.geysermc.geyser.registry.type.GeyserBedrockBlock;
import org.geysermc.geyser.util.BlockUtils;
import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.InputStream;
@ -127,20 +125,8 @@ public final class BlockRegistryPopulator {
private static void registerBedrockBlocks() {
var blockMappers = ImmutableMap.<ObjectIntPair<String>, Remapper>builder()
.put(ObjectIntPair.of("1_20_80", Bedrock_v671.CODEC.getProtocolVersion()), Conversion685_671::remapBlock)
.put(ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()), Conversion712_685::remapBlock)
.put(ObjectIntPair.of("1_21_20", Bedrock_v712.CODEC.getProtocolVersion()), Conversion729_712::remapBlock)
.put(ObjectIntPair.of("1_21_30", Bedrock_v729.CODEC.getProtocolVersion()), tag -> tag)
.put(ObjectIntPair.of("1_21_40", Bedrock_v748.CODEC.getProtocolVersion()), tag -> {
final String name = tag.getString("name");
if (name.endsWith("_wood") && tag.getCompound("states").containsKey("stripped_bit")) {
NbtMapBuilder builder = tag.getCompound("states").toBuilder();
builder.remove("stripped_bit");
NbtMap states = builder.build();
return tag.toBuilder().putCompound("states", states).build();
}
return tag;
})
.put(ObjectIntPair.of("1_21_40", Bedrock_v748.CODEC.getProtocolVersion()), faultyStrippedWoodRemapper())
.put(ObjectIntPair.of("1_21_50", Bedrock_v765.CODEC.getProtocolVersion()), faultyStrippedWoodRemapper())
.build();
// We can keep this strong as nothing should be garbage collected
@ -427,6 +413,19 @@ public final class BlockRegistryPopulator {
}
}
private static @NotNull Remapper faultyStrippedWoodRemapper() {
return tag -> {
final String name = tag.getString("name");
if (name.endsWith("_wood") && tag.getCompound("states").containsKey("stripped_bit")) {
NbtMapBuilder builder = tag.getCompound("states").toBuilder();
builder.remove("stripped_bit");
NbtMap states = builder.build();
return tag.toBuilder().putCompound("states", states).build();
}
return tag;
};
}
private static void registerJavaBlocks() {
List<NbtMap> blocksNbt;
try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow("mappings/blocks.nbt")) {

View file

@ -1,220 +0,0 @@
/*
* Copyright (c) 2019-2024 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.registry.populator;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.item.type.Item;
import org.geysermc.geyser.registry.type.GeyserMappingItem;
import java.util.List;
import java.util.stream.Stream;
public class Conversion685_671 {
private static final List<String> NEW_CORAL_BLOCKS = List.of("minecraft:tube_coral_block", "minecraft:brain_coral_block", "minecraft:bubble_coral_block", "minecraft:fire_coral_block", "minecraft:horn_coral_block", "minecraft:dead_tube_coral_block", "minecraft:dead_brain_coral_block", "minecraft:dead_bubble_coral_block", "minecraft:dead_fire_coral_block", "minecraft:dead_horn_coral_block");
private static final List<String> NEW_DOUBLE_PLANTS = List.of("minecraft:sunflower", "minecraft:lilac", "minecraft:tall_grass", "minecraft:large_fern", "minecraft:rose_bush", "minecraft:peony");
private static final List<String> NEW_STONE_BLOCK_SLABS = List.of("minecraft:smooth_stone_slab", "minecraft:sandstone_slab", "minecraft:petrified_oak_slab", "minecraft:cobblestone_slab", "minecraft:brick_slab", "minecraft:stone_brick_slab", "minecraft:quartz_slab", "minecraft:nether_brick_slab");
private static final List<String> NEW_TALLGRASSES = List.of("minecraft:fern", "minecraft:short_grass");
private static final List<String> OMINOUS_BLOCKS = List.of("minecraft:trial_spawner", "minecraft:vault");
private static final List<String> NEW_BLOCKS = Stream.of(NEW_CORAL_BLOCKS, NEW_DOUBLE_PLANTS, NEW_STONE_BLOCK_SLABS, NEW_TALLGRASSES).flatMap(List::stream).toList();
private static final List<String> MODIFIED_BLOCKS = Stream.of(NEW_BLOCKS, OMINOUS_BLOCKS).flatMap(List::stream).toList();
private static final List<Item> NEW_MUSIC_DISCS = List.of(Items.MUSIC_DISC_CREATOR, Items.MUSIC_DISC_CREATOR_MUSIC_BOX, Items.MUSIC_DISC_PRECIPICE);
static GeyserMappingItem remapItem(Item item, GeyserMappingItem mapping) {
mapping = Conversion712_685.remapItem(item, mapping);
String identifier = mapping.getBedrockIdentifier();
if (NEW_MUSIC_DISCS.contains(item)) {
return mapping.withBedrockIdentifier("minecraft:music_disc_otherside");
}
if (item == Items.OMINOUS_TRIAL_KEY) {
return mapping.withBedrockIdentifier("minecraft:trial_key");
}
if (item == Items.OMINOUS_BOTTLE) {
return mapping.withBedrockIdentifier("minecraft:glass_bottle");
}
if (!NEW_BLOCKS.contains(identifier)) {
return mapping;
}
if (NEW_CORAL_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:tube_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(0); }
case "minecraft:brain_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(1); }
case "minecraft:bubble_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(2); }
case "minecraft:fire_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(3); }
case "minecraft:horn_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(4); }
case "minecraft:dead_tube_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(8); }
case "minecraft:dead_brain_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(9); }
case "minecraft:dead_bubble_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(10); }
case "minecraft:dead_fire_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(11); }
case "minecraft:dead_horn_coral_block" -> { return mapping.withBedrockIdentifier("minecraft:coral_block").withBedrockData(12); }
}
}
if (NEW_DOUBLE_PLANTS.contains(identifier)) {
switch (identifier) {
case "minecraft:sunflower" -> { return mapping.withBedrockIdentifier("minecraft:double_plant").withBedrockData(0); }
case "minecraft:lilac" -> { return mapping.withBedrockIdentifier("minecraft:double_plant").withBedrockData(1); }
case "minecraft:tall_grass" -> { return mapping.withBedrockIdentifier("minecraft:double_plant").withBedrockData(2); }
case "minecraft:large_fern" -> { return mapping.withBedrockIdentifier("minecraft:double_plant").withBedrockData(3); }
case "minecraft:rose_bush" -> { return mapping.withBedrockIdentifier("minecraft:double_plant").withBedrockData(4); }
case "minecraft:peony" -> { return mapping.withBedrockIdentifier("minecraft:double_plant").withBedrockData(5); }
}
}
if (NEW_STONE_BLOCK_SLABS.contains(identifier)) {
switch (identifier) {
case "minecraft:smooth_stone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(0); }
case "minecraft:sandstone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(1); }
case "minecraft:petrified_oak_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(2); }
case "minecraft:cobblestone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(3); }
case "minecraft:brick_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(4); }
case "minecraft:stone_brick_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(5); }
case "minecraft:quartz_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(6); }
case "minecraft:nether_brick_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab").withBedrockData(7); }
}
}
if (NEW_TALLGRASSES.contains(identifier)) {
switch (identifier) {
case "minecraft:short_grass" -> { return mapping.withBedrockIdentifier("minecraft:tallgrass").withBedrockData(1); }
case "minecraft:fern" -> { return mapping.withBedrockIdentifier("minecraft:tallgrass").withBedrockData(2); }
}
}
return mapping;
}
static NbtMap remapBlock(NbtMap tag) {
tag = Conversion712_685.remapBlock(tag);
final String name = tag.getString("name");
if (!MODIFIED_BLOCKS.contains(name)) {
return tag;
}
if (OMINOUS_BLOCKS.contains(name)) {
NbtMapBuilder builder = tag.getCompound("states").toBuilder();
builder.remove("ominous");
return tag.toBuilder().putCompound("states", builder.build()).build();
}
String replacement;
if (NEW_CORAL_BLOCKS.contains(name)) {
replacement = "minecraft:coral_block";
String coralColor;
boolean deadBit = name.startsWith("minecraft:dead_");
switch (name) {
case "minecraft:tube_coral_block", "minecraft:dead_tube_coral_block" -> coralColor = "blue";
case "minecraft:brain_coral_block", "minecraft:dead_brain_coral_block" -> coralColor = "pink";
case "minecraft:bubble_coral_block", "minecraft:dead_bubble_coral_block" -> coralColor = "purple";
case "minecraft:fire_coral_block", "minecraft:dead_fire_coral_block" -> coralColor = "yellow";
case "minecraft:horn_coral_block", "minecraft:dead_horn_coral_block" -> coralColor = "red";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("coral_color", coralColor)
.putBoolean("dead_bit", deadBit)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_DOUBLE_PLANTS.contains(name)) {
replacement = "minecraft:double_plant";
String doublePlantType;
switch (name) {
case "minecraft:sunflower" -> doublePlantType = "sunflower";
case "minecraft:lilac" -> doublePlantType = "syringa";
case "minecraft:tall_grass" -> doublePlantType = "grass";
case "minecraft:large_fern" -> doublePlantType = "fern";
case "minecraft:rose_bush" -> doublePlantType = "rose";
case "minecraft:peony" -> doublePlantType = "paeonia";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("double_plant_type", doublePlantType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_STONE_BLOCK_SLABS.contains(name)) {
replacement = "minecraft:stone_block_slab";
String stoneSlabType;
switch (name) {
case "minecraft:smooth_stone_slab" -> stoneSlabType = "smooth_stone";
case "minecraft:sandstone_slab" -> stoneSlabType = "sandstone";
case "minecraft:petrified_oak_slab" -> stoneSlabType = "wood";
case "minecraft:cobblestone_slab" -> stoneSlabType = "cobblestone";
case "minecraft:brick_slab" -> stoneSlabType = "brick";
case "minecraft:stone_brick_slab" -> stoneSlabType = "stone_brick";
case "minecraft:quartz_slab" -> stoneSlabType = "quartz";
case "minecraft:nether_brick_slab" -> stoneSlabType = "nether_brick";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("stone_slab_type", stoneSlabType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_TALLGRASSES.contains(name)) {
replacement = "minecraft:tallgrass";
String tallGrassType;
switch (name) {
case "minecraft:short_grass" -> tallGrassType = "tall";
case "minecraft:fern" -> tallGrassType = "fern";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("tall_grass_type", tallGrassType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
return tag;
}
}

View file

@ -1,439 +0,0 @@
package org.geysermc.geyser.registry.populator;
import org.cloudburstmc.nbt.NbtMap;
import org.geysermc.geyser.item.type.Item;
import org.geysermc.geyser.registry.type.GeyserMappingItem;
import java.util.List;
import java.util.stream.Stream;
public class Conversion712_685 {
private static final List<String> NEW_STONE_BLOCK_SLABS_2 = List.of("minecraft:prismarine_slab", "minecraft:dark_prismarine_slab", "minecraft:smooth_sandstone_slab", "minecraft:purpur_slab", "minecraft:red_nether_brick_slab", "minecraft:prismarine_brick_slab", "minecraft:mossy_cobblestone_slab", "minecraft:red_sandstone_slab");
private static final List<String> NEW_STONE_BLOCK_SLABS_3 = List.of("minecraft:smooth_red_sandstone_slab", "minecraft:polished_granite_slab", "minecraft:granite_slab", "minecraft:polished_diorite_slab", "minecraft:andesite_slab", "minecraft:polished_andesite_slab", "minecraft:diorite_slab", "minecraft:end_stone_brick_slab");
private static final List<String> NEW_STONE_BLOCK_SLABS_4 = List.of("minecraft:smooth_quartz_slab", "minecraft:cut_sandstone_slab", "minecraft:cut_red_sandstone_slab", "minecraft:normal_stone_slab", "minecraft:mossy_stone_brick_slab");
private static final List<String> NEW_DOUBLE_STONE_BLOCK_SLABS = List.of("minecraft:quartz_double_slab", "minecraft:petrified_oak_double_slab", "minecraft:stone_brick_double_slab", "minecraft:brick_double_slab", "minecraft:sandstone_double_slab", "minecraft:nether_brick_double_slab", "minecraft:cobblestone_double_slab", "minecraft:smooth_stone_double_slab");
private static final List<String> NEW_DOUBLE_STONE_BLOCK_SLABS_2 = List.of("minecraft:prismarine_double_slab", "minecraft:dark_prismarine_double_slab", "minecraft:smooth_sandstone_double_slab", "minecraft:purpur_double_slab", "minecraft:red_nether_brick_double_slab", "minecraft:prismarine_brick_double_slab", "minecraft:mossy_cobblestone_double_slab", "minecraft:red_sandstone_double_slab");
private static final List<String> NEW_DOUBLE_STONE_BLOCK_SLABS_3 = List.of("minecraft:smooth_red_sandstone_double_slab", "minecraft:polished_granite_double_slab", "minecraft:granite_double_slab", "minecraft:polished_diorite_double_slab", "minecraft:andesite_double_slab", "minecraft:polished_andesite_double_slab", "minecraft:diorite_double_slab", "minecraft:end_stone_brick_double_slab");
private static final List<String> NEW_DOUBLE_STONE_BLOCK_SLABS_4 = List.of("minecraft:smooth_quartz_double_slab", "minecraft:cut_sandstone_double_slab", "minecraft:cut_red_sandstone_double_slab", "minecraft:normal_stone_double_slab", "minecraft:mossy_stone_brick_double_slab");
private static final List<String> NEW_PRISMARINE_BLOCKS = List.of("minecraft:prismarine_bricks", "minecraft:dark_prismarine", "minecraft:prismarine");
private static final List<String> NEW_CORAL_FAN_HANGS = List.of("minecraft:tube_coral_wall_fan", "minecraft:brain_coral_wall_fan", "minecraft:dead_tube_coral_wall_fan", "minecraft:dead_brain_coral_wall_fan");
private static final List<String> NEW_CORAL_FAN_HANGS_2 = List.of("minecraft:bubble_coral_wall_fan", "minecraft:fire_coral_wall_fan", "minecraft:dead_bubble_coral_wall_fan", "minecraft:dead_fire_coral_wall_fan");
private static final List<String> NEW_CORAL_FAN_HANGS_3 = List.of("minecraft:horn_coral_wall_fan", "minecraft:dead_horn_coral_wall_fan");
private static final List<String> NEW_MONSTER_EGGS = List.of("minecraft:infested_cobblestone", "minecraft:infested_stone_bricks", "minecraft:infested_mossy_stone_bricks", "minecraft:infested_cracked_stone_bricks", "minecraft:infested_chiseled_stone_bricks", "minecraft:infested_stone");
private static final List<String> NEW_STONEBRICK_BLOCKS = List.of("minecraft:mossy_stone_bricks", "minecraft:cracked_stone_bricks", "minecraft:chiseled_stone_bricks", "minecraft:smooth_stone_bricks", "minecraft:stone_bricks");
private static final List<String> NEW_LIGHT_BLOCKS = List.of("minecraft:light_block_0", "minecraft:light_block_1", "minecraft:light_block_2", "minecraft:light_block_3", "minecraft:light_block_4", "minecraft:light_block_5", "minecraft:light_block_6", "minecraft:light_block_7", "minecraft:light_block_8", "minecraft:light_block_9", "minecraft:light_block_10", "minecraft:light_block_11", "minecraft:light_block_12", "minecraft:light_block_13", "minecraft:light_block_14", "minecraft:light_block_15");
private static final List<String> NEW_SANDSTONE_BLOCKS = List.of("minecraft:cut_sandstone", "minecraft:chiseled_sandstone", "minecraft:smooth_sandstone", "minecraft:sandstone");
private static final List<String> NEW_QUARTZ_BLOCKS = List.of("minecraft:chiseled_quartz_block", "minecraft:quartz_pillar", "minecraft:smooth_quartz", "minecraft:quartz_block");
private static final List<String> NEW_RED_SANDSTONE_BLOCKS = List.of("minecraft:cut_red_sandstone", "minecraft:chiseled_red_sandstone", "minecraft:smooth_red_sandstone", "minecraft:red_sandstone");
private static final List<String> NEW_SAND_BLOCKS = List.of("minecraft:red_sand", "minecraft:sand");
private static final List<String> NEW_DIRT_BLOCKS = List.of("minecraft:coarse_dirt", "minecraft:dirt");
private static final List<String> NEW_ANVILS = List.of("minecraft:damaged_anvil", "minecraft:chipped_anvil", "minecraft:deprecated_anvil", "minecraft:anvil");
private static final List<String> NEW_YELLOW_FLOWERS = List.of("minecraft:dandelion");
private static final List<String> NEW_BLOCKS = Stream.of(NEW_STONE_BLOCK_SLABS_2, NEW_STONE_BLOCK_SLABS_3, NEW_STONE_BLOCK_SLABS_4, NEW_DOUBLE_STONE_BLOCK_SLABS, NEW_DOUBLE_STONE_BLOCK_SLABS_2, NEW_DOUBLE_STONE_BLOCK_SLABS_3, NEW_DOUBLE_STONE_BLOCK_SLABS_4, NEW_PRISMARINE_BLOCKS, NEW_CORAL_FAN_HANGS, NEW_CORAL_FAN_HANGS_2, NEW_CORAL_FAN_HANGS_3, NEW_MONSTER_EGGS, NEW_STONEBRICK_BLOCKS, NEW_LIGHT_BLOCKS, NEW_SANDSTONE_BLOCKS, NEW_QUARTZ_BLOCKS, NEW_RED_SANDSTONE_BLOCKS, NEW_SAND_BLOCKS, NEW_DIRT_BLOCKS, NEW_ANVILS, NEW_YELLOW_FLOWERS).flatMap(List::stream).toList();
static GeyserMappingItem remapItem(Item item, GeyserMappingItem mapping) {
mapping = Conversion729_712.remapItem(item, mapping);
String identifier = mapping.getBedrockIdentifier();
if (!NEW_BLOCKS.contains(identifier)) {
return mapping;
}
if (identifier.equals("minecraft:coarse_dirt")) {
return mapping.withBedrockIdentifier("minecraft:dirt").withBedrockData(1);
}
if (identifier.equals("minecraft:dandelion")) {
return mapping.withBedrockIdentifier("minecraft:yellow_flower").withBedrockData(0);
}
if (identifier.equals("minecraft:red_sand")) {
return mapping.withBedrockIdentifier("minecraft:sand").withBedrockData(1);
}
if (NEW_PRISMARINE_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:prismarine" -> { return mapping.withBedrockIdentifier("minecraft:prismarine").withBedrockData(0); }
case "minecraft:dark_prismarine" -> { return mapping.withBedrockIdentifier("minecraft:prismarine").withBedrockData(1); }
case "minecraft:prismarine_bricks" -> { return mapping.withBedrockIdentifier("minecraft:prismarine").withBedrockData(2); }
}
}
if (NEW_SANDSTONE_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:sandstone" -> { return mapping.withBedrockIdentifier("minecraft:sandstone").withBedrockData(0); }
case "minecraft:chiseled_sandstone" -> { return mapping.withBedrockIdentifier("minecraft:sandstone").withBedrockData(1); }
case "minecraft:cut_sandstone" -> { return mapping.withBedrockIdentifier("minecraft:sandstone").withBedrockData(2); }
case "minecraft:smooth_sandstone" -> { return mapping.withBedrockIdentifier("minecraft:sandstone").withBedrockData(3); }
}
}
if (NEW_RED_SANDSTONE_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:red_sandstone" -> { return mapping.withBedrockIdentifier("minecraft:red_sandstone").withBedrockData(0); }
case "minecraft:chiseled_red_sandstone" -> { return mapping.withBedrockIdentifier("minecraft:red_sandstone").withBedrockData(1); }
case "minecraft:cut_red_sandstone" -> { return mapping.withBedrockIdentifier("minecraft:red_sandstone").withBedrockData(2); }
case "minecraft:smooth_red_sandstone" -> { return mapping.withBedrockIdentifier("minecraft:red_sandstone").withBedrockData(3); }
}
}
if (NEW_QUARTZ_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:quartz_block" -> { return mapping.withBedrockIdentifier("minecraft:quartz_block").withBedrockData(0); }
case "minecraft:chiseled_quartz_block" -> { return mapping.withBedrockIdentifier("minecraft:quartz_block").withBedrockData(1); }
case "minecraft:quartz_pillar" -> { return mapping.withBedrockIdentifier("minecraft:quartz_block").withBedrockData(2); }
case "minecraft:smooth_quartz" -> { return mapping.withBedrockIdentifier("minecraft:quartz_block").withBedrockData(3); }
}
}
if (NEW_STONE_BLOCK_SLABS_2.contains(identifier)) {
switch (identifier) {
case "minecraft:red_sandstone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(0); }
case "minecraft:purpur_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(1); }
case "minecraft:prismarine_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(2); }
case "minecraft:dark_prismarine_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(3); }
case "minecraft:prismarine_brick_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(4); }
case "minecraft:mossy_cobblestone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(5); }
case "minecraft:smooth_sandstone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(6); }
case "minecraft:red_nether_brick_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab2").withBedrockData(7); }
}
}
if (NEW_STONE_BLOCK_SLABS_3.contains(identifier)) {
switch (identifier) {
case "minecraft:end_stone_brick_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(0); }
case "minecraft:smooth_red_sandstone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(1); }
case "minecraft:polished_andesite_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(2); }
case "minecraft:andesite_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(3); }
case "minecraft:diorite_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(4); }
case "minecraft:polished_diorite_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(5); }
case "minecraft:granite_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(6); }
case "minecraft:polished_granite_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab3").withBedrockData(7); }
}
}
if (NEW_STONE_BLOCK_SLABS_4.contains(identifier)) {
switch (identifier) {
case "minecraft:mossy_stone_brick_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab4").withBedrockData(0); }
case "minecraft:smooth_quartz_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab4").withBedrockData(1); }
case "minecraft:normal_stone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab4").withBedrockData(2); }
case "minecraft:cut_sandstone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab4").withBedrockData(3); }
case "minecraft:cut_red_sandstone_slab" -> { return mapping.withBedrockIdentifier("minecraft:stone_block_slab4").withBedrockData(4); }
}
}
if (NEW_MONSTER_EGGS.contains(identifier)) {
switch (identifier) {
case "minecraft:infested_stone" -> { return mapping.withBedrockIdentifier("minecraft:monster_egg").withBedrockData(0); }
case "minecraft:infested_cobblestone" -> { return mapping.withBedrockIdentifier("minecraft:monster_egg").withBedrockData(1); }
case "minecraft:infested_stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:monster_egg").withBedrockData(2); }
case "minecraft:infested_mossy_stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:monster_egg").withBedrockData(3); }
case "minecraft:infested_cracked_stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:monster_egg").withBedrockData(4); }
case "minecraft:infested_chiseled_stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:monster_egg").withBedrockData(5); }
}
}
if (NEW_STONEBRICK_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:stonebrick").withBedrockData(0); }
case "minecraft:mossy_stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:stonebrick").withBedrockData(1); }
case "minecraft:cracked_stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:stonebrick").withBedrockData(2); }
case "minecraft:chiseled_stone_bricks" -> { return mapping.withBedrockIdentifier("minecraft:stonebrick").withBedrockData(3); }
}
}
if (NEW_ANVILS.contains(identifier)) {
switch (identifier) {
case "minecraft:anvil" -> { return mapping.withBedrockIdentifier("minecraft:anvil").withBedrockData(0); }
case "minecraft:chipped_anvil" -> { return mapping.withBedrockIdentifier("minecraft:anvil").withBedrockData(4); }
case "minecraft:damaged_anvil" -> { return mapping.withBedrockIdentifier("minecraft:anvil").withBedrockData(8); }
}
}
return mapping;
}
static NbtMap remapBlock(NbtMap tag) {
tag = Conversion729_712.remapBlock(tag);
final String name = tag.getString("name");
if (!NEW_BLOCKS.contains(name)) {
return tag;
}
String replacement;
if (NEW_DOUBLE_STONE_BLOCK_SLABS.contains(name)) {
replacement = "minecraft:double_stone_block_slab";
String stoneSlabType;
switch (name) {
case "minecraft:quartz_double_slab" -> stoneSlabType = "quartz";
case "minecraft:petrified_oak_double_slab" -> stoneSlabType = "wood";
case "minecraft:stone_brick_double_slab" -> stoneSlabType = "stone_brick";
case "minecraft:brick_double_slab" -> stoneSlabType = "brick";
case "minecraft:sandstone_double_slab" -> stoneSlabType = "sandstone";
case "minecraft:nether_brick_double_slab" -> stoneSlabType = "nether_brick";
case "minecraft:cobblestone_double_slab" -> stoneSlabType = "cobblestone";
case "minecraft:smooth_stone_double_slab" -> stoneSlabType = "smooth_stone";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("stone_slab_type", stoneSlabType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_STONE_BLOCK_SLABS_2.contains(name) || NEW_DOUBLE_STONE_BLOCK_SLABS_2.contains(name)) {
replacement = NEW_STONE_BLOCK_SLABS_2.contains(name) ? "minecraft:stone_block_slab2" : "minecraft:double_stone_block_slab2";
String stoneSlabType2;
switch (name) {
case "minecraft:prismarine_slab", "minecraft:prismarine_double_slab" -> stoneSlabType2 = "prismarine_rough";
case "minecraft:dark_prismarine_slab", "minecraft:dark_prismarine_double_slab" -> stoneSlabType2 = "prismarine_dark";
case "minecraft:smooth_sandstone_slab", "minecraft:smooth_sandstone_double_slab" -> stoneSlabType2 = "smooth_sandstone";
case "minecraft:purpur_slab", "minecraft:purpur_double_slab" -> stoneSlabType2 = "purpur";
case "minecraft:red_nether_brick_slab", "minecraft:red_nether_brick_double_slab" -> stoneSlabType2 = "red_nether_brick";
case "minecraft:prismarine_brick_slab", "minecraft:prismarine_brick_double_slab" -> stoneSlabType2 = "prismarine_brick";
case "minecraft:mossy_cobblestone_slab", "minecraft:mossy_cobblestone_double_slab" -> stoneSlabType2 = "mossy_cobblestone";
case "minecraft:red_sandstone_slab", "minecraft:red_sandstone_double_slab" -> stoneSlabType2 = "red_sandstone";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("stone_slab_type_2", stoneSlabType2)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_STONE_BLOCK_SLABS_3.contains(name) || NEW_DOUBLE_STONE_BLOCK_SLABS_3.contains(name)) {
replacement = NEW_STONE_BLOCK_SLABS_3.contains(name) ? "minecraft:stone_block_slab3" : "minecraft:double_stone_block_slab3";
String stoneSlabType3;
switch (name) {
case "minecraft:smooth_red_sandstone_slab", "minecraft:smooth_red_sandstone_double_slab" -> stoneSlabType3 = "smooth_red_sandstone";
case "minecraft:polished_granite_slab", "minecraft:polished_granite_double_slab" -> stoneSlabType3 = "polished_granite";
case "minecraft:granite_slab", "minecraft:granite_double_slab" -> stoneSlabType3 = "granite";
case "minecraft:polished_diorite_slab", "minecraft:polished_diorite_double_slab" -> stoneSlabType3 = "polished_diorite";
case "minecraft:andesite_slab", "minecraft:andesite_double_slab" -> stoneSlabType3 = "andesite";
case "minecraft:polished_andesite_slab", "minecraft:polished_andesite_double_slab" -> stoneSlabType3 = "polished_andesite";
case "minecraft:diorite_slab", "minecraft:diorite_double_slab" -> stoneSlabType3 = "diorite";
case "minecraft:end_stone_brick_slab", "minecraft:end_stone_brick_double_slab" -> stoneSlabType3 = "end_stone_brick";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("stone_slab_type_3", stoneSlabType3)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_STONE_BLOCK_SLABS_4.contains(name) || NEW_DOUBLE_STONE_BLOCK_SLABS_4.contains(name)) {
replacement = NEW_STONE_BLOCK_SLABS_4.contains(name) ? "minecraft:stone_block_slab4" : "minecraft:double_stone_block_slab4";
String stoneSlabType4;
switch (name) {
case "minecraft:smooth_quartz_slab", "minecraft:smooth_quartz_double_slab" -> stoneSlabType4 = "smooth_quartz";
case "minecraft:cut_sandstone_slab", "minecraft:cut_sandstone_double_slab" -> stoneSlabType4 = "cut_sandstone";
case "minecraft:cut_red_sandstone_slab", "minecraft:cut_red_sandstone_double_slab" -> stoneSlabType4 = "cut_red_sandstone";
case "minecraft:normal_stone_slab", "minecraft:normal_stone_double_slab" -> stoneSlabType4 = "stone";
case "minecraft:mossy_stone_brick_slab", "minecraft:mossy_stone_brick_double_slab" -> stoneSlabType4 = "mossy_stone_brick";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("stone_slab_type_4", stoneSlabType4)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_PRISMARINE_BLOCKS.contains(name)) {
replacement = "minecraft:prismarine";
String prismarineBlockType;
switch (name) {
case "minecraft:prismarine_bricks" -> prismarineBlockType = "bricks";
case "minecraft:dark_prismarine" -> prismarineBlockType = "dark";
case "minecraft:prismarine" -> prismarineBlockType = "default";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("prismarine_block_type", prismarineBlockType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_CORAL_FAN_HANGS.contains(name) || NEW_CORAL_FAN_HANGS_2.contains(name) || NEW_CORAL_FAN_HANGS_3.contains(name)) {
replacement = NEW_CORAL_FAN_HANGS.contains(name) ? "minecraft:coral_fan_hang" : NEW_CORAL_FAN_HANGS_2.contains(name) ? "minecraft:coral_fan_hang2" : "minecraft:coral_fan_hang3";
boolean deadBit = name.startsWith("minecraft:dead_");
boolean coralHangTypeBit = name.contains("brain") || name.contains("fire");
NbtMap states = tag.getCompound("states")
.toBuilder()
.putBoolean("coral_hang_type_bit", coralHangTypeBit)
.putBoolean("dead_bit", deadBit)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_MONSTER_EGGS.contains(name)) {
replacement = "minecraft:monster_egg";
String monsterEggStoneType;
switch (name) {
case "minecraft:infested_cobblestone" -> monsterEggStoneType = "cobblestone";
case "minecraft:infested_stone_bricks" -> monsterEggStoneType = "stone_brick";
case "minecraft:infested_mossy_stone_bricks" -> monsterEggStoneType = "mossy_stone_brick";
case "minecraft:infested_cracked_stone_bricks" -> monsterEggStoneType = "cracked_stone_brick";
case "minecraft:infested_chiseled_stone_bricks" -> monsterEggStoneType = "chiseled_stone_brick";
case "minecraft:infested_stone" -> monsterEggStoneType = "stone";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("monster_egg_stone_type", monsterEggStoneType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_STONEBRICK_BLOCKS.contains(name)) {
replacement = "minecraft:stonebrick";
String stoneBrickType;
switch (name) {
case "minecraft:mossy_stone_bricks" -> stoneBrickType = "mossy";
case "minecraft:cracked_stone_bricks" -> stoneBrickType = "cracked";
case "minecraft:chiseled_stone_bricks" -> stoneBrickType = "chiseled";
case "minecraft:smooth_stone_bricks" -> stoneBrickType = "smooth";
case "minecraft:stone_bricks" -> stoneBrickType = "default";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("stone_brick_type", stoneBrickType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_LIGHT_BLOCKS.contains(name)) {
replacement = "minecraft:light_block";
int blockLightLevel = Integer.parseInt(name.split("_")[2]);
NbtMap states = tag.getCompound("states")
.toBuilder()
.putInt("block_light_level", blockLightLevel)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_SANDSTONE_BLOCKS.contains(name) || NEW_RED_SANDSTONE_BLOCKS.contains(name)) {
replacement = NEW_SANDSTONE_BLOCKS.contains(name) ? "minecraft:sandstone" : "minecraft:red_sandstone";
String sandStoneType;
switch (name) {
case "minecraft:cut_sandstone", "minecraft:cut_red_sandstone" -> sandStoneType = "cut";
case "minecraft:chiseled_sandstone", "minecraft:chiseled_red_sandstone" -> sandStoneType = "heiroglyphs";
case "minecraft:smooth_sandstone", "minecraft:smooth_red_sandstone" -> sandStoneType = "smooth";
case "minecraft:sandstone", "minecraft:red_sandstone" -> sandStoneType = "default";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("sand_stone_type", sandStoneType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_QUARTZ_BLOCKS.contains(name)) {
replacement = "minecraft:quartz_block";
String chiselType;
switch (name) {
case "minecraft:chiseled_quartz_block" -> chiselType = "chiseled";
case "minecraft:quartz_pillar" -> chiselType = "lines";
case "minecraft:smooth_quartz" -> chiselType = "smooth";
case "minecraft:quartz_block" -> chiselType = "default";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("chisel_type", chiselType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_SAND_BLOCKS.contains(name)) {
replacement = "minecraft:sand";
String sandType = name.equals("minecraft:red_sand") ? "red" : "normal";
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("sand_type", sandType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_DIRT_BLOCKS.contains(name)) {
replacement = "minecraft:dirt";
String dirtType = name.equals("minecraft:coarse_dirt") ? "coarse" : "normal";
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("dirt_type", dirtType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_ANVILS.contains(name)) {
replacement = "minecraft:anvil";
String damage;
switch (name) {
case "minecraft:damaged_anvil" -> damage = "broken";
case "minecraft:chipped_anvil" -> damage = "slightly_damaged";
case "minecraft:deprecated_anvil" -> damage = "very_damaged";
case "minecraft:anvil" -> damage = "undamaged";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("damage", damage)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_YELLOW_FLOWERS.contains(name)) {
replacement = "minecraft:yellow_flower";
return tag.toBuilder().putString("name", replacement).build();
}
return tag;
}
}

View file

@ -1,152 +0,0 @@
package org.geysermc.geyser.registry.populator;
import org.cloudburstmc.nbt.NbtMap;
import org.geysermc.geyser.item.type.Item;
import org.geysermc.geyser.registry.type.GeyserMappingItem;
import java.util.List;
import java.util.stream.Stream;
public class Conversion729_712 {
private static final List<String> NEW_PURPUR_BLOCKS = List.of("minecraft:purpur_block", "minecraft:purpur_pillar");
private static final List<String> NEW_WALL_BLOCKS = List.of("minecraft:cobblestone_wall", "minecraft:mossy_cobblestone_wall", "minecraft:granite_wall", "minecraft:diorite_wall", "minecraft:andesite_wall", "minecraft:sandstone_wall", "minecraft:brick_wall", "minecraft:stone_brick_wall", "minecraft:mossy_stone_brick_wall", "minecraft:nether_brick_wall", "minecraft:end_stone_brick_wall", "minecraft:prismarine_wall", "minecraft:red_sandstone_wall", "minecraft:red_nether_brick_wall");
private static final List<String> NEW_SPONGE_BLOCKS = List.of("minecraft:sponge", "minecraft:wet_sponge");
private static final List<String> NEW_TNT_BLOCKS = List.of("minecraft:tnt", "minecraft:underwater_tnt");
private static final List<String> STRUCTURE_VOID = List.of("minecraft:structure_void");
private static final List<String> NEW_BLOCKS = Stream.of(NEW_PURPUR_BLOCKS, NEW_WALL_BLOCKS, NEW_SPONGE_BLOCKS, NEW_TNT_BLOCKS, STRUCTURE_VOID).flatMap(List::stream).toList();
static GeyserMappingItem remapItem(Item item, GeyserMappingItem mapping) {
mapping = Conversion748_729.remapItem(item, mapping);
String identifier = mapping.getBedrockIdentifier();
if (!NEW_BLOCKS.contains(identifier)) {
return mapping;
}
if (identifier.equals("minecraft:underwater_tnt")) {
return mapping.withBedrockIdentifier("minecraft:tnt").withBedrockData(1);
}
if (NEW_PURPUR_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:purpur_block" -> { return mapping.withBedrockIdentifier("minecraft:purpur_block").withBedrockData(0); }
case "minecraft:purpur_pillar" -> { return mapping.withBedrockIdentifier("minecraft:purpur_block").withBedrockData(1); }
}
}
if (NEW_WALL_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:cobblestone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(0); }
case "minecraft:mossy_cobblestone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(1); }
case "minecraft:granite_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(2); }
case "minecraft:diorite_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(3); }
case "minecraft:andesite_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(4); }
case "minecraft:sandstone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(5); }
case "minecraft:brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(6); }
case "minecraft:stone_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(7); }
case "minecraft:mossy_stone_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(8); }
case "minecraft:nether_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(9); }
case "minecraft:end_stone_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(10); }
case "minecraft:prismarine_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(11); }
case "minecraft:red_sandstone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(12); }
case "minecraft:red_nether_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(13); }
}
}
if (NEW_SPONGE_BLOCKS.contains(identifier)) {
switch (identifier) {
case "minecraft:sponge" -> { return mapping.withBedrockIdentifier("minecraft:sponge").withBedrockData(0); }
case "minecraft:wet_sponge" -> { return mapping.withBedrockIdentifier("minecraft:sponge").withBedrockData(1); }
}
}
return mapping;
}
static NbtMap remapBlock(NbtMap tag) {
final String name = tag.getString("name");
if (!NEW_BLOCKS.contains(name)) {
return tag;
}
String replacement;
if (NEW_PURPUR_BLOCKS.contains(name)) {
replacement = "minecraft:purpur_block";
String purpurType = name.equals("minecraft:purpur_pillar") ? "lines" : "default";
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("chisel_type", purpurType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_WALL_BLOCKS.contains(name)) {
replacement = "minecraft:cobblestone_wall";
String wallType;
switch (name) {
case "minecraft:cobblestone_wall" -> wallType = "cobblestone";
case "minecraft:mossy_cobblestone_wall" -> wallType = "mossy_cobblestone";
case "minecraft:granite_wall" -> wallType = "granite";
case "minecraft:diorite_wall" -> wallType = "diorite";
case "minecraft:andesite_wall" -> wallType = "andesite";
case "minecraft:sandstone_wall" -> wallType = "sandstone";
case "minecraft:brick_wall" -> wallType = "brick";
case "minecraft:stone_brick_wall" -> wallType = "stone_brick";
case "minecraft:mossy_stone_brick_wall" -> wallType = "mossy_stone_brick";
case "minecraft:nether_brick_wall" -> wallType = "nether_brick";
case "minecraft:end_stone_brick_wall" -> wallType = "end_brick";
case "minecraft:prismarine_wall" -> wallType = "prismarine";
case "minecraft:red_sandstone_wall" -> wallType = "red_sandstone";
case "minecraft:red_nether_brick_wall" -> wallType = "red_nether_brick";
default -> throw new IllegalStateException("Unexpected value: " + name);
}
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("wall_block_type", wallType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_SPONGE_BLOCKS.contains(name)) {
replacement = "minecraft:sponge";
String spongeType = name.equals("minecraft:wet_sponge") ? "wet" : "dry";
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("sponge_type", spongeType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (NEW_TNT_BLOCKS.contains(name)) {
replacement = "minecraft:tnt";
byte tntType = (byte) (name.equals("minecraft:underwater_tnt") ? 1 : 0);
NbtMap states = tag.getCompound("states")
.toBuilder()
.putByte("allow_underwater_bit", tntType)
.build();
return tag.toBuilder().putString("name", replacement).putCompound("states", states).build();
}
if (STRUCTURE_VOID.contains(name)) {
NbtMap states = tag.getCompound("states")
.toBuilder()
.putString("structure_void_type", "air")
.build();
return tag.toBuilder().putCompound("states", states).build();
}
return tag;
}
}

View file

@ -37,6 +37,7 @@ import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.type.BlockMappings;
import org.geysermc.geyser.registry.type.GeyserBedrockBlock;
import org.geysermc.geyser.registry.type.GeyserMappingItem;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@ -50,12 +51,10 @@ import java.util.function.Consumer;
public class CreativeItemRegistryPopulator {
private static final List<BiPredicate<String, Integer>> JAVA_ONLY_ITEM_FILTER = List.of(
// Bedrock-only as its own item
(identifier, data) -> identifier.equals("minecraft:empty_map") && data == 2,
// Bedrock-only banner patterns
(identifier, data) -> identifier.equals("minecraft:bordure_indented_banner_pattern") || identifier.equals("minecraft:field_masoned_banner_pattern")
(identifier, data) -> identifier.equals("minecraft:empty_map") && data == 2
);
static void populate(ItemRegistryPopulator.PaletteVersion palette, Map<String, ItemDefinition> definitions, Consumer<ItemData.Builder> itemConsumer) {
static void populate(ItemRegistryPopulator.PaletteVersion palette, Map<String, ItemDefinition> definitions, Map<String, GeyserMappingItem> items, Consumer<ItemData.Builder> itemConsumer) {
GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap();
// Load creative items
@ -68,7 +67,7 @@ public class CreativeItemRegistryPopulator {
BlockMappings blockMappings = BlockRegistries.BLOCKS.forVersion(palette.protocolVersion());
for (JsonNode itemNode : creativeItemEntries) {
ItemData.Builder itemBuilder = createItemData(itemNode, blockMappings, definitions);
ItemData.Builder itemBuilder = createItemData(itemNode, items, blockMappings, definitions);
if (itemBuilder == null) {
continue;
}
@ -77,7 +76,7 @@ public class CreativeItemRegistryPopulator {
}
}
private static ItemData.@Nullable Builder createItemData(JsonNode itemNode, BlockMappings blockMappings, Map<String, ItemDefinition> definitions) {
private static ItemData.@Nullable Builder createItemData(JsonNode itemNode, Map<String, GeyserMappingItem> items, BlockMappings blockMappings, Map<String, ItemDefinition> definitions) {
int count = 1;
int damage = 0;
NbtMap tag = null;
@ -89,6 +88,23 @@ public class CreativeItemRegistryPopulator {
}
}
// Attempt to remove items that do not exist in Java (1.21.50 has 1.21.4 items, that don't exist on 1.21.2)
// we still add the lodestone compass - we're going to translate it.
if (!items.containsKey(identifier) && !identifier.equals("minecraft:lodestone_compass")) {
// bedrock identifier not found, let's make sure it's not just different
boolean found = false;
for (var mapping : items.values()) {
if (mapping.getBedrockIdentifier().equals(identifier)) {
found = true;
break;
}
}
if (!found) {
return null;
}
}
JsonNode damageNode = itemNode.get("damage");
if (damageNode != null) {
damage = damageNode.asInt();

View file

@ -45,11 +45,8 @@ import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
import org.cloudburstmc.nbt.NbtType;
import org.cloudburstmc.nbt.NbtUtils;
import org.cloudburstmc.protocol.bedrock.codec.v671.Bedrock_v671;
import org.cloudburstmc.protocol.bedrock.codec.v685.Bedrock_v685;
import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712;
import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition;
import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition;
import org.cloudburstmc.protocol.bedrock.data.definitions.SimpleItemDefinition;
@ -85,7 +82,6 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -111,18 +107,9 @@ public class ItemRegistryPopulator {
}
public static void populate() {
List<Item> bundles = List.of(Items.BUNDLE, Items.BLACK_BUNDLE, Items.BLUE_BUNDLE, Items.BROWN_BUNDLE, Items.CYAN_BUNDLE, Items.GRAY_BUNDLE,
Items.GREEN_BUNDLE, Items.LIGHT_BLUE_BUNDLE, Items.LIGHT_GRAY_BUNDLE, Items.LIME_BUNDLE, Items.MAGENTA_BUNDLE, Items.ORANGE_BUNDLE, Items.RED_BUNDLE,
Items.PINK_BUNDLE, Items.PURPLE_BUNDLE, Items.WHITE_BUNDLE, Items.YELLOW_BUNDLE);
Map<Item, Item> pre1_21_2Items = new HashMap<>();
bundles.forEach(bundle -> pre1_21_2Items.put(bundle, Items.SHULKER_SHELL));
List<PaletteVersion> paletteVersions = new ArrayList<>(3);
paletteVersions.add(new PaletteVersion("1_20_80", Bedrock_v671.CODEC.getProtocolVersion(), pre1_21_2Items, Conversion685_671::remapItem));
paletteVersions.add(new PaletteVersion("1_21_0", Bedrock_v685.CODEC.getProtocolVersion(), pre1_21_2Items, Conversion712_685::remapItem));
paletteVersions.add(new PaletteVersion("1_21_20", Bedrock_v712.CODEC.getProtocolVersion(), pre1_21_2Items, Conversion729_712::remapItem));
paletteVersions.add(new PaletteVersion("1_21_30", Bedrock_v729.CODEC.getProtocolVersion(), pre1_21_2Items, Conversion748_729::remapItem));
List<PaletteVersion> paletteVersions = new ArrayList<>(2);
paletteVersions.add(new PaletteVersion("1_21_40", Bedrock_v748.CODEC.getProtocolVersion()));
paletteVersions.add(new PaletteVersion("1_21_50", Bedrock_v765.CODEC.getProtocolVersion()));
GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap();
@ -207,7 +194,7 @@ public class ItemRegistryPopulator {
noBlockDefinitions.add("minecraft:structure_void");
AtomicInteger creativeNetId = new AtomicInteger();
CreativeItemRegistryPopulator.populate(palette, definitions, itemBuilder -> {
CreativeItemRegistryPopulator.populate(palette, definitions, items, itemBuilder -> {
ItemData item = itemBuilder.netId(creativeNetId.incrementAndGet()).build();
creativeItems.add(item);

View file

@ -33,11 +33,8 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
import it.unimi.dsi.fastutil.objects.ObjectIntPair;
import org.cloudburstmc.protocol.bedrock.codec.v671.Bedrock_v671;
import org.cloudburstmc.protocol.bedrock.codec.v685.Bedrock_v685;
import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712;
import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.item.type.Item;
@ -70,11 +67,8 @@ public final class TagRegistryPopulator {
};
List<ObjectIntPair<String>> paletteVersions = List.of(
ObjectIntPair.of("1_20_80", Bedrock_v671.CODEC.getProtocolVersion()),
ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()),
ObjectIntPair.of("1_21_20", Bedrock_v712.CODEC.getProtocolVersion()),
ObjectIntPair.of("1_21_30", Bedrock_v729.CODEC.getProtocolVersion()),
ObjectIntPair.of("1_21_40", Bedrock_v748.CODEC.getProtocolVersion())
ObjectIntPair.of("1_21_40", Bedrock_v748.CODEC.getProtocolVersion()),
ObjectIntPair.of("1_21_50", Bedrock_v765.CODEC.getProtocolVersion())
);
Type type = new TypeToken<Map<String, List<String>>>() {}.getType();

View file

@ -2246,9 +2246,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
@Override
public void closeForm() {
if (!GameProtocol.isPre1_21_2(this)) {
sendUpstreamPacket(new ClientboundCloseFormPacket());
}
sendUpstreamPacket(new ClientboundCloseFormPacket());
}
public void addCommandEnum(String name, String enums) {

View file

@ -260,9 +260,9 @@ public abstract class InventoryTranslator {
}
}
if (shouldRejectItemPlace(session, inventory, transferAction.getSource().getContainer(),
if (shouldRejectItemPlace(session, inventory, transferAction.getSource().getContainerName().getContainer(),
isSourceCursor ? -1 : sourceSlot,
transferAction.getDestination().getContainer(), isDestCursor ? -1 : destSlot)) {
transferAction.getDestination().getContainerName().getContainer(), isDestCursor ? -1 : destSlot)) {
// This item would not be here in Java
return rejectRequest(request, false);
}
@ -410,14 +410,14 @@ public abstract class InventoryTranslator {
boolean isSourceCursor = isCursor(source);
boolean isDestCursor = isCursor(destination);
if (shouldRejectItemPlace(session, inventory, source.getContainer(),
if (shouldRejectItemPlace(session, inventory, source.getContainerName().getContainer(),
isSourceCursor ? -1 : sourceSlot,
destination.getContainer(), isDestCursor ? -1 : destSlot)) {
destination.getContainerName().getContainer(), isDestCursor ? -1 : destSlot)) {
// This item would not be here in Java
return rejectRequest(request, false);
}
if (!isSourceCursor && destination.getContainer() == ContainerSlotType.HOTBAR || destination.getContainer() == ContainerSlotType.HOTBAR_AND_INVENTORY) {
if (!isSourceCursor && destination.getContainerName().getContainer() == ContainerSlotType.HOTBAR || destination.getContainerName().getContainer() == ContainerSlotType.HOTBAR_AND_INVENTORY) {
// Tell the server we're pressing one of the hotbar keys to save clicks
Click click = InventoryUtils.getClickForHotbarSwap(destination.getSlot());
if (click != null) {
@ -586,7 +586,7 @@ public abstract class InventoryTranslator {
}
craftState = CraftState.TRANSFER;
if (transferAction.getSource().getContainer() != ContainerSlotType.CREATED_OUTPUT) {
if (transferAction.getSource().getContainerName().getContainer() != ContainerSlotType.CREATED_OUTPUT) {
return rejectRequest(request);
}
if (transferAction.getCount() <= 0) {
@ -779,7 +779,7 @@ public abstract class InventoryTranslator {
}
craftState = CraftState.TRANSFER;
if (transferAction.getSource().getContainer() != ContainerSlotType.CREATED_OUTPUT) {
if (transferAction.getSource().getContainerName().getContainer() != ContainerSlotType.CREATED_OUTPUT) {
return rejectRequest(request);
}
if (transferAction.getCount() <= 0) {
@ -1024,15 +1024,15 @@ public abstract class InventoryTranslator {
durability = ItemUtils.getCorrectBedrockDurability(itemStack.asItem(), damage);
}
itemEntry = new ItemStackResponseSlot((byte) bedrockSlot, (byte) bedrockSlot, (byte) itemStack.getAmount(), itemStack.getNetId(), "", durability);
itemEntry = new ItemStackResponseSlot((byte) bedrockSlot, (byte) bedrockSlot, (byte) itemStack.getAmount(), itemStack.getNetId(), "", durability, "");
} else {
itemEntry = new ItemStackResponseSlot((byte) bedrockSlot, (byte) bedrockSlot, (byte) 0, 0, "", 0);
itemEntry = new ItemStackResponseSlot((byte) bedrockSlot, (byte) bedrockSlot, (byte) 0, 0, "", 0, "");
}
return itemEntry;
}
protected static boolean isCursor(ItemStackRequestSlotData slotInfoData) {
return slotInfoData.getContainer() == ContainerSlotType.CURSOR;
return slotInfoData.getContainerName().getContainer() == ContainerSlotType.CURSOR;
}
/**

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.translator.item;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TranslatableComponent;
import net.kyori.adventure.text.format.NamedTextColor;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -54,6 +55,7 @@ import org.geysermc.geyser.util.InventoryUtils;
import org.geysermc.mcprotocollib.auth.GameProfile;
import org.geysermc.mcprotocollib.auth.GameProfile.Texture;
import org.geysermc.mcprotocollib.auth.GameProfile.TextureType;
import org.geysermc.mcprotocollib.protocol.data.game.entity.Effect;
import org.geysermc.mcprotocollib.protocol.data.game.entity.attribute.AttributeType;
import org.geysermc.mcprotocollib.protocol.data.game.entity.attribute.ModifierOperation;
import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack;
@ -62,12 +64,16 @@ import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponen
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.ItemAttributeModifiers;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.MobEffectDetails;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.MobEffectInstance;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.PotionContents;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public final class ItemTranslator {
@ -303,6 +309,65 @@ public final class ItemTranslator {
return MessageTranslator.convertMessage(attributeComponent, language);
}
private static final List<Effect> negativeEffectList = List.of(
Effect.SLOWNESS,
Effect.MINING_FATIGUE,
Effect.INSTANT_DAMAGE,
Effect.NAUSEA,
Effect.BLINDNESS,
Effect.HUNGER,
Effect.WEAKNESS,
Effect.POISON,
Effect.WITHER,
Effect.LEVITATION,
Effect.UNLUCK,
Effect.DARKNESS,
Effect.WIND_CHARGED,
Effect.WEAVING,
Effect.OOZING,
Effect.INFESTED
);
public static void addPotionEffectLore(PotionContents contents, BedrockItemBuilder builder, String language) {
List<MobEffectInstance> effectInstanceList = contents.getCustomEffects();
for (MobEffectInstance effectInstance : effectInstanceList) {
Effect effect = effectInstance.getEffect();
MobEffectDetails details = effectInstance.getDetails();
int amplifier = details.getAmplifier();
int durations = details.getDuration();
TranslatableComponent appendTranslatable = Component.translatable("effect.minecraft." + effect.toString().toLowerCase(Locale.ROOT));
if (amplifier != 0) {
appendTranslatable = Component.translatable("potion.withAmplifier",
appendTranslatable,
Component.translatable("potion.potency." + amplifier));
}
if (durations > 20) {
int seconds = durations / 20;
int secondsFormat = seconds % 60;
int minutes = seconds / 60;
int minutesFormat = minutes % 60;
int hours = minutes / 60;
String text = ((minutesFormat > 9) ? "" : "0") + minutesFormat + ":" + ((secondsFormat > 9) ? "" : "0") + secondsFormat;
if (minutes >= 60) {
text = ((hours > 9) ? "" : "0") + hours + ":" + text;
}
appendTranslatable = Component.translatable("potion.withDuration",
appendTranslatable,
Component.text(text));
} else if (durations == -1) {
appendTranslatable = Component.translatable("potion.withDuration",
appendTranslatable,
Component.translatable("effect.duration.infinite"));
}
Component component = Component.text()
.resetStyle()
.color((negativeEffectList.contains(effect)) ? NamedTextColor.RED : NamedTextColor.BLUE)
.append(appendTranslatable)
.build();
builder.getOrCreateLore().add(MessageTranslator.convertMessage(component, language));
}
}
private static void addAdvancedTooltips(@Nullable DataComponents components, BedrockItemBuilder builder, Item item, String language) {
int maxDurability = item.defaultMaxDamage();
@ -427,6 +492,19 @@ public final class ItemTranslator {
if (customName != null) {
return MessageTranslator.convertMessage(customName, session.locale());
}
PotionContents potionContents = components.get(DataComponentType.POTION_CONTENTS);
if (potionContents != null) {
// "custom_name" tag in "potion_contents" component
String customPotionName = potionContents.getCustomName();
if (customPotionName != null) {
Component component = Component.text()
.resetStyle()
.color(NamedTextColor.WHITE)
.append(Component.translatable(mapping.getJavaItem().translationKey() + ".effect." + customPotionName))
.build();
return MessageTranslator.convertMessage(component, session.locale());
}
}
customName = components.get(DataComponentType.ITEM_NAME);
if (customName != null) {
// Get the translated name and prefix it with a reset char to prevent italics - matches Java Edition

View file

@ -35,8 +35,6 @@ import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.level.block.property.Properties;
import org.geysermc.geyser.level.block.type.BlockState;
import org.geysermc.geyser.level.block.type.SkullBlock;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.SkullCache;
import org.geysermc.geyser.skin.SkinProvider;
@ -58,9 +56,6 @@ public class SkullBlockEntityTranslator extends BlockEntityTranslator implements
// Could be a wall skull block otherwise, which has rotation in its Bedrock state
bedrockNbt.putFloat("Rotation", rotation * 22.5f);
}
if (GameProtocol.isPre1_21_40(session)) {
bedrockNbt.putByte("SkullType", (byte) (blockState.block() instanceof SkullBlock skull ? skull.skullType().bedrockId() : 0));
}
if (blockState.getValue(Properties.POWERED)) {
bedrockNbt.putBoolean("MouthMoving", true);
}

View file

@ -25,7 +25,6 @@
package org.geysermc.geyser.translator.protocol.bedrock.entity.player.input;
import net.kyori.adventure.util.TriState;
import org.cloudburstmc.math.vector.Vector3d;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.PlayerAuthInputData;
@ -33,7 +32,6 @@ import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket;
import org.geysermc.geyser.entity.EntityDefinitions;
import org.geysermc.geyser.entity.type.player.SessionPlayerEntity;
import org.geysermc.geyser.level.physics.CollisionResult;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.ChatColor;
import org.geysermc.mcprotocollib.network.packet.Packet;
@ -88,14 +86,8 @@ final class BedrockMovePlayer {
session.setLookBackScheduledFuture(null);
}
TriState maybeOnGround;
if (GameProtocol.isPre1_21_30(session)) {
// VERTICAL_COLLISION input data does not exist.
maybeOnGround = TriState.NOT_SET;
} else {
// Client is telling us it wants to move down, but something is blocking it from doing so.
maybeOnGround = TriState.byBoolean(packet.getInputData().contains(PlayerAuthInputData.VERTICAL_COLLISION) && packet.getDelta().getY() < 0);
}
// Client is telling us it wants to move down, but something is blocking it from doing so.
boolean isOnGround = packet.getInputData().contains(PlayerAuthInputData.VERTICAL_COLLISION) && packet.getDelta().getY() < 0;
// This takes into account no movement sent from the client, but the player is trying to move anyway.
// (Press into a wall in a corner - you're trying to move but nothing actually happens)
boolean horizontalCollision = packet.getInputData().contains(PlayerAuthInputData.HORIZONTAL_COLLISION);
@ -104,7 +96,7 @@ final class BedrockMovePlayer {
// This isn't needed, but it makes the packets closer to vanilla
// It also means you can't "lag back" while only looking, in theory
if (!positionChanged && rotationChanged) {
ServerboundMovePlayerRotPacket playerRotationPacket = new ServerboundMovePlayerRotPacket(maybeOnGround.toBooleanOrElse(entity.isOnGround()), horizontalCollision, yaw, pitch);
ServerboundMovePlayerRotPacket playerRotationPacket = new ServerboundMovePlayerRotPacket(isOnGround, horizontalCollision, yaw, pitch);
entity.setYaw(yaw);
entity.setPitch(pitch);
@ -113,10 +105,9 @@ final class BedrockMovePlayer {
session.sendDownstreamGamePacket(playerRotationPacket);
} else if (positionChanged) {
if (isValidMove(session, entity.getPosition(), packet.getPosition())) {
CollisionResult result = session.getCollisionManager().adjustBedrockPosition(packet.getPosition(), maybeOnGround.toBooleanOrElse(false), packet.getInputData().contains(PlayerAuthInputData.HANDLE_TELEPORT));
CollisionResult result = session.getCollisionManager().adjustBedrockPosition(packet.getPosition(), isOnGround, packet.getInputData().contains(PlayerAuthInputData.HANDLE_TELEPORT));
if (result != null) { // A null return value cancels the packet
Vector3d position = result.correctedMovement();
boolean onGround = maybeOnGround.toBooleanOrElseGet(() -> session.getCollisionManager().isOnGround());
boolean isBelowVoid = entity.isVoidPositionDesynched();
boolean teleportThroughVoidFloor, mustResyncPosition;
@ -131,7 +122,7 @@ final class BedrockMovePlayer {
if (teleportThroughVoidFloor || isBelowVoid) {
// https://github.com/GeyserMC/Geyser/issues/3521 - no void floor in Java so we cannot be on the ground.
onGround = false;
isOnGround = false;
}
if (isBelowVoid) {
@ -151,7 +142,7 @@ final class BedrockMovePlayer {
if (rotationChanged) {
// Send rotation updates as well
movePacket = new ServerboundMovePlayerPosRotPacket(
onGround,
isOnGround,
horizontalCollision,
position.getX(), yPosition, position.getZ(),
yaw, pitch
@ -161,7 +152,7 @@ final class BedrockMovePlayer {
entity.setHeadYaw(headYaw);
} else {
// Rotation did not change; don't send an update with rotation
movePacket = new ServerboundMovePlayerPosPacket(onGround, horizontalCollision, position.getX(), yPosition, position.getZ());
movePacket = new ServerboundMovePlayerPosPacket(isOnGround, horizontalCollision, position.getX(), yPosition, position.getZ());
}
entity.setPositionManual(packet.getPosition());
@ -183,12 +174,12 @@ final class BedrockMovePlayer {
session.getGeyser().getLogger().debug("Recalculating position...");
session.getCollisionManager().recalculatePosition();
}
} else if (horizontalCollision != session.getInputCache().lastHorizontalCollision() || maybeOnGround.toBooleanOrElse(entity.isOnGround()) != entity.isOnGround()) {
session.sendDownstreamGamePacket(new ServerboundMovePlayerStatusOnlyPacket(maybeOnGround.toBooleanOrElse(false), horizontalCollision));
} else if (horizontalCollision != session.getInputCache().lastHorizontalCollision() || isOnGround != entity.isOnGround()) {
session.sendDownstreamGamePacket(new ServerboundMovePlayerStatusOnlyPacket(isOnGround, horizontalCollision));
}
session.getInputCache().setLastHorizontalCollision(horizontalCollision);
entity.setOnGround(maybeOnGround.toBooleanOrElse(entity.isOnGround()));
entity.setOnGround(isOnGround);
// Move parrots to match if applicable
if (entity.getLeftParrot() != null) {

View file

@ -29,7 +29,6 @@ import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.entity.type.LivingEntity;
import org.geysermc.geyser.entity.type.player.PlayerEntity;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.skin.FakeHeadProvider;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
@ -79,11 +78,8 @@ public class JavaSetEquipmentTranslator extends PacketTranslator<ClientboundSetE
}
case BODY -> {
// BODY is sent for llamas with a carpet equipped, as of 1.20.5
if (GameProtocol.isPre1_21_2(session)) {
livingEntity.setChestplate(stack);
} else {
livingEntity.setBody(stack);
}
// and for wolves
livingEntity.setBody(stack);
armorUpdated = true;
}
case LEGGINGS -> {

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,784 +0,0 @@
{
"minecraft:arrow": [
"minecraft:arrow"
],
"minecraft:banner": [
"minecraft:banner"
],
"minecraft:boat": [
"minecraft:oak_boat",
"minecraft:birch_boat",
"minecraft:jungle_boat",
"minecraft:spruce_boat",
"minecraft:mangrove_boat",
"minecraft:acacia_boat",
"minecraft:oak_chest_boat",
"minecraft:dark_oak_boat",
"minecraft:birch_chest_boat",
"minecraft:jungle_chest_boat",
"minecraft:spruce_chest_boat",
"minecraft:acacia_chest_boat",
"minecraft:dark_oak_chest_boat",
"minecraft:mangrove_chest_boat",
"minecraft:cherry_boat",
"minecraft:cherry_chest_boat",
"minecraft:bamboo_raft",
"minecraft:bamboo_chest_raft"
],
"minecraft:boats": [
"minecraft:oak_boat",
"minecraft:birch_boat",
"minecraft:jungle_boat",
"minecraft:spruce_boat",
"minecraft:mangrove_boat",
"minecraft:acacia_boat",
"minecraft:oak_chest_boat",
"minecraft:dark_oak_boat",
"minecraft:birch_chest_boat",
"minecraft:jungle_chest_boat",
"minecraft:spruce_chest_boat",
"minecraft:acacia_chest_boat",
"minecraft:dark_oak_chest_boat",
"minecraft:mangrove_chest_boat",
"minecraft:cherry_boat",
"minecraft:cherry_chest_boat",
"minecraft:bamboo_raft",
"minecraft:bamboo_chest_raft"
],
"minecraft:bookshelf_books": [
"minecraft:book",
"minecraft:writable_book",
"minecraft:enchanted_book",
"minecraft:written_book"
],
"minecraft:chainmail_tier": [
"minecraft:chainmail_helmet",
"minecraft:chainmail_leggings",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_boots"
],
"minecraft:chest_boat": [],
"minecraft:coals": [
"minecraft:coal",
"minecraft:charcoal"
],
"minecraft:crimson_stems": [
"minecraft:crimson_hyphae",
"minecraft:stripped_crimson_hyphae",
"minecraft:crimson_stem",
"minecraft:stripped_crimson_stem"
],
"minecraft:decorated_pot_sherds": [
"minecraft:blade_pottery_sherd",
"minecraft:brick",
"minecraft:angler_pottery_sherd",
"minecraft:burn_pottery_sherd",
"minecraft:archer_pottery_sherd",
"minecraft:arms_up_pottery_sherd",
"minecraft:heartbreak_pottery_sherd",
"minecraft:brewer_pottery_sherd",
"minecraft:danger_pottery_sherd",
"minecraft:explorer_pottery_sherd",
"minecraft:friend_pottery_sherd",
"minecraft:heart_pottery_sherd",
"minecraft:howl_pottery_sherd",
"minecraft:miner_pottery_sherd",
"minecraft:mourner_pottery_sherd",
"minecraft:plenty_pottery_sherd",
"minecraft:skull_pottery_sherd",
"minecraft:prize_pottery_sherd",
"minecraft:sheaf_pottery_sherd",
"minecraft:shelter_pottery_sherd",
"minecraft:snort_pottery_sherd"
],
"minecraft:diamond_tier": [
"minecraft:diamond_axe",
"minecraft:diamond_sword",
"minecraft:diamond_pickaxe",
"minecraft:diamond_shovel",
"minecraft:diamond_hoe",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots"
],
"minecraft:digger": [
"minecraft:stone_pickaxe",
"minecraft:iron_pickaxe",
"minecraft:iron_shovel",
"minecraft:iron_axe",
"minecraft:wooden_shovel",
"minecraft:wooden_pickaxe",
"minecraft:stone_shovel",
"minecraft:wooden_axe",
"minecraft:stone_axe",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_shovel",
"minecraft:netherite_pickaxe",
"minecraft:netherite_axe",
"minecraft:netherite_hoe"
],
"minecraft:door": [
"minecraft:wooden_door",
"minecraft:iron_door",
"minecraft:spruce_door",
"minecraft:birch_door",
"minecraft:crimson_door",
"minecraft:jungle_door",
"minecraft:dark_oak_door",
"minecraft:acacia_door",
"minecraft:mangrove_door",
"minecraft:warped_door",
"minecraft:cherry_door",
"minecraft:bamboo_door"
],
"minecraft:golden_tier": [
"minecraft:golden_sword",
"minecraft:golden_hoe",
"minecraft:golden_shovel",
"minecraft:golden_chestplate",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:golden_leggings",
"minecraft:golden_helmet",
"minecraft:golden_boots"
],
"minecraft:hanging_actor": [
"minecraft:painting"
],
"minecraft:hanging_sign": [
"minecraft:cherry_hanging_sign",
"minecraft:oak_hanging_sign",
"minecraft:crimson_hanging_sign",
"minecraft:acacia_hanging_sign",
"minecraft:spruce_hanging_sign",
"minecraft:birch_hanging_sign",
"minecraft:jungle_hanging_sign",
"minecraft:dark_oak_hanging_sign",
"minecraft:warped_hanging_sign",
"minecraft:mangrove_hanging_sign",
"minecraft:bamboo_hanging_sign"
],
"minecraft:horse_armor": [
"minecraft:leather_horse_armor",
"minecraft:iron_horse_armor",
"minecraft:golden_horse_armor",
"minecraft:diamond_horse_armor"
],
"minecraft:iron_tier": [
"minecraft:iron_pickaxe",
"minecraft:iron_shovel",
"minecraft:iron_sword",
"minecraft:iron_axe",
"minecraft:iron_hoe",
"minecraft:iron_chestplate",
"minecraft:iron_helmet",
"minecraft:iron_leggings",
"minecraft:iron_boots"
],
"minecraft:is_armor": [
"minecraft:leather_boots",
"minecraft:leather_leggings",
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:chainmail_leggings",
"minecraft:elytra",
"minecraft:chainmail_helmet",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots",
"minecraft:turtle_helmet",
"minecraft:netherite_helmet",
"minecraft:netherite_chestplate",
"minecraft:netherite_leggings",
"minecraft:netherite_boots"
],
"minecraft:is_axe": [
"minecraft:iron_axe",
"minecraft:wooden_axe",
"minecraft:diamond_axe",
"minecraft:netherite_axe",
"minecraft:stone_axe",
"minecraft:golden_axe"
],
"minecraft:is_cooked": [
"minecraft:cooked_porkchop",
"minecraft:cooked_cod",
"minecraft:rabbit_stew",
"minecraft:cooked_salmon",
"minecraft:cooked_beef",
"minecraft:cooked_chicken",
"minecraft:cooked_rabbit",
"minecraft:cooked_mutton"
],
"minecraft:is_fish": [
"minecraft:cod",
"minecraft:salmon",
"minecraft:tropical_fish",
"minecraft:pufferfish",
"minecraft:cooked_salmon",
"minecraft:cooked_cod"
],
"minecraft:is_food": [
"minecraft:porkchop",
"minecraft:cooked_mutton",
"minecraft:apple",
"minecraft:golden_apple",
"minecraft:dried_kelp",
"minecraft:cooked_porkchop",
"minecraft:mushroom_stew",
"minecraft:enchanted_golden_apple",
"minecraft:bread",
"minecraft:cookie",
"minecraft:melon_slice",
"minecraft:beef",
"minecraft:cooked_beef",
"minecraft:chicken",
"minecraft:cooked_chicken",
"minecraft:rotten_flesh",
"minecraft:carrot",
"minecraft:potato",
"minecraft:baked_potato",
"minecraft:golden_carrot",
"minecraft:pumpkin_pie",
"minecraft:beetroot",
"minecraft:beetroot_soup",
"minecraft:sweet_berries",
"minecraft:rabbit",
"minecraft:cooked_rabbit",
"minecraft:rabbit_stew",
"minecraft:mutton"
],
"minecraft:is_hoe": [
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:netherite_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe"
],
"minecraft:is_meat": [
"minecraft:rotten_flesh",
"minecraft:porkchop",
"minecraft:cooked_mutton",
"minecraft:cooked_porkchop",
"minecraft:cooked_chicken",
"minecraft:beef",
"minecraft:rabbit",
"minecraft:cooked_beef",
"minecraft:chicken",
"minecraft:cooked_rabbit",
"minecraft:rabbit_stew",
"minecraft:mutton"
],
"minecraft:is_minecart": [
"minecraft:minecart",
"minecraft:tnt_minecart",
"minecraft:chest_minecart",
"minecraft:hopper_minecart",
"minecraft:command_block_minecart"
],
"minecraft:is_pickaxe": [
"minecraft:iron_pickaxe",
"minecraft:stone_pickaxe",
"minecraft:netherite_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:diamond_pickaxe",
"minecraft:golden_pickaxe"
],
"minecraft:is_shovel": [
"minecraft:iron_shovel",
"minecraft:golden_shovel",
"minecraft:wooden_shovel",
"minecraft:stone_shovel",
"minecraft:diamond_shovel",
"minecraft:netherite_shovel"
],
"minecraft:is_sword": [
"minecraft:iron_sword",
"minecraft:wooden_sword",
"minecraft:stone_sword",
"minecraft:golden_sword",
"minecraft:diamond_sword",
"minecraft:netherite_sword"
],
"minecraft:is_tool": [
"minecraft:iron_pickaxe",
"minecraft:iron_shovel",
"minecraft:iron_sword",
"minecraft:stone_hoe",
"minecraft:iron_axe",
"minecraft:wooden_sword",
"minecraft:diamond_hoe",
"minecraft:wooden_shovel",
"minecraft:golden_sword",
"minecraft:wooden_pickaxe",
"minecraft:wooden_axe",
"minecraft:stone_sword",
"minecraft:stone_shovel",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:diamond_sword",
"minecraft:diamond_axe",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:wooden_hoe",
"minecraft:netherite_sword",
"minecraft:iron_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_shovel",
"minecraft:netherite_pickaxe",
"minecraft:netherite_axe",
"minecraft:netherite_hoe"
],
"minecraft:is_trident": [
"minecraft:trident"
],
"minecraft:leather_tier": [
"minecraft:leather_helmet",
"minecraft:leather_leggings",
"minecraft:leather_boots",
"minecraft:leather_chestplate"
],
"minecraft:lectern_books": [
"minecraft:writable_book",
"minecraft:written_book"
],
"minecraft:logs": [
"minecraft:oak_log",
"minecraft:stripped_oak_wood",
"minecraft:spruce_log",
"minecraft:crimson_stem",
"minecraft:birch_log",
"minecraft:jungle_log",
"minecraft:dark_oak_wood",
"minecraft:oak_wood",
"minecraft:dark_oak_log",
"minecraft:acacia_log",
"minecraft:spruce_wood",
"minecraft:stripped_spruce_wood",
"minecraft:birch_wood",
"minecraft:stripped_birch_wood",
"minecraft:warped_hyphae",
"minecraft:jungle_wood",
"minecraft:stripped_jungle_wood",
"minecraft:stripped_warped_stem",
"minecraft:acacia_wood",
"minecraft:stripped_acacia_wood",
"minecraft:stripped_dark_oak_wood",
"minecraft:mangrove_log",
"minecraft:stripped_spruce_log",
"minecraft:stripped_dark_oak_log",
"minecraft:stripped_jungle_log",
"minecraft:stripped_crimson_stem",
"minecraft:mangrove_wood",
"minecraft:stripped_mangrove_wood",
"minecraft:crimson_hyphae",
"minecraft:stripped_cherry_log",
"minecraft:stripped_cherry_wood",
"minecraft:stripped_acacia_log",
"minecraft:stripped_warped_hyphae",
"minecraft:stripped_birch_log",
"minecraft:warped_stem",
"minecraft:stripped_crimson_hyphae",
"minecraft:cherry_wood",
"minecraft:stripped_oak_log",
"minecraft:cherry_log",
"minecraft:stripped_mangrove_log"
],
"minecraft:logs_that_burn": [
"minecraft:oak_log",
"minecraft:stripped_oak_wood",
"minecraft:spruce_log",
"minecraft:birch_log",
"minecraft:jungle_log",
"minecraft:dark_oak_wood",
"minecraft:oak_wood",
"minecraft:dark_oak_log",
"minecraft:acacia_log",
"minecraft:spruce_wood",
"minecraft:stripped_spruce_wood",
"minecraft:birch_wood",
"minecraft:stripped_birch_wood",
"minecraft:jungle_wood",
"minecraft:stripped_jungle_wood",
"minecraft:acacia_wood",
"minecraft:stripped_acacia_wood",
"minecraft:stripped_dark_oak_wood",
"minecraft:mangrove_log",
"minecraft:stripped_spruce_log",
"minecraft:stripped_dark_oak_log",
"minecraft:stripped_jungle_log",
"minecraft:mangrove_wood",
"minecraft:stripped_mangrove_wood",
"minecraft:stripped_cherry_log",
"minecraft:stripped_cherry_wood",
"minecraft:stripped_acacia_log",
"minecraft:stripped_birch_log",
"minecraft:cherry_wood",
"minecraft:stripped_oak_log",
"minecraft:cherry_log",
"minecraft:stripped_mangrove_log"
],
"minecraft:mangrove_logs": [
"minecraft:mangrove_log",
"minecraft:mangrove_wood",
"minecraft:stripped_mangrove_wood",
"minecraft:stripped_mangrove_log"
],
"minecraft:music_disc": [
"minecraft:music_disc_stal",
"minecraft:music_disc_13",
"minecraft:music_disc_cat",
"minecraft:music_disc_11",
"minecraft:music_disc_blocks",
"minecraft:music_disc_mellohi",
"minecraft:music_disc_chirp",
"minecraft:music_disc_ward",
"minecraft:music_disc_far",
"minecraft:music_disc_mall",
"minecraft:music_disc_strad",
"minecraft:music_disc_wait",
"minecraft:music_disc_otherside",
"minecraft:music_disc_pigstep",
"minecraft:music_disc_5",
"minecraft:music_disc_relic"
],
"minecraft:netherite_tier": [
"minecraft:netherite_chestplate",
"minecraft:netherite_axe",
"minecraft:netherite_sword",
"minecraft:netherite_hoe",
"minecraft:netherite_shovel",
"minecraft:netherite_pickaxe",
"minecraft:netherite_helmet",
"minecraft:netherite_leggings",
"minecraft:netherite_boots"
],
"minecraft:piglin_loved": [],
"minecraft:piglin_repellents": [],
"minecraft:planks": [
"minecraft:dark_oak_planks",
"minecraft:oak_planks",
"minecraft:warped_planks",
"minecraft:spruce_planks",
"minecraft:birch_planks",
"minecraft:jungle_planks",
"minecraft:mangrove_planks",
"minecraft:acacia_planks",
"minecraft:crimson_planks",
"minecraft:bamboo_planks",
"minecraft:cherry_planks"
],
"minecraft:sand": [
"minecraft:sand"
],
"minecraft:sign": [
"minecraft:dark_oak_sign",
"minecraft:oak_sign",
"minecraft:spruce_sign",
"minecraft:crimson_sign",
"minecraft:birch_sign",
"minecraft:jungle_sign",
"minecraft:warped_sign",
"minecraft:bamboo_sign",
"minecraft:acacia_sign",
"minecraft:mangrove_sign",
"minecraft:crimson_hanging_sign",
"minecraft:cherry_sign",
"minecraft:acacia_hanging_sign",
"minecraft:cherry_hanging_sign",
"minecraft:oak_hanging_sign",
"minecraft:spruce_hanging_sign",
"minecraft:birch_hanging_sign",
"minecraft:jungle_hanging_sign",
"minecraft:dark_oak_hanging_sign",
"minecraft:warped_hanging_sign",
"minecraft:mangrove_hanging_sign",
"minecraft:bamboo_hanging_sign"
],
"minecraft:soul_fire_base_blocks": [
"minecraft:soul_soil",
"minecraft:soul_sand"
],
"minecraft:spawn_egg": [
"minecraft:zombie_villager_spawn_egg",
"minecraft:ender_dragon_spawn_egg",
"minecraft:zombie_horse_spawn_egg",
"minecraft:creeper_spawn_egg",
"minecraft:chicken_spawn_egg",
"minecraft:skeleton_spawn_egg",
"minecraft:cow_spawn_egg",
"minecraft:pig_spawn_egg",
"minecraft:dolphin_spawn_egg",
"minecraft:sheep_spawn_egg",
"minecraft:slime_spawn_egg",
"minecraft:wolf_spawn_egg",
"minecraft:phantom_spawn_egg",
"minecraft:mooshroom_spawn_egg",
"minecraft:agent_spawn_egg",
"minecraft:enderman_spawn_egg",
"minecraft:silverfish_spawn_egg",
"minecraft:zoglin_spawn_egg",
"minecraft:fox_spawn_egg",
"minecraft:spider_spawn_egg",
"minecraft:zombie_spawn_egg",
"minecraft:bat_spawn_egg",
"minecraft:zombie_pigman_spawn_egg",
"minecraft:villager_spawn_egg",
"minecraft:vex_spawn_egg",
"minecraft:llama_spawn_egg",
"minecraft:squid_spawn_egg",
"minecraft:cat_spawn_egg",
"minecraft:ocelot_spawn_egg",
"minecraft:witch_spawn_egg",
"minecraft:ghast_spawn_egg",
"minecraft:allay_spawn_egg",
"minecraft:strider_spawn_egg",
"minecraft:magma_cube_spawn_egg",
"minecraft:blaze_spawn_egg",
"minecraft:cave_spider_spawn_egg",
"minecraft:guardian_spawn_egg",
"minecraft:horse_spawn_egg",
"minecraft:husk_spawn_egg",
"minecraft:rabbit_spawn_egg",
"minecraft:endermite_spawn_egg",
"minecraft:mule_spawn_egg",
"minecraft:stray_spawn_egg",
"minecraft:wither_skeleton_spawn_egg",
"minecraft:donkey_spawn_egg",
"minecraft:skeleton_horse_spawn_egg",
"minecraft:shulker_spawn_egg",
"minecraft:npc_spawn_egg",
"minecraft:elder_guardian_spawn_egg",
"minecraft:polar_bear_spawn_egg",
"minecraft:cod_spawn_egg",
"minecraft:vindicator_spawn_egg",
"minecraft:evoker_spawn_egg",
"minecraft:parrot_spawn_egg",
"minecraft:tropical_fish_spawn_egg",
"minecraft:pufferfish_spawn_egg",
"minecraft:salmon_spawn_egg",
"minecraft:drowned_spawn_egg",
"minecraft:turtle_spawn_egg",
"minecraft:piglin_spawn_egg",
"minecraft:panda_spawn_egg",
"minecraft:pillager_spawn_egg",
"minecraft:wandering_trader_spawn_egg",
"minecraft:ravager_spawn_egg",
"minecraft:bee_spawn_egg",
"minecraft:hoglin_spawn_egg",
"minecraft:piglin_brute_spawn_egg",
"minecraft:sniffer_spawn_egg",
"minecraft:axolotl_spawn_egg",
"minecraft:goat_spawn_egg",
"minecraft:glow_squid_spawn_egg",
"minecraft:iron_golem_spawn_egg",
"minecraft:snow_golem_spawn_egg",
"minecraft:wither_spawn_egg",
"minecraft:frog_spawn_egg",
"minecraft:tadpole_spawn_egg",
"minecraft:warden_spawn_egg",
"minecraft:trader_llama_spawn_egg",
"minecraft:camel_spawn_egg",
"minecraft:armadillo_spawn_egg",
"minecraft:spawn_egg"
],
"minecraft:stone_bricks": [
"minecraft:stonebrick"
],
"minecraft:stone_crafting_materials": [
"minecraft:cobblestone",
"minecraft:cobbled_deepslate",
"minecraft:blackstone"
],
"minecraft:stone_tier": [
"minecraft:stone_sword",
"minecraft:stone_shovel",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:stone_hoe"
],
"minecraft:stone_tool_materials": [
"minecraft:cobblestone",
"minecraft:cobbled_deepslate",
"minecraft:blackstone"
],
"minecraft:transform_materials": [
"minecraft:netherite_ingot"
],
"minecraft:transform_templates": [
"minecraft:netherite_upgrade_smithing_template"
],
"minecraft:transformable_items": [
"minecraft:diamond_axe",
"minecraft:diamond_sword",
"minecraft:diamond_pickaxe",
"minecraft:diamond_shovel",
"minecraft:diamond_hoe",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_boots"
],
"minecraft:trim_materials": [
"minecraft:diamond",
"minecraft:emerald",
"minecraft:iron_ingot",
"minecraft:quartz",
"minecraft:lapis_lazuli",
"minecraft:gold_ingot",
"minecraft:redstone",
"minecraft:copper_ingot",
"minecraft:netherite_ingot",
"minecraft:amethyst_shard"
],
"minecraft:trim_templates": [
"minecraft:tide_armor_trim_smithing_template",
"minecraft:sentry_armor_trim_smithing_template",
"minecraft:coast_armor_trim_smithing_template",
"minecraft:dune_armor_trim_smithing_template",
"minecraft:wild_armor_trim_smithing_template",
"minecraft:ward_armor_trim_smithing_template",
"minecraft:eye_armor_trim_smithing_template",
"minecraft:vex_armor_trim_smithing_template",
"minecraft:snout_armor_trim_smithing_template",
"minecraft:rib_armor_trim_smithing_template",
"minecraft:spire_armor_trim_smithing_template",
"minecraft:silence_armor_trim_smithing_template",
"minecraft:wayfinder_armor_trim_smithing_template",
"minecraft:raiser_armor_trim_smithing_template",
"minecraft:shaper_armor_trim_smithing_template",
"minecraft:host_armor_trim_smithing_template"
],
"minecraft:trimmable_armors": [
"minecraft:leather_boots",
"minecraft:leather_leggings",
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_helmet",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots",
"minecraft:turtle_helmet",
"minecraft:netherite_helmet",
"minecraft:netherite_chestplate",
"minecraft:netherite_leggings",
"minecraft:netherite_boots"
],
"minecraft:vibration_damper": [
"minecraft:pink_wool",
"minecraft:lime_wool",
"minecraft:white_wool",
"minecraft:magenta_wool",
"minecraft:red_wool",
"minecraft:orange_wool",
"minecraft:yellow_carpet",
"minecraft:light_blue_wool",
"minecraft:yellow_wool",
"minecraft:gray_wool",
"minecraft:light_gray_wool",
"minecraft:cyan_wool",
"minecraft:purple_wool",
"minecraft:purple_carpet",
"minecraft:blue_wool",
"minecraft:brown_wool",
"minecraft:green_wool",
"minecraft:black_wool",
"minecraft:white_carpet",
"minecraft:orange_carpet",
"minecraft:magenta_carpet",
"minecraft:light_blue_carpet",
"minecraft:lime_carpet",
"minecraft:pink_carpet",
"minecraft:gray_carpet",
"minecraft:light_gray_carpet",
"minecraft:cyan_carpet",
"minecraft:blue_carpet",
"minecraft:brown_carpet",
"minecraft:green_carpet",
"minecraft:red_carpet",
"minecraft:black_carpet"
],
"minecraft:warped_stems": [
"minecraft:stripped_warped_hyphae",
"minecraft:warped_hyphae",
"minecraft:stripped_warped_stem",
"minecraft:warped_stem"
],
"minecraft:wooden_slabs": [
"minecraft:mangrove_slab",
"minecraft:birch_slab",
"minecraft:cherry_slab",
"minecraft:jungle_slab",
"minecraft:spruce_slab",
"minecraft:bamboo_slab",
"minecraft:oak_slab",
"minecraft:acacia_slab",
"minecraft:dark_oak_slab",
"minecraft:crimson_slab",
"minecraft:warped_slab"
],
"minecraft:wooden_tier": [
"minecraft:wooden_sword",
"minecraft:wooden_shovel",
"minecraft:wooden_pickaxe",
"minecraft:wooden_axe",
"minecraft:wooden_hoe"
],
"minecraft:wool": [
"minecraft:pink_wool",
"minecraft:lime_wool",
"minecraft:white_wool",
"minecraft:magenta_wool",
"minecraft:red_wool",
"minecraft:orange_wool",
"minecraft:light_blue_wool",
"minecraft:yellow_wool",
"minecraft:gray_wool",
"minecraft:light_gray_wool",
"minecraft:cyan_wool",
"minecraft:purple_wool",
"minecraft:blue_wool",
"minecraft:brown_wool",
"minecraft:green_wool",
"minecraft:black_wool"
]
}

View file

@ -1,802 +0,0 @@
{
"minecraft:arrow": [
"minecraft:arrow"
],
"minecraft:banner": [
"minecraft:banner"
],
"minecraft:boat": [
"minecraft:cherry_chest_boat",
"minecraft:oak_chest_boat",
"minecraft:mangrove_boat",
"minecraft:oak_boat",
"minecraft:birch_boat",
"minecraft:jungle_boat",
"minecraft:spruce_boat",
"minecraft:acacia_boat",
"minecraft:dark_oak_boat",
"minecraft:birch_chest_boat",
"minecraft:jungle_chest_boat",
"minecraft:spruce_chest_boat",
"minecraft:acacia_chest_boat",
"minecraft:dark_oak_chest_boat",
"minecraft:mangrove_chest_boat",
"minecraft:cherry_boat",
"minecraft:bamboo_raft",
"minecraft:bamboo_chest_raft"
],
"minecraft:boats": [
"minecraft:cherry_chest_boat",
"minecraft:oak_chest_boat",
"minecraft:mangrove_boat",
"minecraft:oak_boat",
"minecraft:birch_boat",
"minecraft:jungle_boat",
"minecraft:spruce_boat",
"minecraft:acacia_boat",
"minecraft:dark_oak_boat",
"minecraft:birch_chest_boat",
"minecraft:jungle_chest_boat",
"minecraft:spruce_chest_boat",
"minecraft:acacia_chest_boat",
"minecraft:dark_oak_chest_boat",
"minecraft:mangrove_chest_boat",
"minecraft:cherry_boat",
"minecraft:bamboo_raft",
"minecraft:bamboo_chest_raft"
],
"minecraft:bookshelf_books": [
"minecraft:written_book",
"minecraft:book",
"minecraft:writable_book",
"minecraft:enchanted_book"
],
"minecraft:chainmail_tier": [
"minecraft:chainmail_helmet",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots"
],
"minecraft:coals": [
"minecraft:coal",
"minecraft:charcoal"
],
"minecraft:crimson_stems": [
"minecraft:stripped_crimson_stem",
"minecraft:crimson_hyphae",
"minecraft:crimson_stem",
"minecraft:stripped_crimson_hyphae"
],
"minecraft:decorated_pot_sherds": [
"minecraft:skull_pottery_sherd",
"minecraft:angler_pottery_sherd",
"minecraft:prize_pottery_sherd",
"minecraft:mourner_pottery_sherd",
"minecraft:arms_up_pottery_sherd",
"minecraft:burn_pottery_sherd",
"minecraft:snort_pottery_sherd",
"minecraft:brick",
"minecraft:heartbreak_pottery_sherd",
"minecraft:miner_pottery_sherd",
"minecraft:brewer_pottery_sherd",
"minecraft:plenty_pottery_sherd",
"minecraft:scrape_pottery_sherd",
"minecraft:howl_pottery_sherd",
"minecraft:explorer_pottery_sherd",
"minecraft:archer_pottery_sherd",
"minecraft:blade_pottery_sherd",
"minecraft:danger_pottery_sherd",
"minecraft:flow_pottery_sherd",
"minecraft:friend_pottery_sherd",
"minecraft:guster_pottery_sherd",
"minecraft:heart_pottery_sherd",
"minecraft:sheaf_pottery_sherd",
"minecraft:shelter_pottery_sherd"
],
"minecraft:diamond_tier": [
"minecraft:diamond_sword",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:mace",
"minecraft:diamond_hoe",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots"
],
"minecraft:digger": [
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:wooden_axe",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_pickaxe",
"minecraft:netherite_shovel",
"minecraft:netherite_axe",
"minecraft:netherite_hoe"
],
"minecraft:door": [
"minecraft:warped_door",
"minecraft:waxed_weathered_copper_door",
"minecraft:wooden_door",
"minecraft:iron_door",
"minecraft:mangrove_door",
"minecraft:exposed_copper_door",
"minecraft:bamboo_door",
"minecraft:weathered_copper_door",
"minecraft:jungle_door",
"minecraft:spruce_door",
"minecraft:birch_door",
"minecraft:acacia_door",
"minecraft:dark_oak_door",
"minecraft:crimson_door",
"minecraft:cherry_door",
"minecraft:copper_door",
"minecraft:oxidized_copper_door",
"minecraft:waxed_copper_door",
"minecraft:waxed_exposed_copper_door",
"minecraft:waxed_oxidized_copper_door"
],
"minecraft:golden_tier": [
"minecraft:golden_sword",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:golden_hoe",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots"
],
"minecraft:hanging_actor": [
"minecraft:painting"
],
"minecraft:hanging_sign": [
"minecraft:mangrove_hanging_sign",
"minecraft:bamboo_hanging_sign",
"minecraft:spruce_hanging_sign",
"minecraft:birch_hanging_sign",
"minecraft:cherry_hanging_sign",
"minecraft:oak_hanging_sign",
"minecraft:jungle_hanging_sign",
"minecraft:acacia_hanging_sign",
"minecraft:dark_oak_hanging_sign",
"minecraft:crimson_hanging_sign",
"minecraft:warped_hanging_sign"
],
"minecraft:horse_armor": [
"minecraft:golden_horse_armor",
"minecraft:leather_horse_armor",
"minecraft:iron_horse_armor",
"minecraft:diamond_horse_armor"
],
"minecraft:iron_tier": [
"minecraft:iron_sword",
"minecraft:iron_pickaxe",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:iron_hoe",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots"
],
"minecraft:is_armor": [
"minecraft:netherite_boots",
"minecraft:chainmail_helmet",
"minecraft:elytra",
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:leather_leggings",
"minecraft:leather_boots",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots",
"minecraft:turtle_helmet",
"minecraft:netherite_chestplate",
"minecraft:netherite_leggings",
"minecraft:netherite_helmet"
],
"minecraft:is_axe": [
"minecraft:iron_axe",
"minecraft:wooden_axe",
"minecraft:stone_axe",
"minecraft:diamond_axe",
"minecraft:golden_axe",
"minecraft:netherite_axe"
],
"minecraft:is_cooked": [
"minecraft:cooked_cod",
"minecraft:cooked_porkchop",
"minecraft:cooked_rabbit",
"minecraft:cooked_salmon",
"minecraft:cooked_beef",
"minecraft:cooked_chicken",
"minecraft:rabbit_stew",
"minecraft:cooked_mutton"
],
"minecraft:is_fish": [
"minecraft:cooked_cod",
"minecraft:cod",
"minecraft:salmon",
"minecraft:tropical_fish",
"minecraft:pufferfish",
"minecraft:cooked_salmon"
],
"minecraft:is_food": [
"minecraft:rabbit",
"minecraft:cooked_porkchop",
"minecraft:mushroom_stew",
"minecraft:beetroot",
"minecraft:apple",
"minecraft:carrot",
"minecraft:chicken",
"minecraft:potato",
"minecraft:enchanted_golden_apple",
"minecraft:sweet_berries",
"minecraft:golden_apple",
"minecraft:bread",
"minecraft:porkchop",
"minecraft:cookie",
"minecraft:cooked_rabbit",
"minecraft:beef",
"minecraft:dried_kelp",
"minecraft:beetroot_soup",
"minecraft:melon_slice",
"minecraft:cooked_beef",
"minecraft:rotten_flesh",
"minecraft:cooked_chicken",
"minecraft:baked_potato",
"minecraft:golden_carrot",
"minecraft:pumpkin_pie",
"minecraft:rabbit_stew",
"minecraft:cooked_mutton",
"minecraft:mutton"
],
"minecraft:is_hoe": [
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_hoe"
],
"minecraft:is_meat": [
"minecraft:rabbit",
"minecraft:cooked_porkchop",
"minecraft:chicken",
"minecraft:porkchop",
"minecraft:cooked_rabbit",
"minecraft:beef",
"minecraft:cooked_beef",
"minecraft:rotten_flesh",
"minecraft:cooked_chicken",
"minecraft:rabbit_stew",
"minecraft:cooked_mutton",
"minecraft:mutton"
],
"minecraft:is_minecart": [
"minecraft:command_block_minecart",
"minecraft:minecart",
"minecraft:chest_minecart",
"minecraft:tnt_minecart",
"minecraft:hopper_minecart"
],
"minecraft:is_pickaxe": [
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:stone_pickaxe",
"minecraft:diamond_pickaxe",
"minecraft:golden_pickaxe",
"minecraft:netherite_pickaxe"
],
"minecraft:is_shovel": [
"minecraft:wooden_shovel",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:diamond_shovel",
"minecraft:golden_shovel",
"minecraft:netherite_shovel"
],
"minecraft:is_sword": [
"minecraft:iron_sword",
"minecraft:stone_sword",
"minecraft:wooden_sword",
"minecraft:diamond_sword",
"minecraft:mace",
"minecraft:golden_sword",
"minecraft:netherite_sword"
],
"minecraft:is_tool": [
"minecraft:iron_sword",
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:stone_sword",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:wooden_sword",
"minecraft:wooden_axe",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:diamond_sword",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:mace",
"minecraft:golden_sword",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_sword",
"minecraft:netherite_pickaxe",
"minecraft:netherite_shovel",
"minecraft:netherite_axe",
"minecraft:netherite_hoe"
],
"minecraft:is_trident": [
"minecraft:trident"
],
"minecraft:leather_tier": [
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:leather_leggings",
"minecraft:leather_boots"
],
"minecraft:lectern_books": [
"minecraft:written_book",
"minecraft:writable_book"
],
"minecraft:logs": [
"minecraft:stripped_oak_log",
"minecraft:mangrove_wood",
"minecraft:spruce_wood",
"minecraft:stripped_cherry_wood",
"minecraft:stripped_crimson_stem",
"minecraft:stripped_spruce_wood",
"minecraft:spruce_log",
"minecraft:acacia_wood",
"minecraft:stripped_acacia_wood",
"minecraft:stripped_warped_hyphae",
"minecraft:acacia_log",
"minecraft:oak_log",
"minecraft:birch_log",
"minecraft:jungle_log",
"minecraft:dark_oak_log",
"minecraft:jungle_wood",
"minecraft:stripped_jungle_wood",
"minecraft:oak_wood",
"minecraft:stripped_oak_wood",
"minecraft:birch_wood",
"minecraft:stripped_birch_wood",
"minecraft:dark_oak_wood",
"minecraft:stripped_dark_oak_wood",
"minecraft:stripped_dark_oak_log",
"minecraft:mangrove_log",
"minecraft:stripped_jungle_log",
"minecraft:stripped_mangrove_wood",
"minecraft:crimson_hyphae",
"minecraft:stripped_cherry_log",
"minecraft:stripped_birch_log",
"minecraft:stripped_acacia_log",
"minecraft:crimson_stem",
"minecraft:warped_hyphae",
"minecraft:stripped_spruce_log",
"minecraft:warped_stem",
"minecraft:stripped_crimson_hyphae",
"minecraft:cherry_wood",
"minecraft:cherry_log",
"minecraft:stripped_warped_stem",
"minecraft:stripped_mangrove_log"
],
"minecraft:logs_that_burn": [
"minecraft:stripped_oak_log",
"minecraft:mangrove_wood",
"minecraft:spruce_wood",
"minecraft:stripped_cherry_wood",
"minecraft:stripped_spruce_wood",
"minecraft:spruce_log",
"minecraft:acacia_wood",
"minecraft:stripped_acacia_wood",
"minecraft:acacia_log",
"minecraft:oak_log",
"minecraft:birch_log",
"minecraft:jungle_log",
"minecraft:dark_oak_log",
"minecraft:jungle_wood",
"minecraft:stripped_jungle_wood",
"minecraft:oak_wood",
"minecraft:stripped_oak_wood",
"minecraft:birch_wood",
"minecraft:stripped_birch_wood",
"minecraft:dark_oak_wood",
"minecraft:stripped_dark_oak_wood",
"minecraft:stripped_dark_oak_log",
"minecraft:mangrove_log",
"minecraft:stripped_jungle_log",
"minecraft:stripped_mangrove_wood",
"minecraft:stripped_cherry_log",
"minecraft:stripped_birch_log",
"minecraft:stripped_acacia_log",
"minecraft:stripped_spruce_log",
"minecraft:cherry_wood",
"minecraft:cherry_log",
"minecraft:stripped_mangrove_log"
],
"minecraft:mangrove_logs": [
"minecraft:mangrove_wood",
"minecraft:mangrove_log",
"minecraft:stripped_mangrove_wood",
"minecraft:stripped_mangrove_log"
],
"minecraft:music_disc": [
"minecraft:music_disc_ward",
"minecraft:music_disc_strad",
"minecraft:music_disc_chirp",
"minecraft:music_disc_creator_music_box",
"minecraft:music_disc_mall",
"minecraft:music_disc_pigstep",
"minecraft:music_disc_wait",
"minecraft:music_disc_11",
"minecraft:music_disc_stal",
"minecraft:music_disc_13",
"minecraft:music_disc_cat",
"minecraft:music_disc_blocks",
"minecraft:music_disc_far",
"minecraft:music_disc_mellohi",
"minecraft:music_disc_otherside",
"minecraft:music_disc_5",
"minecraft:music_disc_relic",
"minecraft:music_disc_creator",
"minecraft:music_disc_precipice"
],
"minecraft:netherite_tier": [
"minecraft:netherite_boots",
"minecraft:netherite_sword",
"minecraft:netherite_chestplate",
"minecraft:netherite_pickaxe",
"minecraft:netherite_leggings",
"minecraft:netherite_shovel",
"minecraft:netherite_axe",
"minecraft:netherite_hoe",
"minecraft:netherite_helmet"
],
"minecraft:planks": [
"minecraft:spruce_planks",
"minecraft:oak_planks",
"minecraft:mangrove_planks",
"minecraft:birch_planks",
"minecraft:jungle_planks",
"minecraft:acacia_planks",
"minecraft:dark_oak_planks",
"minecraft:bamboo_planks",
"minecraft:warped_planks",
"minecraft:crimson_planks",
"minecraft:cherry_planks"
],
"minecraft:sand": [
"minecraft:sand"
],
"minecraft:sign": [
"minecraft:bamboo_sign",
"minecraft:mangrove_hanging_sign",
"minecraft:cherry_sign",
"minecraft:oak_sign",
"minecraft:bamboo_hanging_sign",
"minecraft:warped_sign",
"minecraft:spruce_sign",
"minecraft:spruce_hanging_sign",
"minecraft:acacia_sign",
"minecraft:birch_hanging_sign",
"minecraft:birch_sign",
"minecraft:jungle_sign",
"minecraft:dark_oak_sign",
"minecraft:mangrove_sign",
"minecraft:crimson_sign",
"minecraft:cherry_hanging_sign",
"minecraft:oak_hanging_sign",
"minecraft:jungle_hanging_sign",
"minecraft:acacia_hanging_sign",
"minecraft:dark_oak_hanging_sign",
"minecraft:crimson_hanging_sign",
"minecraft:warped_hanging_sign"
],
"minecraft:soul_fire_base_blocks": [
"minecraft:soul_sand",
"minecraft:soul_soil"
],
"minecraft:spawn_egg": [
"minecraft:enderman_spawn_egg",
"minecraft:ravager_spawn_egg",
"minecraft:strider_spawn_egg",
"minecraft:slime_spawn_egg",
"minecraft:glow_squid_spawn_egg",
"minecraft:pillager_spawn_egg",
"minecraft:blaze_spawn_egg",
"minecraft:witch_spawn_egg",
"minecraft:horse_spawn_egg",
"minecraft:polar_bear_spawn_egg",
"minecraft:zoglin_spawn_egg",
"minecraft:stray_spawn_egg",
"minecraft:zombie_pigman_spawn_egg",
"minecraft:snow_golem_spawn_egg",
"minecraft:panda_spawn_egg",
"minecraft:axolotl_spawn_egg",
"minecraft:agent_spawn_egg",
"minecraft:shulker_spawn_egg",
"minecraft:vindicator_spawn_egg",
"minecraft:evoker_spawn_egg",
"minecraft:parrot_spawn_egg",
"minecraft:wolf_spawn_egg",
"minecraft:elder_guardian_spawn_egg",
"minecraft:silverfish_spawn_egg",
"minecraft:tadpole_spawn_egg",
"minecraft:cow_spawn_egg",
"minecraft:bogged_spawn_egg",
"minecraft:ocelot_spawn_egg",
"minecraft:bee_spawn_egg",
"minecraft:piglin_brute_spawn_egg",
"minecraft:rabbit_spawn_egg",
"minecraft:camel_spawn_egg",
"minecraft:creeper_spawn_egg",
"minecraft:drowned_spawn_egg",
"minecraft:chicken_spawn_egg",
"minecraft:pig_spawn_egg",
"minecraft:sheep_spawn_egg",
"minecraft:mooshroom_spawn_egg",
"minecraft:skeleton_spawn_egg",
"minecraft:spider_spawn_egg",
"minecraft:zombie_spawn_egg",
"minecraft:villager_spawn_egg",
"minecraft:squid_spawn_egg",
"minecraft:bat_spawn_egg",
"minecraft:ghast_spawn_egg",
"minecraft:magma_cube_spawn_egg",
"minecraft:cave_spider_spawn_egg",
"minecraft:endermite_spawn_egg",
"minecraft:guardian_spawn_egg",
"minecraft:husk_spawn_egg",
"minecraft:piglin_spawn_egg",
"minecraft:wither_skeleton_spawn_egg",
"minecraft:donkey_spawn_egg",
"minecraft:mule_spawn_egg",
"minecraft:skeleton_horse_spawn_egg",
"minecraft:zombie_horse_spawn_egg",
"minecraft:npc_spawn_egg",
"minecraft:breeze_spawn_egg",
"minecraft:llama_spawn_egg",
"minecraft:vex_spawn_egg",
"minecraft:warden_spawn_egg",
"minecraft:zombie_villager_spawn_egg",
"minecraft:tropical_fish_spawn_egg",
"minecraft:cod_spawn_egg",
"minecraft:pufferfish_spawn_egg",
"minecraft:salmon_spawn_egg",
"minecraft:dolphin_spawn_egg",
"minecraft:turtle_spawn_egg",
"minecraft:phantom_spawn_egg",
"minecraft:cat_spawn_egg",
"minecraft:fox_spawn_egg",
"minecraft:wandering_trader_spawn_egg",
"minecraft:hoglin_spawn_egg",
"minecraft:sniffer_spawn_egg",
"minecraft:goat_spawn_egg",
"minecraft:iron_golem_spawn_egg",
"minecraft:ender_dragon_spawn_egg",
"minecraft:wither_spawn_egg",
"minecraft:frog_spawn_egg",
"minecraft:allay_spawn_egg",
"minecraft:trader_llama_spawn_egg",
"minecraft:armadillo_spawn_egg",
"minecraft:spawn_egg"
],
"minecraft:stone_bricks": [
"minecraft:stonebrick"
],
"minecraft:stone_crafting_materials": [
"minecraft:cobblestone",
"minecraft:cobbled_deepslate",
"minecraft:blackstone"
],
"minecraft:stone_tier": [
"minecraft:stone_sword",
"minecraft:stone_shovel",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:stone_hoe"
],
"minecraft:stone_tool_materials": [
"minecraft:cobblestone",
"minecraft:cobbled_deepslate",
"minecraft:blackstone"
],
"minecraft:transform_materials": [
"minecraft:netherite_ingot"
],
"minecraft:transform_templates": [
"minecraft:netherite_upgrade_smithing_template"
],
"minecraft:transformable_items": [
"minecraft:diamond_sword",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:diamond_hoe",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_boots"
],
"minecraft:trim_materials": [
"minecraft:gold_ingot",
"minecraft:iron_ingot",
"minecraft:diamond",
"minecraft:redstone",
"minecraft:netherite_ingot",
"minecraft:lapis_lazuli",
"minecraft:quartz",
"minecraft:copper_ingot",
"minecraft:emerald",
"minecraft:amethyst_shard"
],
"minecraft:trim_templates": [
"minecraft:vex_armor_trim_smithing_template",
"minecraft:wild_armor_trim_smithing_template",
"minecraft:flow_armor_trim_smithing_template",
"minecraft:raiser_armor_trim_smithing_template",
"minecraft:silence_armor_trim_smithing_template",
"minecraft:coast_armor_trim_smithing_template",
"minecraft:snout_armor_trim_smithing_template",
"minecraft:dune_armor_trim_smithing_template",
"minecraft:rib_armor_trim_smithing_template",
"minecraft:host_armor_trim_smithing_template",
"minecraft:bolt_armor_trim_smithing_template",
"minecraft:shaper_armor_trim_smithing_template",
"minecraft:eye_armor_trim_smithing_template",
"minecraft:spire_armor_trim_smithing_template",
"minecraft:sentry_armor_trim_smithing_template",
"minecraft:ward_armor_trim_smithing_template",
"minecraft:tide_armor_trim_smithing_template",
"minecraft:wayfinder_armor_trim_smithing_template"
],
"minecraft:trimmable_armors": [
"minecraft:netherite_boots",
"minecraft:chainmail_helmet",
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:leather_leggings",
"minecraft:leather_boots",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots",
"minecraft:turtle_helmet",
"minecraft:netherite_chestplate",
"minecraft:netherite_leggings",
"minecraft:netherite_helmet"
],
"minecraft:vibration_damper": [
"minecraft:black_carpet",
"minecraft:blue_carpet",
"minecraft:pink_carpet",
"minecraft:lime_carpet",
"minecraft:green_wool",
"minecraft:cyan_carpet",
"minecraft:orange_wool",
"minecraft:white_carpet",
"minecraft:purple_carpet",
"minecraft:yellow_carpet",
"minecraft:light_gray_wool",
"minecraft:magenta_carpet",
"minecraft:purple_wool",
"minecraft:gray_wool",
"minecraft:red_carpet",
"minecraft:brown_carpet",
"minecraft:light_blue_wool",
"minecraft:white_wool",
"minecraft:magenta_wool",
"minecraft:yellow_wool",
"minecraft:lime_wool",
"minecraft:pink_wool",
"minecraft:cyan_wool",
"minecraft:blue_wool",
"minecraft:brown_wool",
"minecraft:red_wool",
"minecraft:black_wool",
"minecraft:orange_carpet",
"minecraft:light_blue_carpet",
"minecraft:gray_carpet",
"minecraft:light_gray_carpet",
"minecraft:green_carpet"
],
"minecraft:warped_stems": [
"minecraft:stripped_warped_hyphae",
"minecraft:warped_hyphae",
"minecraft:warped_stem",
"minecraft:stripped_warped_stem"
],
"minecraft:wooden_slabs": [
"minecraft:birch_slab",
"minecraft:oak_slab",
"minecraft:spruce_slab",
"minecraft:bamboo_slab",
"minecraft:warped_slab",
"minecraft:mangrove_slab",
"minecraft:cherry_slab",
"minecraft:jungle_slab",
"minecraft:acacia_slab",
"minecraft:dark_oak_slab",
"minecraft:crimson_slab"
],
"minecraft:wooden_tier": [
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:wooden_sword",
"minecraft:wooden_axe",
"minecraft:wooden_hoe"
],
"minecraft:wool": [
"minecraft:green_wool",
"minecraft:orange_wool",
"minecraft:light_gray_wool",
"minecraft:purple_wool",
"minecraft:gray_wool",
"minecraft:light_blue_wool",
"minecraft:white_wool",
"minecraft:magenta_wool",
"minecraft:yellow_wool",
"minecraft:lime_wool",
"minecraft:pink_wool",
"minecraft:cyan_wool",
"minecraft:blue_wool",
"minecraft:brown_wool",
"minecraft:red_wool",
"minecraft:black_wool"
]
}

View file

@ -1,806 +0,0 @@
{
"minecraft:arrow": [
"minecraft:arrow"
],
"minecraft:banner": [
"minecraft:banner"
],
"minecraft:boat": [
"minecraft:cherry_chest_boat",
"minecraft:oak_chest_boat",
"minecraft:mangrove_boat",
"minecraft:oak_boat",
"minecraft:birch_boat",
"minecraft:jungle_boat",
"minecraft:spruce_boat",
"minecraft:acacia_boat",
"minecraft:dark_oak_boat",
"minecraft:birch_chest_boat",
"minecraft:jungle_chest_boat",
"minecraft:spruce_chest_boat",
"minecraft:acacia_chest_boat",
"minecraft:dark_oak_chest_boat",
"minecraft:mangrove_chest_boat",
"minecraft:cherry_boat",
"minecraft:bamboo_raft",
"minecraft:bamboo_chest_raft"
],
"minecraft:boats": [
"minecraft:cherry_chest_boat",
"minecraft:oak_chest_boat",
"minecraft:mangrove_boat",
"minecraft:oak_boat",
"minecraft:birch_boat",
"minecraft:jungle_boat",
"minecraft:spruce_boat",
"minecraft:acacia_boat",
"minecraft:dark_oak_boat",
"minecraft:birch_chest_boat",
"minecraft:jungle_chest_boat",
"minecraft:spruce_chest_boat",
"minecraft:acacia_chest_boat",
"minecraft:dark_oak_chest_boat",
"minecraft:mangrove_chest_boat",
"minecraft:cherry_boat",
"minecraft:bamboo_raft",
"minecraft:bamboo_chest_raft"
],
"minecraft:bookshelf_books": [
"minecraft:written_book",
"minecraft:book",
"minecraft:writable_book",
"minecraft:enchanted_book"
],
"minecraft:chainmail_tier": [
"minecraft:chainmail_helmet",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots"
],
"minecraft:coals": [
"minecraft:coal",
"minecraft:charcoal"
],
"minecraft:crimson_stems": [
"minecraft:stripped_crimson_stem",
"minecraft:crimson_hyphae",
"minecraft:crimson_stem",
"minecraft:stripped_crimson_hyphae"
],
"minecraft:decorated_pot_sherds": [
"minecraft:angler_pottery_sherd",
"minecraft:skull_pottery_sherd",
"minecraft:prize_pottery_sherd",
"minecraft:mourner_pottery_sherd",
"minecraft:arms_up_pottery_sherd",
"minecraft:burn_pottery_sherd",
"minecraft:snort_pottery_sherd",
"minecraft:brick",
"minecraft:heartbreak_pottery_sherd",
"minecraft:miner_pottery_sherd",
"minecraft:brewer_pottery_sherd",
"minecraft:plenty_pottery_sherd",
"minecraft:scrape_pottery_sherd",
"minecraft:howl_pottery_sherd",
"minecraft:explorer_pottery_sherd",
"minecraft:archer_pottery_sherd",
"minecraft:blade_pottery_sherd",
"minecraft:danger_pottery_sherd",
"minecraft:flow_pottery_sherd",
"minecraft:friend_pottery_sherd",
"minecraft:guster_pottery_sherd",
"minecraft:heart_pottery_sherd",
"minecraft:sheaf_pottery_sherd",
"minecraft:shelter_pottery_sherd"
],
"minecraft:diamond_tier": [
"minecraft:diamond_sword",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:mace",
"minecraft:diamond_hoe",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots"
],
"minecraft:digger": [
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:wooden_axe",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_pickaxe",
"minecraft:netherite_shovel",
"minecraft:netherite_axe",
"minecraft:netherite_hoe"
],
"minecraft:door": [
"minecraft:warped_door",
"minecraft:waxed_weathered_copper_door",
"minecraft:wooden_door",
"minecraft:iron_door",
"minecraft:mangrove_door",
"minecraft:exposed_copper_door",
"minecraft:bamboo_door",
"minecraft:weathered_copper_door",
"minecraft:jungle_door",
"minecraft:spruce_door",
"minecraft:birch_door",
"minecraft:acacia_door",
"minecraft:dark_oak_door",
"minecraft:crimson_door",
"minecraft:cherry_door",
"minecraft:copper_door",
"minecraft:oxidized_copper_door",
"minecraft:waxed_copper_door",
"minecraft:waxed_exposed_copper_door",
"minecraft:waxed_oxidized_copper_door"
],
"minecraft:golden_tier": [
"minecraft:golden_sword",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:golden_hoe",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots"
],
"minecraft:hanging_actor": [
"minecraft:painting"
],
"minecraft:hanging_sign": [
"minecraft:mangrove_hanging_sign",
"minecraft:bamboo_hanging_sign",
"minecraft:spruce_hanging_sign",
"minecraft:birch_hanging_sign",
"minecraft:cherry_hanging_sign",
"minecraft:oak_hanging_sign",
"minecraft:jungle_hanging_sign",
"minecraft:acacia_hanging_sign",
"minecraft:dark_oak_hanging_sign",
"minecraft:crimson_hanging_sign",
"minecraft:warped_hanging_sign"
],
"minecraft:horse_armor": [
"minecraft:golden_horse_armor",
"minecraft:leather_horse_armor",
"minecraft:iron_horse_armor",
"minecraft:diamond_horse_armor"
],
"minecraft:iron_tier": [
"minecraft:iron_sword",
"minecraft:iron_pickaxe",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:iron_hoe",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots"
],
"minecraft:is_armor": [
"minecraft:netherite_boots",
"minecraft:chainmail_helmet",
"minecraft:elytra",
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:leather_leggings",
"minecraft:leather_boots",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots",
"minecraft:turtle_helmet",
"minecraft:netherite_chestplate",
"minecraft:netherite_leggings",
"minecraft:netherite_helmet"
],
"minecraft:is_axe": [
"minecraft:iron_axe",
"minecraft:wooden_axe",
"minecraft:stone_axe",
"minecraft:diamond_axe",
"minecraft:golden_axe",
"minecraft:netherite_axe"
],
"minecraft:is_cooked": [
"minecraft:cooked_cod",
"minecraft:cooked_porkchop",
"minecraft:cooked_rabbit",
"minecraft:cooked_salmon",
"minecraft:cooked_beef",
"minecraft:cooked_chicken",
"minecraft:rabbit_stew",
"minecraft:cooked_mutton"
],
"minecraft:is_fish": [
"minecraft:cooked_cod",
"minecraft:cod",
"minecraft:salmon",
"minecraft:tropical_fish",
"minecraft:pufferfish",
"minecraft:cooked_salmon"
],
"minecraft:is_food": [
"minecraft:beetroot",
"minecraft:apple",
"minecraft:carrot",
"minecraft:chicken",
"minecraft:potato",
"minecraft:enchanted_golden_apple",
"minecraft:sweet_berries",
"minecraft:golden_carrot",
"minecraft:golden_apple",
"minecraft:rabbit",
"minecraft:cooked_porkchop",
"minecraft:mushroom_stew",
"minecraft:bread",
"minecraft:porkchop",
"minecraft:cookie",
"minecraft:cooked_rabbit",
"minecraft:beef",
"minecraft:dried_kelp",
"minecraft:beetroot_soup",
"minecraft:melon_slice",
"minecraft:cooked_beef",
"minecraft:rotten_flesh",
"minecraft:cooked_chicken",
"minecraft:baked_potato",
"minecraft:pumpkin_pie",
"minecraft:rabbit_stew",
"minecraft:cooked_mutton",
"minecraft:mutton"
],
"minecraft:is_hoe": [
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_hoe"
],
"minecraft:is_meat": [
"minecraft:chicken",
"minecraft:rabbit",
"minecraft:cooked_porkchop",
"minecraft:porkchop",
"minecraft:cooked_rabbit",
"minecraft:beef",
"minecraft:cooked_beef",
"minecraft:rotten_flesh",
"minecraft:cooked_chicken",
"minecraft:rabbit_stew",
"minecraft:cooked_mutton",
"minecraft:mutton"
],
"minecraft:is_minecart": [
"minecraft:command_block_minecart",
"minecraft:minecart",
"minecraft:chest_minecart",
"minecraft:tnt_minecart",
"minecraft:hopper_minecart"
],
"minecraft:is_pickaxe": [
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:stone_pickaxe",
"minecraft:diamond_pickaxe",
"minecraft:golden_pickaxe",
"minecraft:netherite_pickaxe"
],
"minecraft:is_shovel": [
"minecraft:wooden_shovel",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:diamond_shovel",
"minecraft:golden_shovel",
"minecraft:netherite_shovel"
],
"minecraft:is_sword": [
"minecraft:iron_sword",
"minecraft:stone_sword",
"minecraft:wooden_sword",
"minecraft:diamond_sword",
"minecraft:mace",
"minecraft:golden_sword",
"minecraft:netherite_sword"
],
"minecraft:is_tool": [
"minecraft:iron_sword",
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:stone_sword",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:wooden_sword",
"minecraft:wooden_axe",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:diamond_sword",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:mace",
"minecraft:golden_sword",
"minecraft:golden_shovel",
"minecraft:golden_pickaxe",
"minecraft:golden_axe",
"minecraft:wooden_hoe",
"minecraft:stone_hoe",
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_sword",
"minecraft:netherite_pickaxe",
"minecraft:netherite_shovel",
"minecraft:netherite_axe",
"minecraft:netherite_hoe"
],
"minecraft:is_trident": [
"minecraft:trident"
],
"minecraft:leather_tier": [
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:leather_leggings",
"minecraft:leather_boots"
],
"minecraft:lectern_books": [
"minecraft:written_book",
"minecraft:writable_book"
],
"minecraft:logs": [
"minecraft:mangrove_wood",
"minecraft:spruce_wood",
"minecraft:stripped_cherry_wood",
"minecraft:stripped_crimson_stem",
"minecraft:stripped_spruce_wood",
"minecraft:spruce_log",
"minecraft:acacia_wood",
"minecraft:stripped_acacia_wood",
"minecraft:stripped_warped_hyphae",
"minecraft:acacia_log",
"minecraft:stripped_warped_stem",
"minecraft:oak_log",
"minecraft:birch_log",
"minecraft:jungle_log",
"minecraft:dark_oak_log",
"minecraft:jungle_wood",
"minecraft:stripped_jungle_wood",
"minecraft:oak_wood",
"minecraft:birch_wood",
"minecraft:dark_oak_wood",
"minecraft:stripped_oak_wood",
"minecraft:stripped_birch_wood",
"minecraft:stripped_dark_oak_wood",
"minecraft:stripped_oak_log",
"minecraft:stripped_dark_oak_log",
"minecraft:mangrove_log",
"minecraft:stripped_jungle_log",
"minecraft:stripped_mangrove_wood",
"minecraft:crimson_hyphae",
"minecraft:stripped_cherry_log",
"minecraft:stripped_birch_log",
"minecraft:stripped_acacia_log",
"minecraft:crimson_stem",
"minecraft:warped_hyphae",
"minecraft:stripped_spruce_log",
"minecraft:warped_stem",
"minecraft:stripped_crimson_hyphae",
"minecraft:cherry_wood",
"minecraft:cherry_log",
"minecraft:stripped_mangrove_log"
],
"minecraft:logs_that_burn": [
"minecraft:mangrove_wood",
"minecraft:spruce_wood",
"minecraft:stripped_cherry_wood",
"minecraft:stripped_spruce_wood",
"minecraft:spruce_log",
"minecraft:acacia_wood",
"minecraft:stripped_acacia_wood",
"minecraft:acacia_log",
"minecraft:oak_log",
"minecraft:birch_log",
"minecraft:jungle_log",
"minecraft:dark_oak_log",
"minecraft:jungle_wood",
"minecraft:stripped_jungle_wood",
"minecraft:oak_wood",
"minecraft:birch_wood",
"minecraft:dark_oak_wood",
"minecraft:stripped_oak_wood",
"minecraft:stripped_birch_wood",
"minecraft:stripped_dark_oak_wood",
"minecraft:stripped_oak_log",
"minecraft:stripped_dark_oak_log",
"minecraft:mangrove_log",
"minecraft:stripped_jungle_log",
"minecraft:stripped_mangrove_wood",
"minecraft:stripped_cherry_log",
"minecraft:stripped_birch_log",
"minecraft:stripped_acacia_log",
"minecraft:stripped_spruce_log",
"minecraft:cherry_wood",
"minecraft:cherry_log",
"minecraft:stripped_mangrove_log"
],
"minecraft:mangrove_logs": [
"minecraft:mangrove_wood",
"minecraft:mangrove_log",
"minecraft:stripped_mangrove_wood",
"minecraft:stripped_mangrove_log"
],
"minecraft:music_disc": [
"minecraft:music_disc_ward",
"minecraft:music_disc_strad",
"minecraft:music_disc_chirp",
"minecraft:music_disc_creator_music_box",
"minecraft:music_disc_mall",
"minecraft:music_disc_pigstep",
"minecraft:music_disc_wait",
"minecraft:music_disc_11",
"minecraft:music_disc_stal",
"minecraft:music_disc_13",
"minecraft:music_disc_cat",
"minecraft:music_disc_blocks",
"minecraft:music_disc_far",
"minecraft:music_disc_mellohi",
"minecraft:music_disc_otherside",
"minecraft:music_disc_5",
"minecraft:music_disc_relic",
"minecraft:music_disc_creator",
"minecraft:music_disc_precipice"
],
"minecraft:netherite_tier": [
"minecraft:netherite_boots",
"minecraft:netherite_sword",
"minecraft:netherite_chestplate",
"minecraft:netherite_pickaxe",
"minecraft:netherite_leggings",
"minecraft:netherite_shovel",
"minecraft:netherite_axe",
"minecraft:netherite_hoe",
"minecraft:netherite_helmet"
],
"minecraft:planks": [
"minecraft:spruce_planks",
"minecraft:oak_planks",
"minecraft:mangrove_planks",
"minecraft:dark_oak_planks",
"minecraft:birch_planks",
"minecraft:jungle_planks",
"minecraft:acacia_planks",
"minecraft:bamboo_planks",
"minecraft:warped_planks",
"minecraft:crimson_planks",
"minecraft:cherry_planks"
],
"minecraft:sand": [
"minecraft:sand",
"minecraft:red_sand"
],
"minecraft:sign": [
"minecraft:bamboo_sign",
"minecraft:mangrove_hanging_sign",
"minecraft:cherry_sign",
"minecraft:oak_sign",
"minecraft:bamboo_hanging_sign",
"minecraft:warped_sign",
"minecraft:spruce_sign",
"minecraft:spruce_hanging_sign",
"minecraft:acacia_sign",
"minecraft:birch_hanging_sign",
"minecraft:birch_sign",
"minecraft:jungle_sign",
"minecraft:dark_oak_sign",
"minecraft:mangrove_sign",
"minecraft:crimson_sign",
"minecraft:cherry_hanging_sign",
"minecraft:oak_hanging_sign",
"minecraft:jungle_hanging_sign",
"minecraft:acacia_hanging_sign",
"minecraft:dark_oak_hanging_sign",
"minecraft:crimson_hanging_sign",
"minecraft:warped_hanging_sign"
],
"minecraft:soul_fire_base_blocks": [
"minecraft:soul_soil",
"minecraft:soul_sand"
],
"minecraft:spawn_egg": [
"minecraft:enderman_spawn_egg",
"minecraft:strider_spawn_egg",
"minecraft:ravager_spawn_egg",
"minecraft:slime_spawn_egg",
"minecraft:glow_squid_spawn_egg",
"minecraft:pillager_spawn_egg",
"minecraft:blaze_spawn_egg",
"minecraft:witch_spawn_egg",
"minecraft:horse_spawn_egg",
"minecraft:polar_bear_spawn_egg",
"minecraft:zoglin_spawn_egg",
"minecraft:stray_spawn_egg",
"minecraft:zombie_pigman_spawn_egg",
"minecraft:snow_golem_spawn_egg",
"minecraft:panda_spawn_egg",
"minecraft:axolotl_spawn_egg",
"minecraft:agent_spawn_egg",
"minecraft:shulker_spawn_egg",
"minecraft:vindicator_spawn_egg",
"minecraft:evoker_spawn_egg",
"minecraft:parrot_spawn_egg",
"minecraft:wolf_spawn_egg",
"minecraft:elder_guardian_spawn_egg",
"minecraft:silverfish_spawn_egg",
"minecraft:tadpole_spawn_egg",
"minecraft:cow_spawn_egg",
"minecraft:bogged_spawn_egg",
"minecraft:ocelot_spawn_egg",
"minecraft:bee_spawn_egg",
"minecraft:piglin_brute_spawn_egg",
"minecraft:rabbit_spawn_egg",
"minecraft:camel_spawn_egg",
"minecraft:creeper_spawn_egg",
"minecraft:drowned_spawn_egg",
"minecraft:chicken_spawn_egg",
"minecraft:pig_spawn_egg",
"minecraft:sheep_spawn_egg",
"minecraft:mooshroom_spawn_egg",
"minecraft:skeleton_spawn_egg",
"minecraft:spider_spawn_egg",
"minecraft:zombie_spawn_egg",
"minecraft:villager_spawn_egg",
"minecraft:squid_spawn_egg",
"minecraft:bat_spawn_egg",
"minecraft:ghast_spawn_egg",
"minecraft:magma_cube_spawn_egg",
"minecraft:cave_spider_spawn_egg",
"minecraft:endermite_spawn_egg",
"minecraft:guardian_spawn_egg",
"minecraft:husk_spawn_egg",
"minecraft:piglin_spawn_egg",
"minecraft:wither_skeleton_spawn_egg",
"minecraft:donkey_spawn_egg",
"minecraft:mule_spawn_egg",
"minecraft:skeleton_horse_spawn_egg",
"minecraft:zombie_horse_spawn_egg",
"minecraft:npc_spawn_egg",
"minecraft:breeze_spawn_egg",
"minecraft:llama_spawn_egg",
"minecraft:vex_spawn_egg",
"minecraft:warden_spawn_egg",
"minecraft:zombie_villager_spawn_egg",
"minecraft:tropical_fish_spawn_egg",
"minecraft:cod_spawn_egg",
"minecraft:pufferfish_spawn_egg",
"minecraft:salmon_spawn_egg",
"minecraft:dolphin_spawn_egg",
"minecraft:turtle_spawn_egg",
"minecraft:phantom_spawn_egg",
"minecraft:cat_spawn_egg",
"minecraft:fox_spawn_egg",
"minecraft:wandering_trader_spawn_egg",
"minecraft:hoglin_spawn_egg",
"minecraft:sniffer_spawn_egg",
"minecraft:goat_spawn_egg",
"minecraft:iron_golem_spawn_egg",
"minecraft:ender_dragon_spawn_egg",
"minecraft:wither_spawn_egg",
"minecraft:frog_spawn_egg",
"minecraft:allay_spawn_egg",
"minecraft:trader_llama_spawn_egg",
"minecraft:armadillo_spawn_egg",
"minecraft:spawn_egg"
],
"minecraft:stone_bricks": [
"minecraft:mossy_stone_bricks",
"minecraft:stone_bricks",
"minecraft:cracked_stone_bricks",
"minecraft:chiseled_stone_bricks"
],
"minecraft:stone_crafting_materials": [
"minecraft:cobblestone",
"minecraft:cobbled_deepslate",
"minecraft:blackstone"
],
"minecraft:stone_tier": [
"minecraft:stone_sword",
"minecraft:stone_shovel",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:stone_hoe"
],
"minecraft:stone_tool_materials": [
"minecraft:cobblestone",
"minecraft:cobbled_deepslate",
"minecraft:blackstone"
],
"minecraft:transform_materials": [
"minecraft:netherite_ingot"
],
"minecraft:transform_templates": [
"minecraft:netherite_upgrade_smithing_template"
],
"minecraft:transformable_items": [
"minecraft:diamond_sword",
"minecraft:diamond_shovel",
"minecraft:diamond_pickaxe",
"minecraft:diamond_axe",
"minecraft:diamond_hoe",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_boots"
],
"minecraft:trim_materials": [
"minecraft:gold_ingot",
"minecraft:iron_ingot",
"minecraft:diamond",
"minecraft:redstone",
"minecraft:netherite_ingot",
"minecraft:lapis_lazuli",
"minecraft:quartz",
"minecraft:copper_ingot",
"minecraft:emerald",
"minecraft:amethyst_shard"
],
"minecraft:trim_templates": [
"minecraft:vex_armor_trim_smithing_template",
"minecraft:wild_armor_trim_smithing_template",
"minecraft:flow_armor_trim_smithing_template",
"minecraft:raiser_armor_trim_smithing_template",
"minecraft:silence_armor_trim_smithing_template",
"minecraft:coast_armor_trim_smithing_template",
"minecraft:snout_armor_trim_smithing_template",
"minecraft:dune_armor_trim_smithing_template",
"minecraft:rib_armor_trim_smithing_template",
"minecraft:host_armor_trim_smithing_template",
"minecraft:bolt_armor_trim_smithing_template",
"minecraft:shaper_armor_trim_smithing_template",
"minecraft:eye_armor_trim_smithing_template",
"minecraft:spire_armor_trim_smithing_template",
"minecraft:sentry_armor_trim_smithing_template",
"minecraft:ward_armor_trim_smithing_template",
"minecraft:tide_armor_trim_smithing_template",
"minecraft:wayfinder_armor_trim_smithing_template"
],
"minecraft:trimmable_armors": [
"minecraft:netherite_boots",
"minecraft:chainmail_helmet",
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:leather_leggings",
"minecraft:leather_boots",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
"minecraft:diamond_chestplate",
"minecraft:diamond_leggings",
"minecraft:diamond_boots",
"minecraft:golden_helmet",
"minecraft:golden_chestplate",
"minecraft:golden_leggings",
"minecraft:golden_boots",
"minecraft:turtle_helmet",
"minecraft:netherite_chestplate",
"minecraft:netherite_leggings",
"minecraft:netherite_helmet"
],
"minecraft:vibration_damper": [
"minecraft:black_carpet",
"minecraft:blue_carpet",
"minecraft:pink_carpet",
"minecraft:lime_carpet",
"minecraft:green_wool",
"minecraft:cyan_carpet",
"minecraft:orange_wool",
"minecraft:white_carpet",
"minecraft:purple_carpet",
"minecraft:yellow_carpet",
"minecraft:light_gray_wool",
"minecraft:magenta_carpet",
"minecraft:purple_wool",
"minecraft:gray_wool",
"minecraft:red_carpet",
"minecraft:brown_carpet",
"minecraft:light_blue_wool",
"minecraft:white_wool",
"minecraft:magenta_wool",
"minecraft:yellow_wool",
"minecraft:lime_wool",
"minecraft:pink_wool",
"minecraft:cyan_wool",
"minecraft:blue_wool",
"minecraft:brown_wool",
"minecraft:red_wool",
"minecraft:black_wool",
"minecraft:orange_carpet",
"minecraft:light_blue_carpet",
"minecraft:gray_carpet",
"minecraft:light_gray_carpet",
"minecraft:green_carpet"
],
"minecraft:warped_stems": [
"minecraft:stripped_warped_hyphae",
"minecraft:stripped_warped_stem",
"minecraft:warped_hyphae",
"minecraft:warped_stem"
],
"minecraft:wooden_slabs": [
"minecraft:birch_slab",
"minecraft:oak_slab",
"minecraft:spruce_slab",
"minecraft:bamboo_slab",
"minecraft:warped_slab",
"minecraft:mangrove_slab",
"minecraft:cherry_slab",
"minecraft:jungle_slab",
"minecraft:acacia_slab",
"minecraft:dark_oak_slab",
"minecraft:crimson_slab"
],
"minecraft:wooden_tier": [
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:wooden_sword",
"minecraft:wooden_axe",
"minecraft:wooden_hoe"
],
"minecraft:wool": [
"minecraft:green_wool",
"minecraft:orange_wool",
"minecraft:light_gray_wool",
"minecraft:purple_wool",
"minecraft:gray_wool",
"minecraft:light_blue_wool",
"minecraft:white_wool",
"minecraft:magenta_wool",
"minecraft:yellow_wool",
"minecraft:lime_wool",
"minecraft:pink_wool",
"minecraft:cyan_wool",
"minecraft:blue_wool",
"minecraft:brown_wool",
"minecraft:red_wool",
"minecraft:black_wool"
]
}

View file

@ -68,10 +68,10 @@
"minecraft:stripped_crimson_hyphae"
],
"minecraft:decorated_pot_sherds": [
"minecraft:angler_pottery_sherd",
"minecraft:skull_pottery_sherd",
"minecraft:prize_pottery_sherd",
"minecraft:mourner_pottery_sherd",
"minecraft:angler_pottery_sherd",
"minecraft:prize_pottery_sherd",
"minecraft:arms_up_pottery_sherd",
"minecraft:burn_pottery_sherd",
"minecraft:snort_pottery_sherd",
@ -106,13 +106,13 @@
"minecraft:diamond_boots"
],
"minecraft:digger": [
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:wooden_pickaxe",
"minecraft:iron_pickaxe",
"minecraft:iron_axe",
"minecraft:wooden_shovel",
"minecraft:wooden_axe",
"minecraft:stone_shovel",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:diamond_shovel",
@ -132,15 +132,15 @@
"minecraft:netherite_hoe"
],
"minecraft:door": [
"minecraft:weathered_copper_door",
"minecraft:warped_door",
"minecraft:waxed_weathered_copper_door",
"minecraft:wooden_door",
"minecraft:jungle_door",
"minecraft:waxed_weathered_copper_door",
"minecraft:iron_door",
"minecraft:mangrove_door",
"minecraft:exposed_copper_door",
"minecraft:bamboo_door",
"minecraft:weathered_copper_door",
"minecraft:jungle_door",
"minecraft:spruce_door",
"minecraft:birch_door",
"minecraft:acacia_door",
@ -181,23 +181,24 @@
"minecraft:warped_hanging_sign"
],
"minecraft:horse_armor": [
"minecraft:iron_horse_armor",
"minecraft:golden_horse_armor",
"minecraft:leather_horse_armor",
"minecraft:iron_horse_armor",
"minecraft:diamond_horse_armor"
],
"minecraft:iron_tier": [
"minecraft:iron_chestplate",
"minecraft:iron_shovel",
"minecraft:iron_sword",
"minecraft:iron_pickaxe",
"minecraft:iron_axe",
"minecraft:iron_shovel",
"minecraft:iron_hoe",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots"
],
"minecraft:is_armor": [
"minecraft:iron_chestplate",
"minecraft:netherite_boots",
"minecraft:chainmail_helmet",
"minecraft:elytra",
@ -209,7 +210,6 @@
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
@ -236,8 +236,8 @@
"minecraft:is_cooked": [
"minecraft:cooked_cod",
"minecraft:cooked_porkchop",
"minecraft:cooked_rabbit",
"minecraft:cooked_salmon",
"minecraft:cooked_rabbit",
"minecraft:cooked_beef",
"minecraft:cooked_chicken",
"minecraft:rabbit_stew",
@ -245,25 +245,25 @@
],
"minecraft:is_fish": [
"minecraft:cooked_cod",
"minecraft:cooked_salmon",
"minecraft:cod",
"minecraft:salmon",
"minecraft:tropical_fish",
"minecraft:pufferfish",
"minecraft:cooked_salmon"
"minecraft:pufferfish"
],
"minecraft:is_food": [
"minecraft:golden_carrot",
"minecraft:carrot",
"minecraft:chicken",
"minecraft:apple",
"minecraft:beetroot",
"minecraft:potato",
"minecraft:enchanted_golden_apple",
"minecraft:sweet_berries",
"minecraft:golden_apple",
"minecraft:rabbit",
"minecraft:cooked_porkchop",
"minecraft:mushroom_stew",
"minecraft:potato",
"minecraft:enchanted_golden_apple",
"minecraft:golden_carrot",
"minecraft:carrot",
"minecraft:chicken",
"minecraft:beetroot",
"minecraft:sweet_berries",
"minecraft:apple",
"minecraft:golden_apple",
"minecraft:bread",
"minecraft:porkchop",
"minecraft:cookie",
@ -290,9 +290,9 @@
"minecraft:netherite_hoe"
],
"minecraft:is_meat": [
"minecraft:chicken",
"minecraft:rabbit",
"minecraft:cooked_porkchop",
"minecraft:chicken",
"minecraft:porkchop",
"minecraft:cooked_rabbit",
"minecraft:beef",
@ -311,41 +311,42 @@
"minecraft:hopper_minecart"
],
"minecraft:is_pickaxe": [
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:iron_pickaxe",
"minecraft:stone_pickaxe",
"minecraft:diamond_pickaxe",
"minecraft:golden_pickaxe",
"minecraft:netherite_pickaxe"
],
"minecraft:is_shovel": [
"minecraft:wooden_shovel",
"minecraft:iron_shovel",
"minecraft:wooden_shovel",
"minecraft:stone_shovel",
"minecraft:diamond_shovel",
"minecraft:golden_shovel",
"minecraft:netherite_shovel"
],
"minecraft:is_sword": [
"minecraft:netherite_sword",
"minecraft:iron_sword",
"minecraft:stone_sword",
"minecraft:wooden_sword",
"minecraft:stone_sword",
"minecraft:diamond_sword",
"minecraft:mace",
"minecraft:golden_sword",
"minecraft:netherite_sword"
"minecraft:golden_sword"
],
"minecraft:is_tool": [
"minecraft:iron_sword",
"minecraft:iron_pickaxe",
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:stone_sword",
"minecraft:iron_axe",
"minecraft:netherite_sword",
"minecraft:iron_shovel",
"minecraft:stone_shovel",
"minecraft:iron_sword",
"minecraft:wooden_pickaxe",
"minecraft:iron_pickaxe",
"minecraft:iron_axe",
"minecraft:wooden_sword",
"minecraft:wooden_shovel",
"minecraft:wooden_axe",
"minecraft:stone_sword",
"minecraft:stone_shovel",
"minecraft:stone_pickaxe",
"minecraft:stone_axe",
"minecraft:diamond_sword",
@ -362,7 +363,6 @@
"minecraft:iron_hoe",
"minecraft:diamond_hoe",
"minecraft:golden_hoe",
"minecraft:netherite_sword",
"minecraft:netherite_pickaxe",
"minecraft:netherite_shovel",
"minecraft:netherite_axe",
@ -465,16 +465,16 @@
],
"minecraft:music_disc": [
"minecraft:music_disc_ward",
"minecraft:music_disc_stal",
"minecraft:music_disc_wait",
"minecraft:music_disc_cat",
"minecraft:music_disc_strad",
"minecraft:music_disc_chirp",
"minecraft:music_disc_creator_music_box",
"minecraft:music_disc_mall",
"minecraft:music_disc_creator_music_box",
"minecraft:music_disc_pigstep",
"minecraft:music_disc_wait",
"minecraft:music_disc_11",
"minecraft:music_disc_stal",
"minecraft:music_disc_13",
"minecraft:music_disc_cat",
"minecraft:music_disc_blocks",
"minecraft:music_disc_far",
"minecraft:music_disc_mellohi",
@ -485,8 +485,8 @@
"minecraft:music_disc_precipice"
],
"minecraft:netherite_tier": [
"minecraft:netherite_boots",
"minecraft:netherite_sword",
"minecraft:netherite_boots",
"minecraft:netherite_chestplate",
"minecraft:netherite_pickaxe",
"minecraft:netherite_leggings",
@ -513,6 +513,7 @@
"minecraft:red_sand"
],
"minecraft:sign": [
"minecraft:jungle_sign",
"minecraft:bamboo_sign",
"minecraft:mangrove_hanging_sign",
"minecraft:cherry_sign",
@ -524,7 +525,6 @@
"minecraft:acacia_sign",
"minecraft:birch_hanging_sign",
"minecraft:birch_sign",
"minecraft:jungle_sign",
"minecraft:dark_oak_sign",
"minecraft:mangrove_sign",
"minecraft:crimson_sign",
@ -542,16 +542,19 @@
],
"minecraft:spawn_egg": [
"minecraft:enderman_spawn_egg",
"minecraft:strider_spawn_egg",
"minecraft:endermite_spawn_egg",
"minecraft:tropical_fish_spawn_egg",
"minecraft:ravager_spawn_egg",
"minecraft:pufferfish_spawn_egg",
"minecraft:zoglin_spawn_egg",
"minecraft:strider_spawn_egg",
"minecraft:slime_spawn_egg",
"minecraft:glow_squid_spawn_egg",
"minecraft:pillager_spawn_egg",
"minecraft:blaze_spawn_egg",
"minecraft:witch_spawn_egg",
"minecraft:horse_spawn_egg",
"minecraft:polar_bear_spawn_egg",
"minecraft:zoglin_spawn_egg",
"minecraft:pillager_spawn_egg",
"minecraft:stray_spawn_egg",
"minecraft:zombie_pigman_spawn_egg",
"minecraft:snow_golem_spawn_egg",
@ -588,7 +591,6 @@
"minecraft:ghast_spawn_egg",
"minecraft:magma_cube_spawn_egg",
"minecraft:cave_spider_spawn_egg",
"minecraft:endermite_spawn_egg",
"minecraft:guardian_spawn_egg",
"minecraft:husk_spawn_egg",
"minecraft:piglin_spawn_egg",
@ -603,9 +605,7 @@
"minecraft:vex_spawn_egg",
"minecraft:warden_spawn_egg",
"minecraft:zombie_villager_spawn_egg",
"minecraft:tropical_fish_spawn_egg",
"minecraft:cod_spawn_egg",
"minecraft:pufferfish_spawn_egg",
"minecraft:salmon_spawn_egg",
"minecraft:dolphin_spawn_egg",
"minecraft:turtle_spawn_egg",
@ -667,9 +667,9 @@
"minecraft:golden_boots"
],
"minecraft:trim_materials": [
"minecraft:gold_ingot",
"minecraft:iron_ingot",
"minecraft:diamond",
"minecraft:iron_ingot",
"minecraft:gold_ingot",
"minecraft:redstone",
"minecraft:netherite_ingot",
"minecraft:lapis_lazuli",
@ -679,26 +679,27 @@
"minecraft:amethyst_shard"
],
"minecraft:trim_templates": [
"minecraft:coast_armor_trim_smithing_template",
"minecraft:vex_armor_trim_smithing_template",
"minecraft:wild_armor_trim_smithing_template",
"minecraft:flow_armor_trim_smithing_template",
"minecraft:raiser_armor_trim_smithing_template",
"minecraft:silence_armor_trim_smithing_template",
"minecraft:coast_armor_trim_smithing_template",
"minecraft:snout_armor_trim_smithing_template",
"minecraft:dune_armor_trim_smithing_template",
"minecraft:rib_armor_trim_smithing_template",
"minecraft:host_armor_trim_smithing_template",
"minecraft:bolt_armor_trim_smithing_template",
"minecraft:shaper_armor_trim_smithing_template",
"minecraft:eye_armor_trim_smithing_template",
"minecraft:spire_armor_trim_smithing_template",
"minecraft:sentry_armor_trim_smithing_template",
"minecraft:ward_armor_trim_smithing_template",
"minecraft:tide_armor_trim_smithing_template",
"minecraft:wayfinder_armor_trim_smithing_template"
"minecraft:wayfinder_armor_trim_smithing_template",
"minecraft:raiser_armor_trim_smithing_template",
"minecraft:shaper_armor_trim_smithing_template",
"minecraft:bolt_armor_trim_smithing_template"
],
"minecraft:trimmable_armors": [
"minecraft:iron_chestplate",
"minecraft:netherite_boots",
"minecraft:chainmail_helmet",
"minecraft:leather_helmet",
@ -709,7 +710,6 @@
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots",
"minecraft:iron_helmet",
"minecraft:iron_chestplate",
"minecraft:iron_leggings",
"minecraft:iron_boots",
"minecraft:diamond_helmet",
@ -727,9 +727,9 @@
],
"minecraft:vibration_damper": [
"minecraft:black_carpet",
"minecraft:blue_carpet",
"minecraft:pink_carpet",
"minecraft:lime_carpet",
"minecraft:blue_carpet",
"minecraft:green_wool",
"minecraft:cyan_carpet",
"minecraft:orange_wool",
@ -780,8 +780,8 @@
],
"minecraft:wooden_tier": [
"minecraft:wooden_pickaxe",
"minecraft:wooden_shovel",
"minecraft:wooden_sword",
"minecraft:wooden_shovel",
"minecraft:wooden_axe",
"minecraft:wooden_hoe"
],
@ -803,4 +803,4 @@
"minecraft:red_wool",
"minecraft:black_wool"
]
}
}

File diff suppressed because it is too large Load diff

View file

@ -10,9 +10,9 @@ netty-io-uring = "0.0.25.Final-SNAPSHOT"
guava = "29.0-jre"
gson = "2.3.1" # Provided by Spigot 1.8.8
websocket = "1.5.1"
protocol-connection = "3.0.0.Beta5-20241022.154658-14"
protocol-common = "3.0.0.Beta5-20241022.154658-14"
protocol-codec = "3.0.0.Beta5-20241022.154658-14"
protocol-connection = "3.0.0.Beta5-20241121.192504-18"
protocol-common = "3.0.0.Beta5-20241121.192504-18"
protocol-codec = "3.0.0.Beta5-20241121.192504-18"
raknet = "1.0.0.CR3-20240416.144209-1"
minecraftauth = "4.1.1"
mcprotocollib = "1.21.4-SNAPSHOT"
@ -28,7 +28,7 @@ viaversion = "4.9.2"
adapters = "1.15-SNAPSHOT"
cloud = "2.0.0-rc.2"
cloud-minecraft = "2.0.0-beta.9"
cloud-minecraft-modded = "2.0.0-beta.9"
cloud-minecraft-modded = "2.0.0-beta.10"
commodore = "2.2"
bungeecord = "a7c6ede"
velocity = "3.3.0-SNAPSHOT"