mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-12-22 14:34:59 +01:00
Merge remote-tracking branch 'refs/remotes/upstream/master' into feature/1.21.4
# Conflicts: # gradle.properties
This commit is contained in:
commit
5162aeb9b3
44 changed files with 2668 additions and 43132 deletions
|
@ -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.
|
||||
|
|
|
@ -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,13 +234,8 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRiderSeatPosition(Vector3f position) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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")) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -2246,10 +2246,8 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||
|
||||
@Override
|
||||
public void closeForm() {
|
||||
if (!GameProtocol.isPre1_21_2(this)) {
|
||||
sendUpstreamPacket(new ClientboundCloseFormPacket());
|
||||
}
|
||||
}
|
||||
|
||||
public void addCommandEnum(String name, String enums) {
|
||||
softEnumPacket(name, SoftEnumUpdateType.ADD, enums);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
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) {
|
||||
|
|
|
@ -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 {
|
||||
// and for wolves
|
||||
livingEntity.setBody(stack);
|
||||
}
|
||||
armorUpdated = true;
|
||||
}
|
||||
case LEGGINGS -> {
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
core/src/main/resources/bedrock/block_palette.1_21_50.nbt
Normal file
BIN
core/src/main/resources/bedrock/block_palette.1_21_50.nbt
Normal file
Binary file not shown.
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
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
@ -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"
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
],
|
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
File diff suppressed because it is too large
Load diff
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue