Compare commits

...
85 Commits
Author SHA1 Message Date
Nassim Jahnke dc4c929108 Add missing empty sound remaps
This is definitely definitely still 4.5.0
2022-12-07 13:53:39 +01:00
Nassim Jahnke 0fe3d9410e 1.19.3-rc3
Definitely still 4.5.0 as well
2022-12-06 12:21:56 +01:00
Nassim Jahnke cc9bf7284a 4.5.0 Release 2022-12-05 21:27:43 +01:00
Nassim Jahnke 383281cb9f 1.19.3-rc1 2022-12-01 17:21:37 +01:00
Nassim Jahnke d18825e700 1.19.3-pre3 2022-11-29 17:33:11 +01:00
Nassim Jahnke 2427690b78 22w46a 2022-11-16 18:30:11 +01:00
Nassim Jahnke a4261d6d9e 22w45a 2022-11-09 16:40:14 +01:00
Nassim Jahnke 091a63e45d 22w44a 2022-11-02 19:20:08 +01:00
Nassim Jahnke 9a9c6c4644 22w43a 2022-10-26 18:28:53 +02:00
Nassim Jahnke 808b1fd2f0 Finish mappings 2022-10-22 12:22:55 +02:00
Nassim Jahnke 9d3ee288df Handle chat types 2022-10-22 11:25:45 +02:00
Nassim Jahnke 100901029e Start working on 22w42a 2022-10-20 22:33:28 +02:00
Kichura 5bf8b59e91 Update actions, Gradle 7.5.1. (#500) 2022-10-15 19:20:35 +02:00
Nassim Jahnke c554027108 Change windswept_forest biome mapping 2022-10-09 15:57:31 +02:00
creeper123123321 4d295fbe2c fix #410 (#499) 2022-10-09 15:56:56 +02:00
Nassim Jahnke 40047330b4 4.4.2 Release 2022-08-21 09:42:48 +02:00
Pieter12345 98304168b8 Fix 1.18.2->1.19 CHAT_MESSAGE using static timestamp (#495) 2022-08-21 09:03:58 +02:00
EDX 3695df1e44 Update PlayerPackets1_11.java (#492) 2022-08-15 11:55:09 +02:00
Nassim Jahnke 958f265e18 Add mangrove/deep dark biome mappings 2022-08-08 13:38:23 +02:00
strider 394c944c50 Add 1.19->1.18 sound mappings (#489) 2022-08-05 16:08:18 +02:00
Nassim JahnkeandTisawesomeness d559c7cff1 Here you go, proper 1.19.1->1.19 and 1.19->1.18.2 support
Co-authored-by: Tisawesomeness <tis_dev@protonmail.com>
2022-08-04 16:59:01 +02:00
Gero 3d4f4438a8 Alter velocity modern forwarding version (#487) 2022-08-03 16:17:55 +02:00
Gero 2972fb8422 Bump version to 4.4.2-SNAPSHOT 2022-08-03 12:47:32 +02:00
Nassim Jahnke 817593ee43 4.4.1 Release 2022-07-28 18:54:02 +02:00
Nassim Jahnke 044980c1a8 Simplify component building 2022-07-28 15:00:16 +02:00
Nassim Jahnke 245bd53850 Add missing 1.19.1 chat types to config 2022-07-28 12:33:36 +02:00
Nassim Jahnke b632e4772f Allow 1.19.0 clients on 1.19.1 servers 2022-07-28 11:47:25 +02:00
Nassim Jahnke b336b8a1fc Tongue 2022-07-27 19:09:40 +02:00
Nassim Jahnke 304b21425c 4.4.0 Release 2022-07-26 18:48:10 +02:00
Nassim Jahnke bb17bb3bfd 1.19.1-rc3 2022-07-26 18:47:14 +02:00
Nassim Jahnke 941bb91be8 1.19.1-pre6 2022-07-20 19:35:04 +02:00
Nassim Jahnke fb334c6c14 1.19.1-pre5 2022-07-15 18:42:57 +02:00
Nassim Jahnke 90460ee99f 1.19.1-pre4 2022-07-08 21:07:57 +02:00
Gero 81a737886a Update chat-types-1.19.1.nbt (#470) 2022-07-06 18:18:28 +02:00
Gero 356158a9d4 team_name -> target (#469) 2022-07-06 18:02:22 +02:00
Nassim Jahnke 32bd9378e1 1.19.1-pre3 2022-07-06 17:55:39 +02:00
Nassim Jahnke 317af16975 Merge remote-tracking branch 'origin/master' into dev
# Conflicts:
#	build.gradle.kts
2022-07-02 19:36:24 +02:00
Nassim Jahnke 3826be4f5f 4.3.1 Release 2022-07-02 19:34:07 +02:00
Gero 282afe94cc Interpret translation keys with %s as the raw translation 2022-07-01 15:20:54 +02:00
Nassim Jahnke 9d86b31cb7 Bump version to 4.4.0-SNAPSHOT, update translation mappings
A break and more funky things
2022-07-01 12:40:43 +02:00
Nassim Jahnke 80041606a7 Merge 1.19.1->1.19 and 1.19->1.18.2 protocols 2022-07-01 12:14:10 +02:00
Gero 41e4172136 Fix chat type style 2022-07-01 10:19:54 +02:00
Gero a856658399 Handle 1.19.1 chat types 2022-07-01 10:17:51 +02:00
Nassim Jahnke 7173bbbbce 1.19.1-pre2 (at least an initial pass) 2022-06-30 19:36:43 +02:00
Nassim Jahnke 54507c6175 Merge remote-tracking branch 'origin/master' into dev 2022-06-28 12:26:27 +02:00
Myles 4dd7d384c8 Add feature request label to issue templates 2022-06-27 13:37:20 +01:00
Nassim Jahnke fc751aedf3 1.19.1-pre1 2022-06-21 22:14:47 +02:00
Nassim Jahnke a1da3dc11c Fix writing books
Fixes #2959
2022-06-17 08:38:23 +02:00
Nassim Jahnke 87c37b08e8 Fix 1.18.0/1 client on 1.19 server
Fixes #454
2022-06-16 20:06:10 +02:00
Gero 187b79f4e1 Fix NPE for chat messages before join game (#456) 2022-06-14 10:39:35 +02:00
Gero b84cda54c3 Fully implement chat types (#455) 2022-06-09 20:49:27 +02:00
Nassim Jahnke f474067eb2 Don't forget to clear 2022-06-09 20:13:36 +02:00
Nassim Jahnke 6a700d228d Properly deal with custom chat type registries 2022-06-09 20:07:58 +02:00
Nassim Jahnke f08223d1e9 Fix trade offers 2022-06-08 10:10:12 +02:00
Nassim Jahnke a5e3a6b563 Bump version to 4.3.1-SNAPSHOT 2022-06-08 10:08:21 +02:00
Nassim Jahnke 65afe42d2c 4.3.0 Release 2022-06-05 11:32:43 +02:00
Nassim Jahnke 9da206e280 Add sanity check in 1.13->1.12 enchantment handler
Closes #2908
2022-06-03 18:19:54 +02:00
Nassim Jahnke c2ae3df1db Fix 1.13->1.12 item cooldown
Fixes #450
2022-05-29 15:51:02 +02:00
Nassim Jahnke dc9fe10779 Fix join game reading 2022-05-23 19:32:54 +02:00
Nassim Jahnke 08a583526e 1.19-pre2 2022-05-23 18:17:17 +02:00
Nassim Jahnke 125fa885f6 Dont clear dimension storage on server switch 2022-05-21 10:57:39 +02:00
Nassim Jahnke 4a1eefcf87 1.19-pre1 2022-05-18 21:08:05 +02:00
Nassim Jahnke 68c0a0b333 Handle argument types, update Via usage 2022-05-14 12:32:10 +02:00
Nassim Jahnke fdc73126f7 Timestamp is millis now, fix dimension storage 2022-05-13 10:11:26 +02:00
Nassim Jahnke 1e0c0ebb2d 22w19a (almost, also more dread) 2022-05-12 23:56:24 +02:00
Nassim Jahnke 5bffa2c51c Fix clientbound chat message reading 2022-05-08 12:05:46 +02:00
Nassim Jahnke 34fa4f85db More or less handle new chat type formats 2022-05-05 11:24:19 +02:00
Nassim Jahnke ef0e412d36 22w18a
I hate codecs
2022-05-04 23:18:50 +02:00
Nassim Jahnke 7df02934f3 22w17a (and even more dread) 2022-04-27 22:38:41 +02:00
Nassim Jahnke d64b259b77 Remove painting variant tags 2022-04-20 21:41:38 +02:00
Nassim Jahnke 8850d5c8ff 22w16b (probably, also ignoring a possible race condition) 2022-04-20 21:00:45 +02:00
Nassim Jahnke 15c7106430 22w15a 2022-04-13 18:48:53 +02:00
Nassim Jahnke 56dfc985d2 Add item mappings, rename carpets tag for older versions 2022-04-06 22:53:45 +02:00
Nassim Jahnke dfa778942c 22w14a 2022-04-06 20:37:16 +02:00
Nassim Jahnke bd71833f18 22w13a 2022-03-31 19:00:43 +02:00
Nassim Jahnke c6f25bf33f Merge remote-tracking branch 'origin/master' into dev 2022-03-30 11:08:33 +02:00
Nassim Jahnke fc22d7e6c8 Don't warn for non-horse armor on horses
Closes #448
2022-03-30 11:07:38 +02:00
Nassim Jahnke 22f604cd7e Fix parrot imitate warden key 2022-03-30 11:06:25 +02:00
Nassim Jahnke a85b9e8100 Remove full frog metadata, add translation mappings 2022-03-24 20:10:19 +01:00
Nassim Jahnke 8d380f4278 22w12a 2022-03-24 19:31:11 +01:00
Nassim Jahnke 1486d58813 Comment out entity effect transformer 2022-03-21 10:42:37 +01:00
Nassim Jahnke 9d3de047a0 Merge remote-tracking branch 'origin/master' into dev
# Conflicts:
#	build.gradle.kts
2022-03-18 12:21:34 +01:00
Nassim Jahnke d56921b611 Actually everything from 22w11a 2022-03-16 23:06:58 +01:00
Nassim Jahnke 15a5e6f710 22w11a 2022-03-16 22:52:19 +01:00
Nassim Jahnke 422f2b699b 1.19 Experimental Snapshot 1 2022-03-16 19:08:08 +01:00
69 changed files with 5309 additions and 128 deletions

No files matched your search

+2 -1
View File
@@ -1,5 +1,6 @@
name: Feature Request
description: Suggest a feature to be added
labels: [Feature Request]
body:
- type: textarea
@@ -34,4 +35,4 @@ body:
description: |
Does the feature apply to any specific version or environment?
validations:
required: false
required: false
+5 -5
View File
@@ -8,18 +8,18 @@ on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
distribution: 'adopt'
distribution: 'temurin'
java-version: 11
- name: Build with Gradle
run: ./gradlew build
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v3
with:
name: artifact
path: build/libs
+1 -1
View File
@@ -11,7 +11,7 @@ Supported Versions
**Green** = ViaVersion\
**Purple** = ViaBackwards addition
![supported_versions](https://i.imgur.com/O2KAFFL.png)
![supported_versions](https://i.imgur.com/KpLsMHj.png)
Releases / Dev Builds
-
+1 -1
View File
@@ -5,7 +5,7 @@ plugins {
allprojects {
group = "com.viaversion"
version = "4.2.1"
version = "4.5.0"
description = "Allow older clients to join newer server versions."
}
@@ -50,6 +50,11 @@ public class BukkitPlugin extends JavaPlugin implements ViaBackwardsPlatform {
}
private void onServerLoaded() {
if (isOutdatedPostLoad()) {
disable();
return;
}
BukkitViaLoader loader = (BukkitViaLoader) Via.getManager().getLoader();
int protocolVersion = Via.getAPI().getServerVersion().highestSupportedVersion();
if (protocolVersion >= ProtocolVersion.v1_16.getVersion()) {
@@ -18,10 +18,12 @@
package com.viaversion.viabackwards;
import com.viaversion.viaversion.util.Config;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.io.File;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -33,6 +35,7 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
private boolean alwaysShowOriginalMobName;
private boolean fix1_13FormattedInventoryTitles;
private boolean handlePingsAsInvAcknowledgements;
private Map<String, String> chatTypeFormats;
public ViaBackwardsConfig(File configFile) {
super(configFile);
@@ -51,6 +54,7 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
fix1_13FormattedInventoryTitles = getBoolean("fix-formatted-inventory-titles", true);
alwaysShowOriginalMobName = getBoolean("always-show-original-mob-name", true);
handlePingsAsInvAcknowledgements = getBoolean("handle-pings-as-inv-acknowledgements", false);
chatTypeFormats = get("chat-types-1_19_1", Map.class, new HashMap<String, String>());
}
@Override
@@ -83,6 +87,11 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
return handlePingsAsInvAcknowledgements || Boolean.getBoolean("com.viaversion.handlePingsAsInvAcknowledgements");
}
@Override
public @Nullable String chatTypeFormat(final String translationKey) {
return chatTypeFormats.get(translationKey);
}
@Override
public URL getDefaultConfigURL() {
return getClass().getClassLoader().getResource("assets/viabackwards/config.yml");
@@ -17,6 +17,8 @@
*/
package com.viaversion.viabackwards.api;
import org.checkerframework.checker.nullness.qual.Nullable;
public interface ViaBackwardsConfig {
/**
@@ -50,4 +52,6 @@ public interface ViaBackwardsConfig {
boolean alwaysShowOriginalMobName();
boolean handlePingsAsInvAcknowledgements();
@Nullable String chatTypeFormat(String translationKey);
}
@@ -45,7 +45,10 @@ import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.Protocol1_16_4T
import com.viaversion.viabackwards.protocol.protocol1_16to1_16_1.Protocol1_16To1_16_1;
import com.viaversion.viabackwards.protocol.protocol1_17_1to1_18.Protocol1_17_1To1_18;
import com.viaversion.viabackwards.protocol.protocol1_17to1_17_1.Protocol1_17To1_17_1;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2To1_19;
import com.viaversion.viabackwards.protocol.protocol1_18to1_18_2.Protocol1_18To1_18_2;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.Protocol1_19_1To1_19_3;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.Protocol1_19To1_19_1;
import com.viaversion.viabackwards.protocol.protocol1_9_4to1_10.Protocol1_9_4To1_10;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.protocol.ProtocolManager;
@@ -57,7 +60,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "4.2.0";
String MINIMUM_VV_VERSION = "4.5.0";
String IMPL_VERSION = "$IMPL_VERSION";
/**
@@ -69,14 +72,17 @@ public interface ViaBackwardsPlatform {
ViaBackwards.init(this, config);
if (isOutdated()) return;
if (isOutdated()) {
disable();
return;
}
Via.getManager().getSubPlatforms().add(IMPL_VERSION);
getLogger().info("Loading translations...");
TranslatableRewriter.loadTranslatables();
ProtocolManager protocolManager = Via.getManager().getProtocolManager();
final ProtocolManager protocolManager = Via.getManager().getProtocolManager();
protocolManager.registerProtocol(new Protocol1_9_4To1_10(), ProtocolVersion.v1_9_3, ProtocolVersion.v1_10);
protocolManager.registerProtocol(new Protocol1_10To1_11(), ProtocolVersion.v1_10, ProtocolVersion.v1_11);
@@ -111,6 +117,11 @@ public interface ViaBackwardsPlatform {
protocolManager.registerProtocol(new Protocol1_17_1To1_18(), ProtocolVersion.v1_17_1, ProtocolVersion.v1_18);
protocolManager.registerProtocol(new Protocol1_18To1_18_2(), ProtocolVersion.v1_18, ProtocolVersion.v1_18_2);
protocolManager.registerProtocol(new Protocol1_18_2To1_19(), ProtocolVersion.v1_18_2, ProtocolVersion.v1_19);
protocolManager.registerProtocol(new Protocol1_19To1_19_1(), ProtocolVersion.v1_19, ProtocolVersion.v1_19_1);
protocolManager.registerProtocol(new Protocol1_19_1To1_19_3(), ProtocolVersion.v1_19_1, ProtocolVersion.v1_19_3);
}
/**
@@ -129,11 +140,12 @@ public interface ViaBackwardsPlatform {
getLogger().severe("LINK: https://ci.viaversion.com/");
getLogger().severe("VIABACKWARDS WILL NOW DISABLE");
getLogger().severe("================================");
disable();
return true;
}
return false;
}
default boolean isOutdatedPostLoad() {
return false;
}
@@ -51,7 +51,7 @@ public class BackwardsMappings extends MappingDataBase {
}
@Override
protected void loadExtras(JsonObject oldMappings, JsonObject newMappings, @Nullable JsonObject diffMappings) {
protected final void loadExtras(JsonObject oldMappings, JsonObject newMappings, @Nullable JsonObject diffMappings) {
if (diffMappings != null) {
JsonObject diffItems = diffMappings.getAsJsonObject("items");
if (diffItems != null) {
@@ -104,11 +104,11 @@ public class BackwardsMappings extends MappingDataBase {
/**
* To be overridden.
*/
protected void loadVBExtras(JsonObject oldMappings, JsonObject newMappings) {
protected void loadVBExtras(JsonObject unmapped, JsonObject mapped) {
}
protected boolean shouldWarnOnMissing(String key) {
return !key.equals("blocks") && !key.equals("statistics");
return !key.equals("blocks") && !key.equals("statistics") && !key.equals("entities");
}
@Override
@@ -154,6 +154,11 @@ public class BackwardsMappings extends MappingDataBase {
}
public @Nullable String mappedEntityName(String entityName) {
if (entityNames == null) {
ViaBackwards.getPlatform().getLogger().severe("No entity mappings found when requesting them for " + entityName);
new Exception().printStackTrace();
return null;
}
return entityNames.get(entityName);
}
@@ -29,6 +29,7 @@ import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.libs.gson.JsonPrimitive;
import com.viaversion.viaversion.libs.gson.JsonSyntaxException;
import com.viaversion.viaversion.util.GsonUtil;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.io.File;
import java.io.FileReader;
@@ -58,10 +59,14 @@ public final class VBMappingDataLoader {
return null;
}
public static @Nullable InputStream getResource(String name) {
return VBMappingDataLoader.class.getClassLoader().getResourceAsStream("assets/viabackwards/data/" + name);
}
public static JsonObject loadData(String name) {
InputStream stream = VBMappingDataLoader.class.getClassLoader().getResourceAsStream("assets/viabackwards/data/" + name);
try (InputStreamReader reader = new InputStreamReader(stream)) {
return GsonUtil.getGson().fromJson(reader, JsonObject.class);
try (InputStream stream = getResource(name)) {
if (stream == null) return null;
return GsonUtil.getGson().fromJson(new InputStreamReader(stream), JsonObject.class);
} catch (IOException e) {
e.printStackTrace();
return null;
@@ -135,12 +140,12 @@ public final class VBMappingDataLoader {
public static Int2ObjectMap<MappedItem> loadItemMappings(JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping, boolean warnOnMissing) {
Int2ObjectMap<MappedItem> itemMapping = new Int2ObjectOpenHashMap<>(diffMapping.size(), 0.99F);
Object2IntMap<String> newIdenfierMap = MappingDataLoader.indexedObjectToMap(newMapping);
Object2IntMap<String> oldIdenfierMap = MappingDataLoader.indexedObjectToMap(oldMapping);
Object2IntMap<String> newIdentifierMap = MappingDataLoader.indexedObjectToMap(newMapping);
Object2IntMap<String> oldIdentifierMap = MappingDataLoader.indexedObjectToMap(oldMapping);
for (Map.Entry<String, JsonElement> entry : diffMapping.entrySet()) {
JsonObject object = entry.getValue().getAsJsonObject();
String mappedIdName = object.getAsJsonPrimitive("id").getAsString();
int mappedId = newIdenfierMap.getInt(mappedIdName);
int mappedId = newIdentifierMap.getInt(mappedIdName);
if (mappedId == -1) {
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
ViaBackwards.getPlatform().getLogger().warning("No key for " + mappedIdName + " :( ");
@@ -148,7 +153,7 @@ public final class VBMappingDataLoader {
continue;
}
int oldId = oldIdenfierMap.getInt(entry.getKey());
int oldId = oldIdentifierMap.getInt(entry.getKey());
if (oldId == -1) {
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
ViaBackwards.getPlatform().getLogger().warning("No old entry for " + mappedIdName + " :( ");
@@ -162,8 +167,8 @@ public final class VBMappingDataLoader {
// Look for missing keys
if (warnOnMissing && !Via.getConfig().isSuppressConversionWarnings()) {
for (Object2IntMap.Entry<String> entry : oldIdenfierMap.object2IntEntrySet()) {
if (!newIdenfierMap.containsKey(entry.getKey()) && !itemMapping.containsKey(entry.getIntValue())) {
for (Object2IntMap.Entry<String> entry : oldIdentifierMap.object2IntEntrySet()) {
if (!newIdentifierMap.containsKey(entry.getKey()) && !itemMapping.containsKey(entry.getIntValue())) {
ViaBackwards.getPlatform().getLogger().warning("No item mapping for " + entry.getKey() + " :( ");
}
}
@@ -18,6 +18,7 @@
package com.viaversion.viabackwards.api.rewriters;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viaversion.api.data.entity.EntityTracker;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.metadata.MetaType;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
@@ -67,6 +68,17 @@ public abstract class EntityRewriter<T extends BackwardsProtocol> extends Entity
};
}
public PacketHandler getSpawnTrackerWithDataHandler1_19(EntityType fallingBlockType) {
return wrapper -> {
// Check against the UNMAPPED entity type
EntityType entityType = setOldEntityId(wrapper);
if (entityType == fallingBlockType) {
int blockState = wrapper.get(Type.VAR_INT, 2);
wrapper.set(Type.VAR_INT, 2, protocol.getMappingData().getNewBlockStateId(blockState));
}
};
}
public void registerSpawnTracker(ClientboundPacketType packetType) {
protocol.registerClientbound(packetType, new PacketRemapper() {
@Override
@@ -79,7 +91,30 @@ public abstract class EntityRewriter<T extends BackwardsProtocol> extends Entity
});
}
private EntityType setOldEntityId(PacketWrapper wrapper) throws Exception {
/**
* Returns a handler to track the current world and uncache entity data on world changes.
*
* @return handler to track the current world
*/
public PacketHandler worldTrackerHandlerByKey() {
return wrapper -> {
EntityTracker tracker = tracker(wrapper.user());
String world = wrapper.get(Type.STRING, 1);
if (tracker.currentWorld() != null && !tracker.currentWorld().equals(world)) {
tracker.clearEntities();
tracker.trackClientEntity();
}
tracker.setCurrentWorld(world);
};
}
/**
* Sets the mapped entity id and returns the unmapped entity type.
*
* @param wrapper packet wrapper
* @return unmapped (!) entity type
*/
protected EntityType setOldEntityId(PacketWrapper wrapper) throws Exception {
int typeId = wrapper.get(Type.VAR_INT, 1);
EntityType entityType = typeFromId(typeId);
tracker(wrapper.user()).addEntity(wrapper.get(Type.VAR_INT, 0), entityType);
@@ -23,13 +23,13 @@ import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.entities.storage.EntityData;
import com.viaversion.viabackwards.api.entities.storage.WrappedMetadata;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.Int2IntMapMappings;
import com.viaversion.viaversion.api.data.entity.StoredEntityData;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.metadata.MetaType;
import com.viaversion.viaversion.api.minecraft.metadata.Metadata;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.libs.fastutil.ints.Int2IntOpenHashMap;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
import com.viaversion.viaversion.libs.gson.JsonElement;
@@ -147,13 +147,12 @@ public abstract class EntityRewriterBase<T extends BackwardsProtocol> extends En
@Override
public <E extends Enum<E> & EntityType> void mapTypes(EntityType[] oldTypes, Class<E> newTypeClass) {
if (typeMappings == null) {
typeMappings = new Int2IntOpenHashMap(oldTypes.length, 0.99F);
typeMappings.defaultReturnValue(-1);
typeMappings = Int2IntMapMappings.of();
}
for (EntityType oldType : oldTypes) {
try {
E newType = Enum.valueOf(newTypeClass, oldType.name());
typeMappings.put(oldType.getId(), newType.getId());
typeMappings.setNewId(oldType.getId(), newType.getId());
} catch (IllegalArgumentException ignored) {
// Don't warn
}
@@ -55,7 +55,10 @@ public class SoundRewriter extends com.viaversion.viaversion.rewriter.SoundRewri
return wrapper -> {
String soundId = wrapper.get(Type.STRING, 0);
String mappedId = protocol.getMappingData().getMappedNamedSound(soundId);
if (mappedId == null) return;
if (mappedId == null) {
return;
}
if (!mappedId.isEmpty()) {
wrapper.set(Type.STRING, 0, mappedId);
} else {
@@ -89,4 +92,34 @@ public class SoundRewriter extends com.viaversion.viaversion.rewriter.SoundRewri
}
};
}
public PacketHandler get1_19_3SoundHandler() {
return wrapper -> {
final int soundId = wrapper.read(Type.VAR_INT);
if (soundId != 0) {
final int mappedId = idRewriter.rewrite(soundId - 1); // Normalize the id
if (mappedId == -1) {
wrapper.cancel();
return;
}
wrapper.write(Type.VAR_INT, mappedId + 1);
}
// Is followed by the resource loation
wrapper.write(Type.VAR_INT, 0);
String soundIdentifier = wrapper.read(Type.STRING);
final String mappedIdentifier = protocol.getMappingData().getMappedNamedSound(soundIdentifier);
if (mappedIdentifier != null) {
if (mappedIdentifier.isEmpty()) {
wrapper.cancel();
return;
}
soundIdentifier = mappedIdentifier;
}
wrapper.write(Type.STRING, soundIdentifier);
};
}
}
@@ -37,7 +37,7 @@ public class TranslatableRewriter extends ComponentRewriter {
protected final Map<String, String> newTranslatables;
public static void loadTranslatables() {
JsonObject jsonObject = VBMappingDataLoader.loadData("translation-mappings.json");
JsonObject jsonObject = VBMappingDataLoader.loadFromDataDir("translation-mappings.json");
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
Map<String, String> versionMappings = new HashMap<>();
TRANSLATABLES.put(entry.getKey(), versionMappings);
@@ -80,15 +80,6 @@ public class TranslatableRewriter extends ComponentRewriter {
});
}
public void registerChatMessage(ClientboundPacketType packetType) {
protocol.registerClientbound(packetType, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> processText(wrapper.passthrough(Type.COMPONENT)));
}
});
}
public void registerLegacyOpenWindow(ClientboundPacketType packetType) {
protocol.registerClientbound(packetType, new PacketRemapper() {
@Override
@@ -34,7 +34,7 @@ public class PlayerPackets1_11 {
private static final ValueTransformer<Short, Float> TO_NEW_FLOAT = new ValueTransformer<Short, Float>(Type.FLOAT) {
@Override
public Float transform(PacketWrapper wrapper, Short inputValue) throws Exception {
return inputValue / 15f;
return inputValue / 16f;
}
};
@@ -73,7 +73,7 @@ public class Protocol1_12_2To1_13 extends BackwardsProtocol<ClientboundPackets1_
};
translatableRewriter.registerPing();
translatableRewriter.registerBossBar(ClientboundPackets1_13.BOSSBAR);
translatableRewriter.registerChatMessage(ClientboundPackets1_13.CHAT_MESSAGE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_13.CHAT_MESSAGE);
translatableRewriter.registerLegacyOpenWindow(ClientboundPackets1_13.OPEN_WINDOW);
translatableRewriter.registerDisconnect(ClientboundPackets1_13.DISCONNECT);
translatableRewriter.registerCombatEvent(ClientboundPackets1_13.COMBAT_EVENT);
@@ -41,16 +41,15 @@ import java.util.Map;
public class BackwardsMappings extends com.viaversion.viabackwards.api.data.BackwardsMappings {
private final Int2ObjectMap<String> statisticMappings = new Int2ObjectOpenHashMap<>();
private final Map<String, String> translateMappings = new HashMap<>();
private Mappings enchantmentMappings;
public BackwardsMappings() {
super("1.13", "1.12", Protocol1_13To1_12_2.class, true);
}
@Override
public void loadVBExtras(JsonObject oldMappings, JsonObject newMappings) {
public void loadVBExtras(JsonObject unmapped, JsonObject mapped) {
enchantmentMappings = VBMappings.vbBuilder().warnOnMissing(false)
.unmapped(oldMappings.getAsJsonObject("enchantments")).mapped(newMappings.getAsJsonObject("enchantments")).build();
.unmapped(unmapped.getAsJsonArray("enchantments")).mapped(mapped.getAsJsonObject("legacy_enchantments")).build();
for (Map.Entry<String, Integer> entry : StatisticMappings.CUSTOM_STATS.entrySet()) {
statisticMappings.put(entry.getValue().intValue(), entry.getKey());
}
@@ -145,8 +144,4 @@ public class BackwardsMappings extends com.viaversion.viabackwards.api.data.Back
public Map<String, String> getTranslateMappings() {
return translateMappings;
}
public Mappings getEnchantmentMappings() {
return enchantmentMappings;
}
}
@@ -91,21 +91,20 @@ public class BlockItemPackets1_13 extends com.viaversion.viabackwards.api.rewrit
protocol.registerClientbound(ClientboundPackets1_13.COOLDOWN, new PacketRemapper() {
@Override
public void registerMap() {
handler(new PacketHandler() {
@Override
public void handle(PacketWrapper wrapper) throws Exception {
int itemId = wrapper.read(Type.VAR_INT);
int oldId = protocol.getMappingData().getItemMappings().get(itemId);
if (oldId != -1) {
Optional<String> eggEntityId = SpawnEggRewriter.getEntityId(oldId);
if (eggEntityId.isPresent()) {
itemId = 383 << 16;
} else {
itemId = (oldId >> 4) << 16 | oldId & 0xF;
}
}
wrapper.write(Type.VAR_INT, itemId);
handler(wrapper -> {
int itemId = wrapper.read(Type.VAR_INT);
int oldId = protocol.getMappingData().getItemMappings().get(itemId);
if (oldId == -1) {
wrapper.cancel();
return;
}
if (SpawnEggRewriter.getEntityId(oldId).isPresent()) {
wrapper.write(Type.VAR_INT, 383 << 4);
return;
}
wrapper.write(Type.VAR_INT, oldId >> 4);
});
}
});
@@ -654,10 +653,17 @@ public class BlockItemPackets1_13 extends com.viaversion.viabackwards.api.rewrit
for (Tag enchantmentEntryTag : enchantments.clone()) {
CompoundTag enchantmentEntry = (CompoundTag) enchantmentEntryTag;
Tag idTag = enchantmentEntry.get("id");
if (!(idTag instanceof StringTag)) continue;
if (!(idTag instanceof StringTag)) {
continue;
}
String newId = (String) idTag.getValue();
int levelValue = ((NumberTag) enchantmentEntry.get("lvl")).asInt();
NumberTag levelTag = enchantmentEntry.get("lvl");
if (levelTag == null) {
continue;
}
int levelValue = levelTag.asInt();
short level = levelValue < Short.MAX_VALUE ? (short) levelValue : Short.MAX_VALUE;
String mappedEnchantmentId = enchantmentMappings.get(newId);
@@ -192,23 +192,17 @@ public class PlayerPacket1_13 extends RewriterBase<Protocol1_12_2To1_13> {
for (int j = 0; j < nProperties; j++) {
packetWrapper.passthrough(Type.STRING);
packetWrapper.passthrough(Type.STRING);
if (packetWrapper.passthrough(Type.BOOLEAN)) {
packetWrapper.passthrough(Type.STRING);
}
packetWrapper.passthrough(Type.OPTIONAL_STRING);
}
packetWrapper.passthrough(Type.VAR_INT);
packetWrapper.passthrough(Type.VAR_INT);
if (packetWrapper.passthrough(Type.BOOLEAN)) {
packetWrapper.passthrough(Type.COMPONENT);
}
packetWrapper.passthrough(Type.OPTIONAL_COMPONENT);
} else if (action == 1) { // Update Game Mode
packetWrapper.passthrough(Type.VAR_INT);
} else if (action == 2) { // Update Ping
packetWrapper.passthrough(Type.VAR_INT);
} else if (action == 3) { // Update Display Name
if (packetWrapper.passthrough(Type.BOOLEAN)) {
packetWrapper.passthrough(Type.COMPONENT);
}
packetWrapper.passthrough(Type.OPTIONAL_COMPONENT);
} else if (action == 4) { // Remove Player
storage.usernames().remove(uuid);
}
@@ -59,7 +59,7 @@ public class Protocol1_13_2To1_14 extends BackwardsProtocol<ClientboundPackets1_
executeAsyncAfterLoaded(Protocol1_14To1_13_2.class, MAPPINGS::load);
translatableRewriter.registerBossBar(ClientboundPackets1_14.BOSSBAR);
translatableRewriter.registerChatMessage(ClientboundPackets1_14.CHAT_MESSAGE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_14.CHAT_MESSAGE);
translatableRewriter.registerCombatEvent(ClientboundPackets1_14.COMBAT_EVENT);
translatableRewriter.registerDisconnect(ClientboundPackets1_14.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_14.TAB_LIST);
@@ -37,7 +37,7 @@ public class CommandRewriter1_14 extends CommandRewriter {
}
@Override
protected @Nullable String handleArgumentType(String argumentType) {
public @Nullable String handleArgumentType(String argumentType) {
switch (argumentType) {
case "minecraft:nbt_compound_tag":
return "minecraft:nbt";
@@ -283,7 +283,6 @@ public class BlockItemPackets1_14 extends com.viaversion.viabackwards.api.rewrit
Item item = wrapper.read(Type.FLAT_VAR_INT_ITEM);
int armorType = item == null || item.identifier() == 0 ? 0 : item.identifier() - 726;
if (armorType < 0 || armorType > 3) {
ViaBackwards.getPlatform().getLogger().warning("Received invalid horse armor: " + item);
wrapper.cancel();
return;
}
@@ -66,7 +66,7 @@ public class Protocol1_13To1_13_1 extends BackwardsProtocol<ClientboundPackets1_
WorldPackets1_13_1.register(this);
TranslatableRewriter translatableRewriter = new TranslatableRewriter(this);
translatableRewriter.registerChatMessage(ClientboundPackets1_13.CHAT_MESSAGE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_13.CHAT_MESSAGE);
translatableRewriter.registerCombatEvent(ClientboundPackets1_13.COMBAT_EVENT);
translatableRewriter.registerDisconnect(ClientboundPackets1_13.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_13.TAB_LIST);
@@ -33,7 +33,7 @@ public class CommandRewriter1_13_1 extends CommandRewriter {
}
@Override
protected @Nullable String handleArgumentType(String argumentType) {
public @Nullable String handleArgumentType(String argumentType) {
if (argumentType.equals("minecraft:column_pos")) {
return "minecraft:vec2";
} else if (argumentType.equals("minecraft:dimension")) {
@@ -55,7 +55,7 @@ public class Protocol1_14_4To1_15 extends BackwardsProtocol<ClientboundPackets1_
executeAsyncAfterLoaded(Protocol1_15To1_14_4.class, MAPPINGS::load);
translatableRewriter.registerBossBar(ClientboundPackets1_15.BOSSBAR);
translatableRewriter.registerChatMessage(ClientboundPackets1_15.CHAT_MESSAGE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_15.CHAT_MESSAGE);
translatableRewriter.registerCombatEvent(ClientboundPackets1_15.COMBAT_EVENT);
translatableRewriter.registerDisconnect(ClientboundPackets1_15.DISCONNECT);
translatableRewriter.registerOpenWindow(ClientboundPackets1_15.OPEN_WINDOW);
@@ -54,7 +54,7 @@ public class BlockItemPackets1_15 extends com.viaversion.viabackwards.api.rewrit
registerSetCooldown(ClientboundPackets1_15.COOLDOWN);
registerWindowItems(ClientboundPackets1_15.WINDOW_ITEMS, Type.FLAT_VAR_INT_ITEM_ARRAY);
registerSetSlot(ClientboundPackets1_15.SET_SLOT, Type.FLAT_VAR_INT_ITEM);
registerTradeList(ClientboundPackets1_15.TRADE_LIST, Type.FLAT_VAR_INT_ITEM);
registerTradeList(ClientboundPackets1_15.TRADE_LIST);
registerEntityEquipment(ClientboundPackets1_15.ENTITY_EQUIPMENT, Type.FLAT_VAR_INT_ITEM);
registerAdvancements(ClientboundPackets1_15.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
registerClickWindow(ServerboundPackets1_14.CLICK_WINDOW, Type.FLAT_VAR_INT_ITEM);
@@ -128,8 +128,8 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol<ClientboundPackets1_
@Override
public void registerMap() {
handler(wrapper -> {
// Transform int array to plain string
UUID uuid = wrapper.read(Type.UUID_INT_ARRAY);
// Transform uuid to plain string
UUID uuid = wrapper.read(Type.UUID);
wrapper.write(Type.STRING, uuid.toString());
});
}
@@ -31,7 +31,7 @@ public class BackwardsMappings extends com.viaversion.viabackwards.api.data.Back
}
@Override
protected void loadVBExtras(JsonObject oldMappings, JsonObject newMappings) {
protected void loadVBExtras(JsonObject unmapped, JsonObject mapped) {
for (Map.Entry<String, String> entry : Protocol1_16To1_15_2.MAPPINGS.getAttributeMappings().entrySet()) {
attributeMappings.put(entry.getValue(), entry.getKey());
}
@@ -28,7 +28,7 @@ public class CommandRewriter1_16 extends CommandRewriter {
}
@Override
protected @Nullable String handleArgumentType(String argumentType) {
public @Nullable String handleArgumentType(String argumentType) {
if (argumentType.equals("minecraft:uuid")) {
return "minecraft:game_profile";
}
@@ -98,7 +98,7 @@ public class BlockItemPackets1_16 extends com.viaversion.viabackwards.api.rewrit
registerSetCooldown(ClientboundPackets1_16.COOLDOWN);
registerWindowItems(ClientboundPackets1_16.WINDOW_ITEMS, Type.FLAT_VAR_INT_ITEM_ARRAY);
registerSetSlot(ClientboundPackets1_16.SET_SLOT, Type.FLAT_VAR_INT_ITEM);
registerTradeList(ClientboundPackets1_16.TRADE_LIST, Type.FLAT_VAR_INT_ITEM);
registerTradeList(ClientboundPackets1_16.TRADE_LIST);
registerAdvancements(ClientboundPackets1_16.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
blockRewriter.registerAcknowledgePlayerDigging(ClientboundPackets1_16.ACKNOWLEDGE_PLAYER_DIGGING);
@@ -221,25 +221,19 @@ public class EntityPackets1_16 extends EntityRewriter<Protocol1_15_2To1_16> {
for (int j = 0; j < properties; j++) {
packetWrapper.passthrough(Type.STRING);
packetWrapper.passthrough(Type.STRING);
if (packetWrapper.passthrough(Type.BOOLEAN)) {
packetWrapper.passthrough(Type.STRING);
}
packetWrapper.passthrough(Type.OPTIONAL_STRING);
}
packetWrapper.passthrough(Type.VAR_INT);
packetWrapper.passthrough(Type.VAR_INT);
if (packetWrapper.passthrough(Type.BOOLEAN)) {
// Display Name
protocol.getTranslatableRewriter().processText(packetWrapper.passthrough(Type.COMPONENT));
}
// Display Name
protocol.getTranslatableRewriter().processText(packetWrapper.passthrough(Type.OPTIONAL_COMPONENT));
} else if (action == 1) { // Update Game Mode
packetWrapper.passthrough(Type.VAR_INT);
} else if (action == 2) { // Update Ping
packetWrapper.passthrough(Type.VAR_INT);
} else if (action == 3) { // Update Display Name
if (packetWrapper.passthrough(Type.BOOLEAN)) {
// Display name
protocol.getTranslatableRewriter().processText(packetWrapper.passthrough(Type.COMPONENT));
}
// Display name
protocol.getTranslatableRewriter().processText(packetWrapper.passthrough(Type.OPTIONAL_COMPONENT));
} // 4 = Remove Player
}
});
@@ -33,7 +33,7 @@ public class CommandRewriter1_16_2 extends CommandRewriter {
}
@Override
protected @Nullable String handleArgumentType(String argumentType) {
public @Nullable String handleArgumentType(String argumentType) {
if (argumentType.equals("minecraft:angle")) {
return "brigadier:string";
}
@@ -51,8 +51,8 @@ public class BlockItemPackets1_16_2 extends com.viaversion.viabackwards.api.rewr
registerSetCooldown(ClientboundPackets1_16_2.COOLDOWN);
registerWindowItems(ClientboundPackets1_16_2.WINDOW_ITEMS, Type.FLAT_VAR_INT_ITEM_ARRAY);
registerSetSlot(ClientboundPackets1_16_2.SET_SLOT, Type.FLAT_VAR_INT_ITEM);
registerEntityEquipmentArray(ClientboundPackets1_16_2.ENTITY_EQUIPMENT, Type.FLAT_VAR_INT_ITEM);
registerTradeList(ClientboundPackets1_16_2.TRADE_LIST, Type.FLAT_VAR_INT_ITEM);
registerEntityEquipmentArray(ClientboundPackets1_16_2.ENTITY_EQUIPMENT);
registerTradeList(ClientboundPackets1_16_2.TRADE_LIST);
registerAdvancements(ClientboundPackets1_16_2.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
protocol.registerClientbound(ClientboundPackets1_16_2.UNLOCK_RECIPES, new PacketRemapper() {
@@ -68,7 +68,7 @@ public final class Protocol1_16_4To1_17 extends BackwardsProtocol<ClientboundPac
protected void registerPackets() {
executeAsyncAfterLoaded(Protocol1_17To1_16_4.class, MAPPINGS::load);
translatableRewriter.registerChatMessage(ClientboundPackets1_17.CHAT_MESSAGE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_17.CHAT_MESSAGE);
translatableRewriter.registerBossBar(ClientboundPackets1_17.BOSSBAR);
translatableRewriter.registerDisconnect(ClientboundPackets1_17.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_17.TAB_LIST);
@@ -66,8 +66,8 @@ public final class BlockItemPackets1_17 extends ItemRewriter<Protocol1_16_4To1_1
registerSetCooldown(ClientboundPackets1_17.COOLDOWN);
registerWindowItems(ClientboundPackets1_17.WINDOW_ITEMS, Type.FLAT_VAR_INT_ITEM_ARRAY);
registerEntityEquipmentArray(ClientboundPackets1_17.ENTITY_EQUIPMENT, Type.FLAT_VAR_INT_ITEM);
registerTradeList(ClientboundPackets1_17.TRADE_LIST, Type.FLAT_VAR_INT_ITEM);
registerEntityEquipmentArray(ClientboundPackets1_17.ENTITY_EQUIPMENT);
registerTradeList(ClientboundPackets1_17.TRADE_LIST);
registerAdvancements(ClientboundPackets1_17.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
blockRewriter.registerAcknowledgePlayerDigging(ClientboundPackets1_17.ACKNOWLEDGE_PLAYER_DIGGING);
@@ -32,7 +32,7 @@ public final class BackwardsMappings extends com.viaversion.viabackwards.api.dat
}
@Override
protected void loadVBExtras(final JsonObject oldMappings, final JsonObject newMappings) {
protected void loadVBExtras(final JsonObject unmapped, final JsonObject mapped) {
for (final Object2IntMap.Entry<String> entry : Protocol1_18To1_17_1.MAPPINGS.blockEntityIds().object2IntEntrySet()) {
blockEntities.put(entry.getIntValue(), entry.getKey());
}
@@ -58,12 +58,12 @@ public final class BlockItemPackets1_18 extends ItemRewriter<Protocol1_17_1To1_1
new RecipeRewriter1_16(protocol).registerDefaultHandler(ClientboundPackets1_18.DECLARE_RECIPES);
registerSetCooldown(ClientboundPackets1_18.COOLDOWN);
registerWindowItems1_17_1(ClientboundPackets1_18.WINDOW_ITEMS, Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT, Type.FLAT_VAR_INT_ITEM);
registerSetSlot1_17_1(ClientboundPackets1_18.SET_SLOT, Type.FLAT_VAR_INT_ITEM);
registerEntityEquipmentArray(ClientboundPackets1_18.ENTITY_EQUIPMENT, Type.FLAT_VAR_INT_ITEM);
registerTradeList(ClientboundPackets1_18.TRADE_LIST, Type.FLAT_VAR_INT_ITEM);
registerWindowItems1_17_1(ClientboundPackets1_18.WINDOW_ITEMS);
registerSetSlot1_17_1(ClientboundPackets1_18.SET_SLOT);
registerEntityEquipmentArray(ClientboundPackets1_18.ENTITY_EQUIPMENT);
registerTradeList(ClientboundPackets1_18.TRADE_LIST);
registerAdvancements(ClientboundPackets1_18.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
registerClickWindow1_17_1(ServerboundPackets1_17.CLICK_WINDOW, Type.FLAT_VAR_INT_ITEM);
registerClickWindow1_17_1(ServerboundPackets1_17.CLICK_WINDOW);
protocol.registerClientbound(ClientboundPackets1_18.EFFECT, new PacketRemapper() {
@Override
@@ -173,7 +173,7 @@ public final class BlockItemPackets1_18 extends ItemRewriter<Protocol1_17_1To1_1
handler(wrapper -> {
final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user());
final Chunk1_18Type chunkType = new Chunk1_18Type(tracker.currentWorldSectionHeight(),
MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().size()),
MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().mappedSize()),
MathUtil.ceilLog2(tracker.biomesSent()));
final Chunk oldChunk = wrapper.read(chunkType);
final ChunkSection[] sections = oldChunk.getSections();
@@ -0,0 +1,315 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.data.BackwardsMappings;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.data.CommandRewriter1_19;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets.BlockItemPackets1_19;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets.EntityPackets1_19;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage.DimensionRegistryStorage;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.Protocol1_19To1_19_1;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.RegistryType;
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
import com.viaversion.viaversion.api.rewriter.EntityRewriter;
import com.viaversion.viaversion.api.rewriter.ItemRewriter;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
import com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ServerboundPackets1_17;
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ChatDecorationResult;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.Protocol1_19_1To1_19;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ServerboundPackets1_19;
import com.viaversion.viaversion.rewriter.CommandRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import java.time.Instant;
import java.util.UUID;
public final class Protocol1_18_2To1_19 extends BackwardsProtocol<ClientboundPackets1_19, ClientboundPackets1_18, ServerboundPackets1_19, ServerboundPackets1_17> {
public static final BackwardsMappings MAPPINGS = new BackwardsMappings();
private static final UUID ZERO_UUID = new UUID(0, 0);
private static final byte[] EMPTY_BYTES = new byte[0];
private final EntityPackets1_19 entityRewriter = new EntityPackets1_19(this);
private final BlockItemPackets1_19 blockItemPackets = new BlockItemPackets1_19(this);
private final TranslatableRewriter translatableRewriter = new TranslatableRewriter(this);
public Protocol1_18_2To1_19() {
super(ClientboundPackets1_19.class, ClientboundPackets1_18.class, ServerboundPackets1_19.class, ServerboundPackets1_17.class);
}
@Override
protected void registerPackets() {
executeAsyncAfterLoaded(Protocol1_19To1_18_2.class, () -> {
MAPPINGS.load();
entityRewriter.onMappingDataLoaded();
});
translatableRewriter.registerComponentPacket(ClientboundPackets1_19.ACTIONBAR);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19.TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19.TITLE_SUBTITLE);
translatableRewriter.registerBossBar(ClientboundPackets1_19.BOSSBAR);
translatableRewriter.registerDisconnect(ClientboundPackets1_19.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_19.TAB_LIST);
translatableRewriter.registerOpenWindow(ClientboundPackets1_19.OPEN_WINDOW);
translatableRewriter.registerCombatKill(ClientboundPackets1_19.COMBAT_KILL);
translatableRewriter.registerPing();
blockItemPackets.register();
entityRewriter.register();
final SoundRewriter soundRewriter = new SoundRewriter(this);
soundRewriter.registerStopSound(ClientboundPackets1_19.STOP_SOUND);
registerClientbound(ClientboundPackets1_19.SOUND, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Sound id
map(Type.VAR_INT); // Source
map(Type.INT); // X
map(Type.INT); // Y
map(Type.INT); // Z
map(Type.FLOAT); // Volume
map(Type.FLOAT); // Pitch
read(Type.LONG); // Seed
handler(soundRewriter.getSoundHandler());
}
});
registerClientbound(ClientboundPackets1_19.ENTITY_SOUND, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Sound id
map(Type.VAR_INT); // Source
map(Type.VAR_INT); // Entity id
map(Type.FLOAT); // Volume
map(Type.FLOAT); // Pitch
read(Type.LONG); // Seed
handler(soundRewriter.getSoundHandler());
}
});
registerClientbound(ClientboundPackets1_19.NAMED_SOUND, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Sound name
map(Type.VAR_INT); // Source
map(Type.INT); // X
map(Type.INT); // Y
map(Type.INT); // Z
map(Type.FLOAT); // Volume
map(Type.FLOAT); // Pitch
read(Type.LONG); // Seed
handler(soundRewriter.getNamedSoundHandler());
}
});
final TagRewriter tagRewriter = new TagRewriter(this);
tagRewriter.removeTags("minecraft:banner_pattern");
tagRewriter.removeTags("minecraft:instrument");
tagRewriter.removeTags("minecraft:cat_variant");
tagRewriter.removeTags("minecraft:painting_variant");
tagRewriter.addEmptyTag(RegistryType.BLOCK, "minecraft:polar_bears_spawnable_on_in_frozen_ocean");
tagRewriter.renameTag(RegistryType.BLOCK, "minecraft:wool_carpets", "minecraft:carpets");
tagRewriter.renameTag(RegistryType.ITEM, "minecraft:wool_carpets", "minecraft:carpets");
tagRewriter.addEmptyTag(RegistryType.ITEM, "minecraft:occludes_vibration_signals");
tagRewriter.registerGeneric(ClientboundPackets1_19.TAGS);
new StatisticsRewriter(this).register(ClientboundPackets1_19.STATISTICS);
final CommandRewriter commandRewriter = new CommandRewriter1_19(this);
registerClientbound(ClientboundPackets1_19.DECLARE_COMMANDS, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final int size = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < size; i++) {
final byte flags = wrapper.passthrough(Type.BYTE);
wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE); // Children indices
if ((flags & 0x08) != 0) {
wrapper.passthrough(Type.VAR_INT); // Redirect node index
}
final int nodeType = flags & 0x03;
if (nodeType == 1 || nodeType == 2) { // Literal/argument node
wrapper.passthrough(Type.STRING); // Name
}
if (nodeType == 2) { // Argument node
final int argumentTypeId = wrapper.read(Type.VAR_INT);
String argumentType = MAPPINGS.argumentType(argumentTypeId);
if (argumentType == null) {
ViaBackwards.getPlatform().getLogger().warning("Unknown command argument type id: " + argumentTypeId);
argumentType = "minecraft:no";
}
wrapper.write(Type.STRING, commandRewriter.handleArgumentType(argumentType));
commandRewriter.handleArgument(wrapper, argumentType);
if ((flags & 0x10) != 0) {
wrapper.passthrough(Type.STRING); // Suggestion type
}
}
}
wrapper.passthrough(Type.VAR_INT); // Root node index
});
}
});
cancelClientbound(ClientboundPackets1_19.SERVER_DATA);
cancelClientbound(ClientboundPackets1_19.CHAT_PREVIEW);
cancelClientbound(ClientboundPackets1_19.SET_DISPLAY_CHAT_PREVIEW);
registerClientbound(ClientboundPackets1_19.PLAYER_CHAT, ClientboundPackets1_18.CHAT_MESSAGE, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final JsonElement signedContent = wrapper.read(Type.COMPONENT);
final JsonElement unsignedContent = wrapper.read(Type.OPTIONAL_COMPONENT);
final int chatTypeId = wrapper.read(Type.VAR_INT);
final UUID sender = wrapper.read(Type.UUID);
final JsonElement senderName = wrapper.read(Type.COMPONENT);
final JsonElement teamName = wrapper.read(Type.OPTIONAL_COMPONENT);
final CompoundTag chatType = wrapper.user().get(DimensionRegistryStorage.class).chatType(chatTypeId);
final ChatDecorationResult decorationResult = Protocol1_19_1To1_19.decorateChatMessage(chatType, chatTypeId, senderName, teamName, unsignedContent != null ? unsignedContent : signedContent);
if (decorationResult == null) {
wrapper.cancel();
return;
}
translatableRewriter.processText(decorationResult.content());
wrapper.write(Type.COMPONENT, decorationResult.content());
wrapper.write(Type.BYTE, decorationResult.overlay() ? (byte) 2 : 1);
wrapper.write(Type.UUID, sender);
});
read(Type.LONG); // Timestamp
read(Type.LONG); // Salt
read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
}
});
registerClientbound(ClientboundPackets1_19.SYSTEM_CHAT, ClientboundPackets1_18.CHAT_MESSAGE, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final JsonElement content = wrapper.passthrough(Type.COMPONENT);
translatableRewriter.processText(content);
// Screw everything that isn't a system or game info type (which would only happen on funny 1.19.0 servers)
final int typeId = wrapper.read(Type.VAR_INT);
wrapper.write(Type.BYTE, typeId == Protocol1_19To1_19_1.GAME_INFO_ID ? (byte) 2 : (byte) 0);
});
create(Type.UUID, ZERO_UUID); // Sender
}
});
registerServerbound(ServerboundPackets1_17.CHAT_MESSAGE, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Message
handler(wrapper -> wrapper.write(Type.LONG, Instant.now().toEpochMilli())); // Timestamp
create(Type.LONG, 0L); // Salt
handler(wrapper -> {
final String message = wrapper.get(Type.STRING, 0);
if (!message.isEmpty() && message.charAt(0) == '/') {
wrapper.setPacketType(ServerboundPackets1_19.CHAT_COMMAND);
wrapper.set(Type.STRING, 0, message.substring(1));
wrapper.write(Type.VAR_INT, 0); // No signatures
} else {
wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, EMPTY_BYTES); // Signature
}
wrapper.write(Type.BOOLEAN, false); // No signed preview
});
}
});
// Login changes
registerClientbound(State.LOGIN, ClientboundLoginPackets.GAME_PROFILE.getId(), ClientboundLoginPackets.GAME_PROFILE.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.UUID); // UUID
map(Type.STRING); // Name
handler(wrapper -> {
final int properties = wrapper.read(Type.VAR_INT);
for (int i = 0; i < properties; i++) {
wrapper.read(Type.STRING); // Name
wrapper.read(Type.STRING); // Value
if (wrapper.read(Type.BOOLEAN)) {
wrapper.read(Type.STRING); // Signature
}
}
});
}
});
registerServerbound(State.LOGIN, ServerboundLoginPackets.HELLO.getId(), ServerboundLoginPackets.HELLO.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Name
// Write empty profile key - requires the enforce-secure-profiles option to be disabled on the server
create(Type.OPTIONAL_PROFILE_KEY, null);
}
});
registerServerbound(State.LOGIN, ServerboundLoginPackets.ENCRYPTION_KEY.getId(), ServerboundLoginPackets.ENCRYPTION_KEY.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.BYTE_ARRAY_PRIMITIVE); // Keys
create(Type.BOOLEAN, true); // Is nonce
}
});
}
@Override
public void init(final UserConnection user) {
user.put(new DimensionRegistryStorage());
addEntityTracker(user, new EntityTrackerBase(user, Entity1_19Types.PLAYER, true));
}
@Override
public BackwardsMappings getMappingData() {
return MAPPINGS;
}
@Override
public TranslatableRewriter getTranslatableRewriter() {
return translatableRewriter;
}
@Override
public EntityRewriter getEntityRewriter() {
return entityRewriter;
}
@Override
public ItemRewriter getItemRewriter() {
return blockItemPackets;
}
}
@@ -0,0 +1,74 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.data;
import com.viaversion.viabackwards.api.data.VBMappingDataLoader;
import com.viaversion.viaversion.api.minecraft.nbt.BinaryTagIO;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
import com.viaversion.viaversion.libs.gson.JsonArray;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.io.IOException;
public final class BackwardsMappings extends com.viaversion.viabackwards.api.data.BackwardsMappings {
private String[] argumentTypes;
private final Int2ObjectMap<CompoundTag> defaultChatTypes = new Int2ObjectOpenHashMap<>();
public BackwardsMappings() {
super("1.19", "1.18", Protocol1_19To1_18_2.class, true);
}
@Override
protected void loadVBExtras(final JsonObject unmapped, final JsonObject mapped) {
int i = 0;
final JsonArray types = unmapped.getAsJsonArray("argumenttypes");
this.argumentTypes = new String[types.size()];
for (final JsonElement element : types) {
final String id = element.getAsString();
this.argumentTypes[i++] = id;
}
try {
final ListTag chatTypes = BinaryTagIO.readCompressedInputStream(VBMappingDataLoader.getResource("chat-types-1.19.1.nbt")).get("values");
for (final Tag chatType : chatTypes) {
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
final NumberTag idTag = chatTypeCompound.get("id");
defaultChatTypes.put(idTag.asInt(), chatTypeCompound);
}
} catch (final IOException e) {
e.printStackTrace();
}
}
public @Nullable String argumentType(final int argumentTypeId) {
return argumentTypeId >= 0 && argumentTypeId < argumentTypes.length ? argumentTypes[argumentTypeId] : null;
}
public @Nullable CompoundTag chatType(final int id) {
return defaultChatTypes.get(id);
}
}
@@ -0,0 +1,31 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.data;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.rewriter.CommandRewriter;
public final class CommandRewriter1_19 extends CommandRewriter {
public CommandRewriter1_19(Protocol protocol) {
super(protocol);
this.parserHandlers.put("minecraft:template_mirror", wrapper -> wrapper.write(Type.VAR_INT, 0));
this.parserHandlers.put("minecraft:template_rotation", wrapper -> wrapper.write(Type.VAR_INT, 0));
}
}
@@ -0,0 +1,216 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets;
import com.viaversion.viabackwards.api.rewriters.ItemRewriter;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2To1_19;
import com.viaversion.viaversion.api.data.ParticleMappings;
import com.viaversion.viaversion.api.data.entity.EntityTracker;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
import com.viaversion.viaversion.api.minecraft.chunks.PaletteType;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.protocols.protocol1_16to1_15_2.data.RecipeRewriter1_16;
import com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ServerboundPackets1_17;
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.types.Chunk1_18Type;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.util.MathUtil;
public final class BlockItemPackets1_19 extends ItemRewriter<Protocol1_18_2To1_19> {
public BlockItemPackets1_19(final Protocol1_18_2To1_19 protocol) {
super(protocol);
}
@Override
protected void registerPackets() {
final BlockRewriter blockRewriter = new BlockRewriter(protocol, Type.POSITION1_14);
new RecipeRewriter1_16(protocol).registerDefaultHandler(ClientboundPackets1_19.DECLARE_RECIPES);
registerSetCooldown(ClientboundPackets1_19.COOLDOWN);
registerWindowItems1_17_1(ClientboundPackets1_19.WINDOW_ITEMS);
registerSetSlot1_17_1(ClientboundPackets1_19.SET_SLOT);
registerEntityEquipmentArray(ClientboundPackets1_19.ENTITY_EQUIPMENT);
registerAdvancements(ClientboundPackets1_19.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
registerClickWindow1_17_1(ServerboundPackets1_17.CLICK_WINDOW);
blockRewriter.registerBlockAction(ClientboundPackets1_19.BLOCK_ACTION);
blockRewriter.registerBlockChange(ClientboundPackets1_19.BLOCK_CHANGE);
blockRewriter.registerVarLongMultiBlockChange(ClientboundPackets1_19.MULTI_BLOCK_CHANGE);
blockRewriter.registerEffect(ClientboundPackets1_19.EFFECT, 1010, 2001);
registerCreativeInvAction(ServerboundPackets1_17.CREATIVE_INVENTORY_ACTION, Type.FLAT_VAR_INT_ITEM);
protocol.registerClientbound(ClientboundPackets1_19.TRADE_LIST, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Container id
handler(wrapper -> {
final int size = wrapper.read(Type.VAR_INT);
wrapper.write(Type.UNSIGNED_BYTE, (short) size);
for (int i = 0; i < size; i++) {
handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // First item
handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // Result
final Item secondItem = wrapper.read(Type.FLAT_VAR_INT_ITEM);
if (secondItem != null) {
handleItemToClient(secondItem);
wrapper.write(Type.BOOLEAN, true);
wrapper.write(Type.FLAT_VAR_INT_ITEM, secondItem);
} else {
wrapper.write(Type.BOOLEAN, false);
}
wrapper.passthrough(Type.BOOLEAN); // Out of stock
wrapper.passthrough(Type.INT); // Uses
wrapper.passthrough(Type.INT); // Max uses
wrapper.passthrough(Type.INT); // Xp
wrapper.passthrough(Type.INT); // Special price diff
wrapper.passthrough(Type.FLOAT); // Price multiplier
wrapper.passthrough(Type.INT); //Demand
}
});
}
});
registerWindowPropertyEnchantmentHandler(ClientboundPackets1_19.WINDOW_PROPERTY);
protocol.registerClientbound(ClientboundPackets1_19.BLOCK_CHANGED_ACK, null, new PacketRemapper() {
@Override
public void registerMap() {
read(Type.VAR_INT); // Sequence
handler(PacketWrapper::cancel); // This is fine:tm:
}
});
protocol.registerClientbound(ClientboundPackets1_19.SPAWN_PARTICLE, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT, Type.INT); // Particle id
map(Type.BOOLEAN); // Override limiter
map(Type.DOUBLE); // X
map(Type.DOUBLE); // Y
map(Type.DOUBLE); // Z
map(Type.FLOAT); // Offset X
map(Type.FLOAT); // Offset Y
map(Type.FLOAT); // Offset Z
map(Type.FLOAT); // Max speed
map(Type.INT); // Particle Count
handler(wrapper -> {
final int id = wrapper.get(Type.INT, 0);
final ParticleMappings particleMappings = protocol.getMappingData().getParticleMappings();
if (id == particleMappings.id("sculk_charge")) {
//TODO
wrapper.set(Type.INT, 0, -1);
wrapper.cancel();
} else if (id == particleMappings.id("shriek")) {
//TODO
wrapper.set(Type.INT, 0, -1);
wrapper.cancel();
} else if (id == particleMappings.id("vibration")) {
// Can't do without the position
wrapper.set(Type.INT, 0, -1);
wrapper.cancel();
}
});
handler(getSpawnParticleHandler(Type.FLAT_VAR_INT_ITEM));
}
});
protocol.registerClientbound(ClientboundPackets1_19.CHUNK_DATA, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user());
final Chunk1_18Type chunkType = new Chunk1_18Type(tracker.currentWorldSectionHeight(),
MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().mappedSize()),
MathUtil.ceilLog2(tracker.biomesSent()));
final Chunk chunk = wrapper.passthrough(chunkType);
for (final ChunkSection section : chunk.getSections()) {
final DataPalette blockPalette = section.palette(PaletteType.BLOCKS);
for (int i = 0; i < blockPalette.size(); i++) {
final int id = blockPalette.idByIndex(i);
blockPalette.setIdByIndex(i, protocol.getMappingData().getNewBlockStateId(id));
}
}
});
}
});
// The server does nothing but track the sequence, so we can just set it as 0
protocol.registerServerbound(ServerboundPackets1_17.PLAYER_DIGGING, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Action
map(Type.POSITION1_14); // Block position
map(Type.UNSIGNED_BYTE); // Direction
create(Type.VAR_INT, 0); // Sequence
}
});
protocol.registerServerbound(ServerboundPackets1_17.PLAYER_BLOCK_PLACEMENT, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Hand
map(Type.POSITION1_14); // Block position
map(Type.VAR_INT); // Direction
map(Type.FLOAT); // X
map(Type.FLOAT); // Y
map(Type.FLOAT); // Z
map(Type.BOOLEAN); // Inside
create(Type.VAR_INT, 0); // Sequence
}
});
protocol.registerServerbound(ServerboundPackets1_17.USE_ITEM, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Hand
create(Type.VAR_INT, 0); // Sequence
}
});
protocol.registerServerbound(ServerboundPackets1_17.SET_BEACON_EFFECT, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final int primaryEffect = wrapper.read(Type.VAR_INT);
if (primaryEffect != -1) {
wrapper.write(Type.BOOLEAN, true);
wrapper.write(Type.VAR_INT, primaryEffect);
} else {
wrapper.write(Type.BOOLEAN, false);
}
final int secondaryEffect = wrapper.read(Type.VAR_INT);
if (secondaryEffect != -1) {
wrapper.write(Type.BOOLEAN, true);
wrapper.write(Type.VAR_INT, secondaryEffect);
} else {
wrapper.write(Type.BOOLEAN, false);
}
});
}
});
}
}
@@ -0,0 +1,331 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2To1_19;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage.DimensionRegistryStorage;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage.StoredPainting;
import com.viaversion.viaversion.api.data.ParticleMappings;
import com.viaversion.viaversion.api.data.entity.StoredEntityData;
import com.viaversion.viaversion.api.minecraft.Position;
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.metadata.MetaType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.Particle;
import com.viaversion.viaversion.api.type.types.version.Types1_18;
import com.viaversion.viaversion.api.type.types.version.Types1_19;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
public final class EntityPackets1_19 extends EntityRewriter<Protocol1_18_2To1_19> {
public EntityPackets1_19(final Protocol1_18_2To1_19 protocol) {
super(protocol);
}
@Override
protected void registerPackets() {
registerTracker(ClientboundPackets1_19.SPAWN_EXPERIENCE_ORB, Entity1_19Types.EXPERIENCE_ORB);
registerTracker(ClientboundPackets1_19.SPAWN_PLAYER, Entity1_19Types.PLAYER);
registerMetadataRewriter(ClientboundPackets1_19.ENTITY_METADATA, Types1_19.METADATA_LIST, Types1_18.METADATA_LIST);
registerRemoveEntities(ClientboundPackets1_19.REMOVE_ENTITIES);
protocol.registerClientbound(ClientboundPackets1_19.SPAWN_ENTITY, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Entity id
map(Type.UUID); // Entity UUID
map(Type.VAR_INT); // Entity Type
map(Type.DOUBLE); // X
map(Type.DOUBLE); // Y
map(Type.DOUBLE); // Z
map(Type.BYTE); // Pitch
map(Type.BYTE); // Yaw
handler(wrapper -> {
final byte headYaw = wrapper.read(Type.BYTE);
int data = wrapper.read(Type.VAR_INT);
final EntityType entityType = setOldEntityId(wrapper);
if (entityType.isOrHasParent(Entity1_19Types.LIVINGENTITY)) {
wrapper.write(Type.BYTE, headYaw);
// Switch pitch and yaw position
final byte pitch = wrapper.get(Type.BYTE, 0);
final byte yaw = wrapper.get(Type.BYTE, 1);
wrapper.set(Type.BYTE, 0, yaw);
wrapper.set(Type.BYTE, 1, pitch);
wrapper.setPacketType(ClientboundPackets1_18.SPAWN_MOB);
return;
} else if (entityType == Entity1_19Types.PAINTING) {
wrapper.cancel();
// The entity has been tracked, now we wait for the metadata packet
final int entityId = wrapper.get(Type.VAR_INT, 0);
final StoredEntityData entityData = tracker(wrapper.user()).entityData(entityId);
final Position position = new Position(wrapper.get(Type.DOUBLE, 0).intValue(), wrapper.get(Type.DOUBLE, 1).intValue(), wrapper.get(Type.DOUBLE, 2).intValue());
entityData.put(new StoredPainting(entityId, wrapper.get(Type.UUID, 0), position, data));
return;
}
if (entityType == Entity1_19Types.FALLING_BLOCK) {
data = protocol.getMappingData().getNewBlockStateId(data);
}
wrapper.write(Type.INT, data);
});
}
});
protocol.registerClientbound(ClientboundPackets1_19.ENTITY_EFFECT, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT); // Entity id
map(Type.VAR_INT); // Effect id
map(Type.BYTE); // Amplifier
map(Type.VAR_INT); // Duration
map(Type.BYTE); // Flags
handler(wrapper -> {
// Remove factor data
if (wrapper.read(Type.BOOLEAN)) {
wrapper.read(Type.NBT);
}
});
}
});
protocol.registerClientbound(ClientboundPackets1_19.JOIN_GAME, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.INT); // Entity ID
map(Type.BOOLEAN); // Hardcore
map(Type.UNSIGNED_BYTE); // Gamemode
map(Type.BYTE); // Previous Gamemode
map(Type.STRING_ARRAY); // Worlds
map(Type.NBT); // Dimension registry
handler(wrapper -> {
final DimensionRegistryStorage dimensionRegistryStorage = wrapper.user().get(DimensionRegistryStorage.class);
dimensionRegistryStorage.clear();
// Cache dimensions and find current dimension
final String dimensionKey = wrapper.read(Type.STRING);
final CompoundTag registry = wrapper.get(Type.NBT, 0);
final ListTag dimensions = ((CompoundTag) registry.get("minecraft:dimension_type")).get("value");
boolean found = false;
for (final Tag dimension : dimensions) {
final CompoundTag dimensionCompound = (CompoundTag) dimension;
final StringTag nameTag = dimensionCompound.get("name");
final CompoundTag dimensionData = dimensionCompound.get("element");
dimensionRegistryStorage.addDimension(nameTag.getValue(), dimensionData.clone());
if (!found && nameTag.getValue().equals(dimensionKey)) {
wrapper.write(Type.NBT, dimensionData);
found = true;
}
}
if (!found) {
throw new IllegalStateException("Could not find dimension " + dimensionKey + " in dimension registry");
}
// Add biome category and track biomes
final CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome");
final ListTag biomes = biomeRegistry.get("value");
for (final Tag biome : biomes.getValue()) {
final CompoundTag biomeCompound = ((CompoundTag) biome).get("element");
biomeCompound.put("category", new StringTag("none"));
}
tracker(wrapper.user()).setBiomesSent(biomes.size());
// Cache and remove chat types
final ListTag chatTypes = ((CompoundTag) registry.remove("minecraft:chat_type")).get("value");
for (final Tag chatType : chatTypes) {
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
final NumberTag idTag = chatTypeCompound.get("id");
dimensionRegistryStorage.addChatType(idTag.asInt(), chatTypeCompound);
}
});
map(Type.STRING); // World
map(Type.LONG); // Seed
map(Type.VAR_INT); // Max players
map(Type.VAR_INT); // Chunk radius
map(Type.VAR_INT); // Simulation distance
map(Type.BOOLEAN); // Reduced debug info
map(Type.BOOLEAN); // Show death screen
map(Type.BOOLEAN); // Debug
map(Type.BOOLEAN); // Flat
read(Type.OPTIONAL_GLOBAL_POSITION); // Read last death location
handler(worldDataTrackerHandler(1));
handler(playerTrackerHandler());
}
});
protocol.registerClientbound(ClientboundPackets1_19.RESPAWN, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final String dimensionKey = wrapper.read(Type.STRING);
final CompoundTag dimension = wrapper.user().get(DimensionRegistryStorage.class).dimension(dimensionKey);
if (dimension == null) {
throw new IllegalArgumentException("Could not find dimension " + dimensionKey + " in dimension registry");
}
wrapper.write(Type.NBT, dimension);
});
map(Type.STRING); // World
map(Type.LONG); // Seed
map(Type.UNSIGNED_BYTE); // Gamemode
map(Type.BYTE); // Previous gamemode
map(Type.BOOLEAN); // Debug
map(Type.BOOLEAN); // Flat
map(Type.BOOLEAN); // Keep player data
read(Type.OPTIONAL_GLOBAL_POSITION); // Read last death location
handler(worldDataTrackerHandler(0));
}
});
protocol.registerClientbound(ClientboundPackets1_19.PLAYER_INFO, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final int action = wrapper.passthrough(Type.VAR_INT);
final int entries = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < entries; i++) {
wrapper.passthrough(Type.UUID); // UUID
if (action == 0) { // Add player
wrapper.passthrough(Type.STRING); // Player Name
final int properties = wrapper.passthrough(Type.VAR_INT);
for (int j = 0; j < properties; j++) {
wrapper.passthrough(Type.STRING); // Name
wrapper.passthrough(Type.STRING); // Value
wrapper.passthrough(Type.OPTIONAL_STRING); // Signature
}
wrapper.passthrough(Type.VAR_INT); // Gamemode
wrapper.passthrough(Type.VAR_INT); // Ping
wrapper.passthrough(Type.OPTIONAL_COMPONENT); // Display name
// Remove public profile signature
wrapper.read(Type.OPTIONAL_PROFILE_KEY);
} else if (action == 1 || action == 2) { // Update gamemode/update latency
wrapper.passthrough(Type.VAR_INT);
} else if (action == 3) { // Update display name
wrapper.passthrough(Type.OPTIONAL_COMPONENT);
}
}
});
}
});
}
@Override
protected void registerRewrites() {
filter().handler((event, meta) -> {
if (meta.metaType().typeId() <= Types1_18.META_TYPES.poseType.typeId()) {
meta.setMetaType(Types1_18.META_TYPES.byId(meta.metaType().typeId()));
}
final MetaType type = meta.metaType();
if (type == Types1_18.META_TYPES.particleType) {
final Particle particle = (Particle) meta.getValue();
final ParticleMappings particleMappings = protocol.getMappingData().getParticleMappings();
if (particle.getId() == particleMappings.id("sculk_charge")) {
//TODO
event.cancel();
return;
} else if (particle.getId() == particleMappings.id("shriek")) {
//TODO
event.cancel();
return;
} else if (particle.getId() == particleMappings.id("vibration")) {
// Can't do without the position
event.cancel();
return;
}
rewriteParticle(particle);
} else if (type == Types1_18.META_TYPES.poseType) {
final int pose = meta.value();
if (pose >= 8) {
// Croaking, using_tongue, roaring, sniffing, emerging, digging -> standing -> standing
meta.setValue(0);
}
}
});
registerMetaTypeHandler(Types1_18.META_TYPES.itemType, Types1_18.META_TYPES.blockStateType, null, Types1_18.META_TYPES.optionalComponentType);
filter().filterFamily(Entity1_19Types.MINECART_ABSTRACT).index(11).handler((event, meta) -> {
final int data = (int) meta.getValue();
meta.setValue(protocol.getMappingData().getNewBlockStateId(data));
});
filter().type(Entity1_19Types.PAINTING).index(8).handler((event, meta) -> {
event.cancel();
final StoredEntityData entityData = tracker(event.user()).entityDataIfPresent(event.entityId());
final StoredPainting storedPainting = entityData.remove(StoredPainting.class);
if (storedPainting != null) {
final PacketWrapper packet = PacketWrapper.create(ClientboundPackets1_18.SPAWN_PAINTING, event.user());
packet.write(Type.VAR_INT, storedPainting.entityId());
packet.write(Type.UUID, storedPainting.uuid());
packet.write(Type.VAR_INT, meta.value());
packet.write(Type.POSITION1_14, storedPainting.position());
packet.write(Type.BYTE, storedPainting.direction());
try {
// TODO Race condition
packet.send(Protocol1_18_2To1_19.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
filter().type(Entity1_19Types.CAT).index(19).handler((event, meta) -> meta.setMetaType(Types1_18.META_TYPES.varIntType));
filter().type(Entity1_19Types.FROG).cancel(16); // Age
filter().type(Entity1_19Types.FROG).cancel(17); // Variant
filter().type(Entity1_19Types.FROG).cancel(18); // Tongue target
filter().type(Entity1_19Types.WARDEN).cancel(16); // Anger
filter().type(Entity1_19Types.GOAT).cancel(18);
filter().type(Entity1_19Types.GOAT).cancel(19);
}
@Override
public void onMappingDataLoaded() {
mapTypes();
mapEntityTypeWithData(Entity1_19Types.FROG, Entity1_19Types.RABBIT).jsonName();
mapEntityTypeWithData(Entity1_19Types.TADPOLE, Entity1_19Types.PUFFERFISH).jsonName();
mapEntityTypeWithData(Entity1_19Types.CHEST_BOAT, Entity1_19Types.BOAT);
mapEntityTypeWithData(Entity1_19Types.WARDEN, Entity1_19Types.IRON_GOLEM).jsonName();
mapEntityTypeWithData(Entity1_19Types.ALLAY, Entity1_19Types.VEX).jsonName();
}
@Override
public EntityType typeFromId(final int typeId) {
return Entity1_19Types.getTypeFromId(typeId);
}
}
@@ -0,0 +1,61 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage;
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2To1_19;
import com.viaversion.viaversion.api.connection.StorableObject;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.HashMap;
import java.util.Map;
public final class DimensionRegistryStorage implements StorableObject {
private final Map<String, CompoundTag> dimensions = new HashMap<>();
private final Int2ObjectMap<CompoundTag> chatTypes = new Int2ObjectOpenHashMap<>();
public @Nullable CompoundTag dimension(final String dimensionKey) {
final CompoundTag compoundTag = dimensions.get(dimensionKey);
return compoundTag != null ? compoundTag.clone() : null;
}
public void addDimension(final String dimensionKey, final CompoundTag dimension) {
dimensions.put(dimensionKey, dimension);
}
public @Nullable CompoundTag chatType(final int id) {
return chatTypes.isEmpty() ? Protocol1_18_2To1_19.MAPPINGS.chatType(id) : chatTypes.get(id);
}
public void addChatType(final int id, final CompoundTag chatType) {
chatTypes.put(id, chatType);
}
public void clear() {
dimensions.clear();
chatTypes.clear();
}
@Override
public boolean clearOnServerSwitch() {
return false;
}
}
@@ -0,0 +1,71 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
import com.viaversion.viaversion.api.minecraft.Position;
import java.util.UUID;
public final class StoredPainting implements StorableObject {
private final int entityId;
private final UUID uuid;
private final Position position;
private final byte direction;
public StoredPainting(final int entityId, final UUID uuid, final Position position, final int direction3d) {
this.entityId = entityId;
this.uuid = uuid;
this.position = position;
this.direction = to2dDirection(direction3d);
}
public int entityId() {
return entityId;
}
public UUID uuid() {
return uuid;
}
public Position position() {
return position;
}
public byte direction() {
return direction;
}
private byte to2dDirection(int direction) {
switch (direction) {
case 0:
case 1:
return -1; // No worky
case 2:
return 2;
case 3:
return 0;
case 4:
return 1;
case 5:
return 3;
}
throw new IllegalArgumentException("Invalid direction: " + direction);
}
}
@@ -39,7 +39,7 @@ public final class CommandRewriter1_18_2 extends CommandRewriter {
}
@Override
protected @Nullable String handleArgumentType(String argumentType) {
public @Nullable String handleArgumentType(String argumentType) {
if (argumentType.equals("minecraft:resource") || argumentType.equals("minecraft:resource_or_tag")) {
return "brigadier:string";
}
@@ -0,0 +1,404 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3;
import com.google.common.base.Preconditions;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.data.BackwardsMappings;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.packets.BlockItemPackets1_19_3;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.packets.EntityPackets1_19_3;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.storage.ChatSessionStorage;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.storage.ChatTypeStorage1_19_3;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.storage.NonceStorage;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.Protocol1_19To1_19_1;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ProfileKey;
import com.viaversion.viaversion.api.minecraft.RegistryType;
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19_3Types;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
import com.viaversion.viaversion.api.rewriter.EntityRewriter;
import com.viaversion.viaversion.api.rewriter.ItemRewriter;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.BitSetType;
import com.viaversion.viaversion.api.type.types.ByteArrayType;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.kyori.adventure.text.Component;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ClientboundPackets1_19_1;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ServerboundPackets1_19_1;
import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.ClientboundPackets1_19_3;
import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.Protocol1_19_3To1_19_1;
import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.ServerboundPackets1_19_3;
import com.viaversion.viaversion.rewriter.CommandRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.util.CipherUtil;
import java.util.BitSet;
public final class Protocol1_19_1To1_19_3 extends BackwardsProtocol<ClientboundPackets1_19_3, ClientboundPackets1_19_1, ServerboundPackets1_19_3, ServerboundPackets1_19_1> {
public static final BackwardsMappings MAPPINGS = new BackwardsMappings();
private static final ByteArrayType.OptionalByteArrayType OPTIONAL_SIGNATURE_BYTES_TYPE = new ByteArrayType.OptionalByteArrayType(256);
private static final ByteArrayType SIGNATURE_BYTES_TYPE = new ByteArrayType(256);
private final EntityPackets1_19_3 entityRewriter = new EntityPackets1_19_3(this);
private final BlockItemPackets1_19_3 itemRewriter = new BlockItemPackets1_19_3(this);
private final TranslatableRewriter translatableRewriter = new TranslatableRewriter(this);
public Protocol1_19_1To1_19_3() {
super(ClientboundPackets1_19_3.class, ClientboundPackets1_19_1.class, ServerboundPackets1_19_3.class, ServerboundPackets1_19_1.class);
}
@Override
protected void registerPackets() {
executeAsyncAfterLoaded(Protocol1_19_3To1_19_1.class, () -> {
MAPPINGS.load();
entityRewriter.onMappingDataLoaded();
});
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_3.SYSTEM_CHAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_3.ACTIONBAR);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_3.TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_3.TITLE_SUBTITLE);
translatableRewriter.registerBossBar(ClientboundPackets1_19_3.BOSSBAR);
translatableRewriter.registerDisconnect(ClientboundPackets1_19_3.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_19_3.TAB_LIST);
translatableRewriter.registerOpenWindow(ClientboundPackets1_19_3.OPEN_WINDOW);
translatableRewriter.registerCombatKill(ClientboundPackets1_19_3.COMBAT_KILL);
translatableRewriter.registerPing();
itemRewriter.register();
entityRewriter.register();
final SoundRewriter soundRewriter = new SoundRewriter(this);
soundRewriter.registerStopSound(ClientboundPackets1_19_3.STOP_SOUND);
registerClientbound(ClientboundPackets1_19_3.SOUND, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final int soundId = wrapper.read(Type.VAR_INT) - 1; // Normalize the id
if (soundId != -1) {
final int mappedId = MAPPINGS.getSoundMappings().getNewId(soundId);
if (mappedId == -1) {
wrapper.cancel();
return;
}
wrapper.write(Type.VAR_INT, mappedId + 1);
return;
}
String soundIdentifier = wrapper.read(Type.STRING);
wrapper.read(Type.OPTIONAL_FLOAT); // Fixed range
final String mappedIdentifier = MAPPINGS.getMappedNamedSound(soundIdentifier);
if (mappedIdentifier != null) {
if (mappedIdentifier.isEmpty()) {
wrapper.cancel();
return;
}
soundIdentifier = mappedIdentifier;
}
wrapper.write(Type.STRING, soundIdentifier);
wrapper.setPacketType(ClientboundPackets1_19_1.NAMED_SOUND);
});
}
});
registerClientbound(ClientboundPackets1_19_3.ENTITY_SOUND, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final int soundId = wrapper.read(Type.VAR_INT) - 1; // Normalize the id
if (soundId != -1) {
final int mappedId = MAPPINGS.getSoundMappings().getNewId(soundId);
if (mappedId == -1) {
wrapper.cancel();
return;
}
wrapper.write(Type.VAR_INT, mappedId + 1);
}
// Convert the resource location to the corresponding integer id
String soundIdentifier = wrapper.read(Type.STRING);
wrapper.read(Type.OPTIONAL_FLOAT); // Fixed range
final String mappedIdentifier = MAPPINGS.getMappedNamedSound(soundIdentifier);
if (mappedIdentifier != null) {
if (mappedIdentifier.isEmpty()) {
wrapper.cancel();
return;
}
soundIdentifier = mappedIdentifier;
}
final int mappedId = MAPPINGS.mappedSound(soundIdentifier);
if (mappedId == -1) {
wrapper.cancel();
return;
}
wrapper.write(Type.VAR_INT, mappedId);
});
}
});
final TagRewriter tagRewriter = new TagRewriter(this);
tagRewriter.addEmptyTag(RegistryType.BLOCK, "minecraft:non_flammable_wood");
tagRewriter.addEmptyTag(RegistryType.ITEM, "minecraft:overworld_natural_logs");
tagRewriter.registerGeneric(ClientboundPackets1_19_3.TAGS);
new StatisticsRewriter(this).register(ClientboundPackets1_19_3.STATISTICS);
final CommandRewriter commandRewriter = new CommandRewriter(this);
registerClientbound(ClientboundPackets1_19_3.DECLARE_COMMANDS, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final int size = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < size; i++) {
final byte flags = wrapper.passthrough(Type.BYTE);
wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE); // Children indices
if ((flags & 0x08) != 0) {
wrapper.passthrough(Type.VAR_INT); // Redirect node index
}
final int nodeType = flags & 0x03;
if (nodeType == 1 || nodeType == 2) { // Literal/argument node
wrapper.passthrough(Type.STRING); // Name
}
if (nodeType == 2) { // Argument node
final int argumentTypeId = wrapper.read(Type.VAR_INT);
final int mappedArgumentTypeId = MAPPINGS.getArgumentTypeMappings().mappings().getNewId(argumentTypeId);
Preconditions.checkArgument(mappedArgumentTypeId != -1, "Unknown command argument type id: " + argumentTypeId);
wrapper.write(Type.VAR_INT, mappedArgumentTypeId);
final String identifier = MAPPINGS.getArgumentTypeMappings().identifier(argumentTypeId);
commandRewriter.handleArgument(wrapper, identifier);
if (identifier.equals("minecraft:gamemode")) {
wrapper.write(Type.VAR_INT, 0); // Word
}
if ((flags & 0x10) != 0) {
wrapper.passthrough(Type.STRING); // Suggestion type
}
}
}
wrapper.passthrough(Type.VAR_INT); // Root node index
});
}
});
registerClientbound(ClientboundPackets1_19_3.SERVER_DATA, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.OPTIONAL_COMPONENT); // Motd
map(Type.OPTIONAL_STRING); // Encoded icon
create(Type.BOOLEAN, false); // Previews chat
}
});
// Remove the key once again
registerServerbound(State.LOGIN, ServerboundLoginPackets.HELLO.getId(), ServerboundLoginPackets.HELLO.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Name
handler(wrapper -> {
final ProfileKey profileKey = wrapper.read(Type.OPTIONAL_PROFILE_KEY);
if (profileKey == null) {
wrapper.user().put(new NonceStorage(null));
}
});
}
});
registerClientbound(State.LOGIN, ClientboundLoginPackets.HELLO.getId(), ClientboundLoginPackets.HELLO.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Server id
handler(wrapper -> {
if (wrapper.user().has(NonceStorage.class)) {
return;
}
final byte[] publicKey = wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
final byte[] nonce = wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
wrapper.user().put(new NonceStorage(CipherUtil.encryptNonce(publicKey, nonce)));
});
}
});
registerServerbound(State.LOGIN, ServerboundLoginPackets.ENCRYPTION_KEY.getId(), ServerboundLoginPackets.ENCRYPTION_KEY.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.BYTE_ARRAY_PRIMITIVE); // Keys
handler(wrapper -> {
final NonceStorage nonceStorage = wrapper.user().remove(NonceStorage.class);
final boolean isNonce = wrapper.read(Type.BOOLEAN);
if (!isNonce) {
wrapper.read(Type.LONG); // Salt
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, nonceStorage.nonce() != null ? nonceStorage.nonce() : new byte[0]);
}
});
}
});
registerServerbound(ServerboundPackets1_19_1.CHAT_MESSAGE, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Message
map(Type.LONG); // Timestamp
map(Type.LONG); // Salt
read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
create(OPTIONAL_SIGNATURE_BYTES_TYPE, null); // No signature
read(Type.BOOLEAN); // Signed preview
read(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY); // Last seen messages
read(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE); // Last received message
handler(wrapper -> {
//TODO is this fine (probably not)? same for chat_command
final int offset = 0;
final BitSet acknowledged = new BitSet(20);
wrapper.write(Type.VAR_INT, offset);
wrapper.write(new BitSetType(20), acknowledged);
});
}
});
registerServerbound(ServerboundPackets1_19_1.CHAT_COMMAND, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Command
map(Type.LONG); // Timestamp
map(Type.LONG); // Salt
handler(wrapper -> {
final int signatures = wrapper.read(Type.VAR_INT);
wrapper.write(Type.VAR_INT, 0);
for (int i = 0; i < signatures; i++) {
wrapper.read(Type.STRING); // Name
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
}
wrapper.read(Type.BOOLEAN); // Signed preview
final int offset = 0;
final BitSet acknowledged = new BitSet(20);
wrapper.write(Type.VAR_INT, offset);
wrapper.write(new BitSetType(20), acknowledged);
});
read(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY); // Last seen messages
read(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE); // Last received message
}
});
registerClientbound(ClientboundPackets1_19_3.PLAYER_CHAT, ClientboundPackets1_19_1.SYSTEM_CHAT, new PacketRemapper() {
@Override
public void registerMap() {
read(Type.UUID); // Sender
read(Type.VAR_INT); // Index
read(OPTIONAL_SIGNATURE_BYTES_TYPE); // Signature
handler(wrapper -> {
final String plainContent = wrapper.read(Type.STRING);
wrapper.read(Type.LONG); // Timestamp
wrapper.read(Type.LONG); // Salt
final int lastSeen = wrapper.read(Type.VAR_INT);
for (int i = 0; i < lastSeen; i++) {
final int index = wrapper.read(Type.VAR_INT);
if (index == 0) {
wrapper.read(SIGNATURE_BYTES_TYPE);
}
}
final JsonElement unsignedContent = wrapper.read(Type.OPTIONAL_COMPONENT);
final JsonElement content = unsignedContent != null ? unsignedContent : GsonComponentSerializer.gson().serializeToTree(Component.text(plainContent));
translatableRewriter.processText(content);
final int filterMaskType = wrapper.read(Type.VAR_INT);
if (filterMaskType == 2) {
wrapper.read(Type.LONG_ARRAY_PRIMITIVE); // Mask
}
final int chatTypeId = wrapper.read(Type.VAR_INT);
final JsonElement senderName = wrapper.read(Type.COMPONENT);
final JsonElement targetName = wrapper.read(Type.OPTIONAL_COMPONENT);
final JsonElement result = Protocol1_19To1_19_1.decorateChatMessage(wrapper.user().get(ChatTypeStorage1_19_3.class), chatTypeId, senderName, targetName, content);
if (result == null) {
wrapper.cancel();
return;
}
wrapper.write(Type.COMPONENT, result);
wrapper.write(Type.BOOLEAN, false);
});
}
});
registerClientbound(ClientboundPackets1_19_3.DISGUISED_CHAT, ClientboundPackets1_19_1.SYSTEM_CHAT, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final JsonElement content = wrapper.read(Type.COMPONENT);
translatableRewriter.processText(content);
final int chatTypeId = wrapper.read(Type.VAR_INT);
final JsonElement senderName = wrapper.read(Type.COMPONENT);
final JsonElement targetName = wrapper.read(Type.OPTIONAL_COMPONENT);
final JsonElement result = Protocol1_19To1_19_1.decorateChatMessage(wrapper.user().get(ChatTypeStorage1_19_3.class), chatTypeId, senderName, targetName, content);
if (result == null) {
wrapper.cancel();
return;
}
wrapper.write(Type.COMPONENT, result);
wrapper.write(Type.BOOLEAN, false);
});
}
});
cancelClientbound(ClientboundPackets1_19_3.UPDATE_ENABLED_FEATURES);
cancelServerbound(ServerboundPackets1_19_1.CHAT_PREVIEW);
cancelServerbound(ServerboundPackets1_19_1.CHAT_ACK);
}
@Override
public void init(final UserConnection user) {
user.put(new ChatSessionStorage());
user.put(new ChatTypeStorage1_19_3());
addEntityTracker(user, new EntityTrackerBase(user, Entity1_19_3Types.PLAYER, true));
}
@Override
public BackwardsMappings getMappingData() {
return MAPPINGS;
}
@Override
public TranslatableRewriter getTranslatableRewriter() {
return translatableRewriter;
}
@Override
public ItemRewriter getItemRewriter() {
return itemRewriter;
}
@Override
public EntityRewriter getEntityRewriter() {
return entityRewriter;
}
}
@@ -0,0 +1,46 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.data;
import com.viaversion.viaversion.libs.fastutil.objects.Object2IntMap;
import com.viaversion.viaversion.libs.fastutil.objects.Object2IntOpenHashMap;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.Protocol1_19_3To1_19_1;
public final class BackwardsMappings extends com.viaversion.viabackwards.api.data.BackwardsMappings {
private final Object2IntMap<String> mappedSounds = new Object2IntOpenHashMap<>();
public BackwardsMappings() {
super("1.19.3", "1.19", Protocol1_19_3To1_19_1.class, true);
mappedSounds.defaultReturnValue(-1);
}
@Override
protected void loadVBExtras(final JsonObject unmapped, final JsonObject mapped) {
int i = 0;
for (final JsonElement sound : mapped.getAsJsonArray("sounds")) {
mappedSounds.put(sound.getAsString(), i++);
}
}
public int mappedSound(final String sound) {
return mappedSounds.getInt(sound.replace("minecraft:", ""));
}
}
@@ -0,0 +1,141 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.packets;
import com.viaversion.viabackwards.api.rewriters.ItemRewriter;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.Protocol1_19_1To1_19_3;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.protocols.protocol1_16to1_15_2.data.RecipeRewriter1_16;
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.types.Chunk1_18Type;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ServerboundPackets1_19_1;
import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.ClientboundPackets1_19_3;
import com.viaversion.viaversion.rewriter.BlockRewriter;
public final class BlockItemPackets1_19_3 extends ItemRewriter<Protocol1_19_1To1_19_3> {
public BlockItemPackets1_19_3(final Protocol1_19_1To1_19_3 protocol) {
super(protocol);
}
@Override
protected void registerPackets() {
final BlockRewriter blockRewriter = new BlockRewriter(protocol, Type.POSITION1_14);
blockRewriter.registerBlockAction(ClientboundPackets1_19_3.BLOCK_ACTION);
blockRewriter.registerBlockChange(ClientboundPackets1_19_3.BLOCK_CHANGE);
blockRewriter.registerVarLongMultiBlockChange(ClientboundPackets1_19_3.MULTI_BLOCK_CHANGE);
blockRewriter.registerEffect(ClientboundPackets1_19_3.EFFECT, 1010, 2001);
blockRewriter.registerChunkData1_19(ClientboundPackets1_19_3.CHUNK_DATA, Chunk1_18Type::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_19_3.BLOCK_ENTITY_DATA);
registerSetCooldown(ClientboundPackets1_19_3.COOLDOWN);
registerWindowItems1_17_1(ClientboundPackets1_19_3.WINDOW_ITEMS);
registerSetSlot1_17_1(ClientboundPackets1_19_3.SET_SLOT);
registerEntityEquipmentArray(ClientboundPackets1_19_3.ENTITY_EQUIPMENT);
registerAdvancements(ClientboundPackets1_19_3.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
registerClickWindow1_17_1(ServerboundPackets1_19_1.CLICK_WINDOW);
registerTradeList1_19(ClientboundPackets1_19_3.TRADE_LIST);
registerCreativeInvAction(ServerboundPackets1_19_1.CREATIVE_INVENTORY_ACTION, Type.FLAT_VAR_INT_ITEM);
registerWindowPropertyEnchantmentHandler(ClientboundPackets1_19_3.WINDOW_PROPERTY);
registerSpawnParticle1_19(ClientboundPackets1_19_3.SPAWN_PARTICLE);
protocol.registerClientbound(ClientboundPackets1_19_3.EXPLOSION, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.DOUBLE, Type.FLOAT); // X
map(Type.DOUBLE, Type.FLOAT); // Y
map(Type.DOUBLE, Type.FLOAT); // Z
}
});
final RecipeRewriter1_16 recipeRewriter = new RecipeRewriter1_16(protocol);
protocol.registerClientbound(ClientboundPackets1_19_3.DECLARE_RECIPES, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final int size = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < size; i++) {
final String type = wrapper.passthrough(Type.STRING).replace("minecraft:", "");
wrapper.passthrough(Type.STRING); // Recipe Identifier
switch (type) {
case "crafting_shapeless": {
wrapper.passthrough(Type.STRING); // Group
wrapper.read(Type.VAR_INT); // Crafting book category
final int ingredients = wrapper.passthrough(Type.VAR_INT);
for (int j = 0; j < ingredients; j++) {
final Item[] items = wrapper.passthrough(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); // Ingredients
for (final Item item : items) {
handleItemToClient(item);
}
}
handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // Result
break;
}
case "crafting_shaped": {
final int ingredients = wrapper.passthrough(Type.VAR_INT) * wrapper.passthrough(Type.VAR_INT);
wrapper.passthrough(Type.STRING); // Group
wrapper.read(Type.VAR_INT); // Crafting book category
for (int j = 0; j < ingredients; j++) {
final Item[] items = wrapper.passthrough(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); // Ingredients
for (final Item item : items) {
handleItemToClient(item);
}
}
handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // Result
break;
}
case "smelting":
case "campfire_cooking":
case "blasting":
case "smoking":
wrapper.passthrough(Type.STRING); // Group
wrapper.read(Type.VAR_INT); // Crafting book category
final Item[] items = wrapper.passthrough(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); // Ingredients
for (final Item item : items) {
handleItemToClient(item);
}
handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // Result
wrapper.passthrough(Type.FLOAT); // EXP
wrapper.passthrough(Type.VAR_INT); // Cooking time
break;
case "crafting_special_armordye":
case "crafting_special_bookcloning":
case "crafting_special_mapcloning":
case "crafting_special_mapextending":
case "crafting_special_firework_rocket":
case "crafting_special_firework_star":
case "crafting_special_firework_star_fade":
case "crafting_special_tippedarrow":
case "crafting_special_bannerduplicate":
case "crafting_special_shielddecoration":
case "crafting_special_shulkerboxcoloring":
case "crafting_special_suspiciousstew":
case "crafting_special_repairitem":
wrapper.read(Type.VAR_INT); // Crafting book category
break;
default:
recipeRewriter.handle(wrapper, type);
break;
}
}
});
}
});
}
}
@@ -0,0 +1,293 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.packets;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.Protocol1_19_1To1_19_3;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.storage.ChatTypeStorage1_19_3;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ProfileKey;
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19_3Types;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.BitSetType;
import com.viaversion.viaversion.api.type.types.version.Types1_19;
import com.viaversion.viaversion.api.type.types.version.Types1_19_3;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ClientboundPackets1_19_1;
import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.ClientboundPackets1_19_3;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.BitSet;
import java.util.UUID;
public final class EntityPackets1_19_3 extends EntityRewriter<Protocol1_19_1To1_19_3> {
private static final BitSetType PROFILE_ACTIONS_ENUM_TYPE = new BitSetType(6);
private static final int[] PROFILE_ACTIONS = {2, 4, 5}; // Ignore initialize chat and listed status; add player already handled before
private static final int ADD_PLAYER = 0;
private static final int INITIALIZE_CHAT = 1;
private static final int UPDATE_GAMEMODE = 2;
private static final int UPDATE_LISTED = 3;
private static final int UPDATE_LATENCY = 4;
private static final int UPDATE_DISPLAYNAME = 5;
public EntityPackets1_19_3(final Protocol1_19_1To1_19_3 protocol) {
super(protocol);
}
@Override
protected void registerPackets() {
registerMetadataRewriter(ClientboundPackets1_19_3.ENTITY_METADATA, Types1_19_3.METADATA_LIST, Types1_19.METADATA_LIST);
registerRemoveEntities(ClientboundPackets1_19_3.REMOVE_ENTITIES);
registerTrackerWithData1_19(ClientboundPackets1_19_3.SPAWN_ENTITY, Entity1_19_3Types.FALLING_BLOCK);
protocol.registerClientbound(ClientboundPackets1_19_3.JOIN_GAME, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.INT); // Entity id
map(Type.BOOLEAN); // Hardcore
map(Type.UNSIGNED_BYTE); // Gamemode
map(Type.BYTE); // Previous Gamemode
map(Type.STRING_ARRAY); // World List
map(Type.NBT); // Dimension registry
map(Type.STRING); // Dimension key
map(Type.STRING); // World
handler(dimensionDataHandler());
handler(biomeSizeTracker());
handler(worldDataTrackerHandlerByKey());
handler(wrapper -> {
final ChatTypeStorage1_19_3 chatTypeStorage = wrapper.user().get(ChatTypeStorage1_19_3.class);
chatTypeStorage.clear();
final CompoundTag registry = wrapper.get(Type.NBT, 0);
final ListTag chatTypes = ((CompoundTag) registry.get("minecraft:chat_type")).get("value");
for (final Tag chatType : chatTypes) {
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
final NumberTag idTag = chatTypeCompound.get("id");
chatTypeStorage.addChatType(idTag.asInt(), chatTypeCompound);
}
});
}
});
protocol.registerClientbound(ClientboundPackets1_19_3.RESPAWN, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Dimension
map(Type.STRING); // World
map(Type.LONG); // Seed
map(Type.UNSIGNED_BYTE); // Gamemode
map(Type.BYTE); // Previous gamemode
map(Type.BOOLEAN); // Debug
map(Type.BOOLEAN); // Flat
handler(worldDataTrackerHandlerByKey());
handler(wrapper -> {
// Old clients will always keep entity data (packed here as 0x02), nothing we can do there
final byte keepDataMask = wrapper.read(Type.BYTE);
wrapper.write(Type.BOOLEAN, (keepDataMask & 1) != 0); // Keep attributes
});
}
});
protocol.registerClientbound(ClientboundPackets1_19_3.PLAYER_INFO_UPDATE, ClientboundPackets1_19_1.PLAYER_INFO, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
wrapper.cancel();
final BitSet actions = wrapper.read(PROFILE_ACTIONS_ENUM_TYPE);
final int entries = wrapper.read(Type.VAR_INT);
if (actions.get(ADD_PLAYER)) {
// Special case, as we need to write everything into one action
final PacketWrapper playerInfoPacket = wrapper.create(ClientboundPackets1_19_1.PLAYER_INFO);
playerInfoPacket.write(Type.VAR_INT, 0);
playerInfoPacket.write(Type.VAR_INT, entries);
for (int i = 0; i < entries; i++) {
playerInfoPacket.write(Type.UUID, wrapper.read(Type.UUID));
playerInfoPacket.write(Type.STRING, wrapper.read(Type.STRING)); // Player Name
final int properties = wrapper.read(Type.VAR_INT);
playerInfoPacket.write(Type.VAR_INT, properties);
for (int j = 0; j < properties; j++) {
playerInfoPacket.write(Type.STRING, wrapper.read(Type.STRING)); // Name
playerInfoPacket.write(Type.STRING, wrapper.read(Type.STRING)); // Value
playerInfoPacket.write(Type.OPTIONAL_STRING, wrapper.read(Type.OPTIONAL_STRING)); // Signature
}
// Now check for the other parts individually and add dummy values if not present
final ProfileKey profileKey;
if (actions.get(INITIALIZE_CHAT) && wrapper.read(Type.BOOLEAN)) {
wrapper.read(Type.UUID); // Session UUID
profileKey = wrapper.read(Type.PROFILE_KEY);
} else {
profileKey = null;
}
final int gamemode = actions.get(UPDATE_GAMEMODE) ? wrapper.read(Type.VAR_INT) : 0;
if (actions.get(UPDATE_LISTED)) {
wrapper.read(Type.BOOLEAN); // Listed - throw away
}
final int latency = actions.get(UPDATE_LATENCY) ? wrapper.read(Type.VAR_INT) : 0;
final JsonElement displayName = actions.get(UPDATE_DISPLAYNAME) ? wrapper.read(Type.OPTIONAL_COMPONENT) : null;
playerInfoPacket.write(Type.VAR_INT, gamemode);
playerInfoPacket.write(Type.VAR_INT, latency);
playerInfoPacket.write(Type.OPTIONAL_COMPONENT, displayName);
playerInfoPacket.write(Type.OPTIONAL_PROFILE_KEY, profileKey);
playerInfoPacket.send(Protocol1_19_1To1_19_3.class);
}
return;
}
final PlayerProfileUpdate[] updates = new PlayerProfileUpdate[entries];
for (int i = 0; i < entries; i++) {
final UUID uuid = wrapper.read(Type.UUID);
int gamemode = 0;
int latency = 0;
JsonElement displayName = null;
for (final int action : PROFILE_ACTIONS) {
if (!actions.get(action)) {
continue;
}
switch (action) {
case UPDATE_GAMEMODE:
gamemode = wrapper.read(Type.VAR_INT);
break;
case UPDATE_LATENCY:
latency = wrapper.read(Type.VAR_INT);
break;
case UPDATE_DISPLAYNAME:
displayName = wrapper.read(Type.OPTIONAL_COMPONENT);
break;
}
}
updates[i] = new PlayerProfileUpdate(uuid, gamemode, latency, displayName);
}
if (actions.get(UPDATE_GAMEMODE)) {
sendPlayerProfileUpdate(wrapper.user(), 1, updates);
} else if (actions.get(UPDATE_LATENCY)) {
sendPlayerProfileUpdate(wrapper.user(), 2, updates);
} else if (actions.get(UPDATE_DISPLAYNAME)) {
sendPlayerProfileUpdate(wrapper.user(), 3, updates);
}
});
}
});
protocol.registerClientbound(ClientboundPackets1_19_3.PLAYER_INFO_REMOVE, ClientboundPackets1_19_1.PLAYER_INFO, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final UUID[] uuids = wrapper.read(Type.UUID_ARRAY);
wrapper.write(Type.VAR_INT, 4); // Remove player
wrapper.write(Type.VAR_INT, uuids.length);
for (final UUID uuid : uuids) {
wrapper.write(Type.UUID, uuid);
}
});
}
});
}
private void sendPlayerProfileUpdate(final UserConnection connection, final int action, final PlayerProfileUpdate[] updates) throws Exception {
final PacketWrapper playerInfoPacket = PacketWrapper.create(ClientboundPackets1_19_1.PLAYER_INFO, connection);
playerInfoPacket.write(Type.VAR_INT, action);
playerInfoPacket.write(Type.VAR_INT, updates.length);
for (final PlayerProfileUpdate update : updates) {
playerInfoPacket.write(Type.UUID, update.uuid());
if (action == 1) {
playerInfoPacket.write(Type.VAR_INT, update.gamemode());
} else if (action == 2) {
playerInfoPacket.write(Type.VAR_INT, update.latency());
} else if (action == 3) {
playerInfoPacket.write(Type.OPTIONAL_COMPONENT, update.displayName());
} else {
throw new IllegalArgumentException("Invalid action: " + action);
}
}
playerInfoPacket.send(Protocol1_19_1To1_19_3.class);
}
@Override
public void registerRewrites() {
filter().handler((event, meta) -> {
final int id = meta.metaType().typeId();
if (id > 2) {
meta.setMetaType(Types1_19.META_TYPES.byId(id - 1)); // long added
} else if (id != 2) {
meta.setMetaType(Types1_19.META_TYPES.byId(id));
}
});
registerMetaTypeHandler(Types1_19.META_TYPES.itemType, Types1_19.META_TYPES.blockStateType, Types1_19.META_TYPES.particleType, Types1_19.META_TYPES.optionalComponentType);
filter().filterFamily(Entity1_19_3Types.MINECART_ABSTRACT).index(11).handler((event, meta) -> {
final int data = (int) meta.getValue();
meta.setValue(protocol.getMappingData().getNewBlockStateId(data));
});
filter().type(Entity1_19_3Types.CAMEL).cancel(19); // Dashing
filter().type(Entity1_19_3Types.CAMEL).cancel(20); // Last pose change time
}
@Override
public void onMappingDataLoaded() {
mapTypes();
mapEntityTypeWithData(Entity1_19_3Types.CAMEL, Entity1_19_3Types.DONKEY).jsonName();
}
@Override
public EntityType typeFromId(final int typeId) {
return Entity1_19_3Types.getTypeFromId(typeId);
}
private static final class PlayerProfileUpdate {
private final UUID uuid;
private final int gamemode;
private final int latency;
private final JsonElement displayName;
private PlayerProfileUpdate(final UUID uuid, final int gamemode, final int latency, @Nullable final JsonElement displayName) {
this.uuid = uuid;
this.gamemode = gamemode;
this.latency = latency;
this.displayName = displayName;
}
public UUID uuid() {
return uuid;
}
public int gamemode() {
return gamemode;
}
public int latency() {
return latency;
}
public @Nullable JsonElement displayName() {
return displayName;
}
}
}
@@ -0,0 +1,31 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
import java.util.UUID;
public final class ChatSessionStorage implements StorableObject {
private final UUID uuid = UUID.randomUUID();
public UUID uuid() {
return uuid;
}
}
@@ -0,0 +1,23 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.storage;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.ChatRegistryStorage;
public final class ChatTypeStorage1_19_3 extends ChatRegistryStorage {
}
@@ -0,0 +1,34 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class NonceStorage implements StorableObject {
private final byte[] nonce;
public NonceStorage(final byte @Nullable[] nonce) {
this.nonce = nonce;
}
public byte @Nullable [] nonce() {
return nonce;
}
}
@@ -0,0 +1,431 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1;
import com.google.common.base.Preconditions;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.packets.EntityPackets1_19_1;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.ChatRegistryStorage;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.ChatRegistryStorage1_19_1;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.NonceStorage;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.ReceivedMessagesStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.PlayerMessageSignature;
import com.viaversion.viaversion.api.minecraft.ProfileKey;
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
import com.viaversion.viaversion.api.rewriter.EntityRewriter;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.kyori.adventure.text.Component;
import com.viaversion.viaversion.libs.kyori.adventure.text.TranslatableComponent;
import com.viaversion.viaversion.libs.kyori.adventure.text.format.NamedTextColor;
import com.viaversion.viaversion.libs.kyori.adventure.text.format.Style;
import com.viaversion.viaversion.libs.kyori.adventure.text.format.TextDecoration;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ByteTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ClientboundPackets1_19_1;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ServerboundPackets1_19_1;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ServerboundPackets1_19;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.packets.EntityPackets;
import com.viaversion.viaversion.util.CipherUtil;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public final class Protocol1_19To1_19_1 extends BackwardsProtocol<ClientboundPackets1_19_1, ClientboundPackets1_19, ServerboundPackets1_19_1, ServerboundPackets1_19> {
public static final int SYSTEM_CHAT_ID = 1;
public static final int GAME_INFO_ID = 2;
private static final UUID ZERO_UUID = new UUID(0, 0);
private static final byte[] EMPTY_BYTES = new byte[0];
private final EntityPackets1_19_1 entityRewriter = new EntityPackets1_19_1(this);
private final TranslatableRewriter translatableRewriter = new TranslatableRewriter(this);
public Protocol1_19To1_19_1() {
super(ClientboundPackets1_19_1.class, ClientboundPackets1_19.class, ServerboundPackets1_19_1.class, ServerboundPackets1_19.class);
}
@Override
protected void registerPackets() {
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_1.ACTIONBAR);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_1.TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_1.TITLE_SUBTITLE);
translatableRewriter.registerBossBar(ClientboundPackets1_19_1.BOSSBAR);
translatableRewriter.registerDisconnect(ClientboundPackets1_19_1.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_19_1.TAB_LIST);
translatableRewriter.registerOpenWindow(ClientboundPackets1_19_1.OPEN_WINDOW);
translatableRewriter.registerCombatKill(ClientboundPackets1_19_1.COMBAT_KILL);
translatableRewriter.registerPing();
entityRewriter.register();
registerClientbound(ClientboundPackets1_19_1.JOIN_GAME, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.INT); // Entity ID
map(Type.BOOLEAN); // Hardcore
map(Type.UNSIGNED_BYTE); // Gamemode
map(Type.BYTE); // Previous Gamemode
map(Type.STRING_ARRAY); // World List
map(Type.NBT); // Dimension registry
map(Type.STRING); // Dimension key
map(Type.STRING); // World
handler(wrapper -> {
final ChatRegistryStorage chatTypeStorage = wrapper.user().get(ChatRegistryStorage1_19_1.class);
chatTypeStorage.clear();
final CompoundTag registry = wrapper.get(Type.NBT, 0);
final ListTag chatTypes = ((CompoundTag) registry.get("minecraft:chat_type")).get("value");
for (final Tag chatType : chatTypes) {
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
final NumberTag idTag = chatTypeCompound.get("id");
chatTypeStorage.addChatType(idTag.asInt(), chatTypeCompound);
}
// Replace with 1.19 chat types
// Ensures that the client has a chat type for system message, with and without overlay
registry.put("minecraft:chat_type", EntityPackets.CHAT_REGISTRY.clone());
});
handler(entityRewriter.worldTrackerHandlerByKey());
}
});
registerClientbound(ClientboundPackets1_19_1.PLAYER_CHAT, ClientboundPackets1_19.SYSTEM_CHAT, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
wrapper.read(Type.OPTIONAL_BYTE_ARRAY_PRIMITIVE); // Previous signature
final PlayerMessageSignature signature = wrapper.read(Type.PLAYER_MESSAGE_SIGNATURE);
// Store message signature for last seen
if (!signature.uuid().equals(ZERO_UUID) && signature.signatureBytes().length != 0) {
final ReceivedMessagesStorage messagesStorage = wrapper.user().get(ReceivedMessagesStorage.class);
messagesStorage.add(signature);
if (messagesStorage.tickUnacknowledged() > 64) {
messagesStorage.resetUnacknowledgedCount();
// Send chat acknowledgement
final PacketWrapper chatAckPacket = wrapper.create(ServerboundPackets1_19_1.CHAT_ACK);
chatAckPacket.write(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY, messagesStorage.lastSignatures());
chatAckPacket.write(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE, null);
chatAckPacket.sendToServer(Protocol1_19To1_19_1.class);
}
}
// Send the unsigned message if present, otherwise the signed message
final String plainMessage = wrapper.read(Type.STRING); // Plain message
JsonElement message = null;
JsonElement decoratedMessage = wrapper.read(Type.OPTIONAL_COMPONENT);
if (decoratedMessage != null) {
message = decoratedMessage;
}
wrapper.read(Type.LONG); // Timestamp
wrapper.read(Type.LONG); // Salt
wrapper.read(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY); // Last seen
final JsonElement unsignedMessage = wrapper.read(Type.OPTIONAL_COMPONENT);
if (unsignedMessage != null) {
message = unsignedMessage;
}
if (message == null) {
// If no decorated or unsigned message is given, use the plain one
message = GsonComponentSerializer.gson().serializeToTree(Component.text(plainMessage));
}
final int filterMaskType = wrapper.read(Type.VAR_INT);
if (filterMaskType == 2) { // Partially filtered
wrapper.read(Type.LONG_ARRAY_PRIMITIVE); // Mask
}
final int chatTypeId = wrapper.read(Type.VAR_INT);
final JsonElement senderName = wrapper.read(Type.COMPONENT);
final JsonElement targetName = wrapper.read(Type.OPTIONAL_COMPONENT);
decoratedMessage = decorateChatMessage(wrapper.user().get(ChatRegistryStorage1_19_1.class), chatTypeId, senderName, targetName, message);
if (decoratedMessage == null) {
wrapper.cancel();
return;
}
translatableRewriter.processText(decoratedMessage);
wrapper.write(Type.COMPONENT, decoratedMessage);
wrapper.write(Type.VAR_INT, SYSTEM_CHAT_ID);
});
}
});
registerClientbound(ClientboundPackets1_19_1.SYSTEM_CHAT, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
final JsonElement content = wrapper.passthrough(Type.COMPONENT);
translatableRewriter.processText(content);
final boolean overlay = wrapper.read(Type.BOOLEAN);
wrapper.write(Type.VAR_INT, overlay ? GAME_INFO_ID : SYSTEM_CHAT_ID);
});
}
});
registerServerbound(ServerboundPackets1_19.CHAT_MESSAGE, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Message
map(Type.LONG); // Timestamp
map(Type.LONG); // Salt
// Set empty signature
read(Type.BYTE_ARRAY_PRIMITIVE);
create(Type.BYTE_ARRAY_PRIMITIVE, EMPTY_BYTES);
map(Type.BOOLEAN); // Signed preview
handler(wrapper -> {
final ReceivedMessagesStorage messagesStorage = wrapper.user().get(ReceivedMessagesStorage.class);
messagesStorage.resetUnacknowledgedCount();
wrapper.write(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY, messagesStorage.lastSignatures());
wrapper.write(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE, null); // No last unacknowledged
});
}
});
registerServerbound(ServerboundPackets1_19.CHAT_COMMAND, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Command
map(Type.LONG); // Timestamp
map(Type.LONG); // Salt
handler(wrapper -> {
final int signatures = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < signatures; i++) {
wrapper.passthrough(Type.STRING); // Argument name
// Set empty signature
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE);
wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, EMPTY_BYTES);
}
wrapper.passthrough(Type.BOOLEAN); // Signed preview
final ReceivedMessagesStorage messagesStorage = wrapper.user().get(ReceivedMessagesStorage.class);
messagesStorage.resetUnacknowledgedCount();
wrapper.write(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY, messagesStorage.lastSignatures());
wrapper.write(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE, null); // No last unacknowledged
});
}
});
registerClientbound(ClientboundPackets1_19_1.SERVER_DATA, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.OPTIONAL_COMPONENT); // Motd
map(Type.OPTIONAL_STRING); // Encoded icon
map(Type.BOOLEAN); // Previews chat
read(Type.BOOLEAN); // Enforces secure chat
}
});
registerServerbound(State.LOGIN, ServerboundLoginPackets.HELLO.getId(), ServerboundLoginPackets.HELLO.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Name
handler(wrapper -> {
final ProfileKey profileKey = wrapper.read(Type.OPTIONAL_PROFILE_KEY);
if (profileKey == null) {
wrapper.user().put(new NonceStorage(null));
}
});
// Write empty profile key and uuid (since keys are not compatible) - requires the enforce-secure-profiles option to be disabled on the server
create(Type.OPTIONAL_PROFILE_KEY, null);
create(Type.OPTIONAL_UUID, null);
}
});
registerClientbound(State.LOGIN, ClientboundLoginPackets.HELLO.getId(), ClientboundLoginPackets.HELLO.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Server id
handler(wrapper -> {
if (wrapper.user().get(NonceStorage.class) != null) {
// Is already using the encrypted nonce
return;
}
final byte[] publicKey = wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
final byte[] nonce = wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
wrapper.user().put(new NonceStorage(CipherUtil.encryptNonce(publicKey, nonce)));
});
}
});
registerServerbound(State.LOGIN, ServerboundLoginPackets.ENCRYPTION_KEY.getId(), ServerboundLoginPackets.ENCRYPTION_KEY.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.BYTE_ARRAY_PRIMITIVE); // Key
handler(wrapper -> {
final NonceStorage nonceStorage = wrapper.user().remove(NonceStorage.class);
final boolean isNonce = wrapper.read(Type.BOOLEAN);
wrapper.write(Type.BOOLEAN, true);
if (isNonce) {
// Nonce, just pass it through
wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
return;
}
if (nonceStorage == null || nonceStorage.nonce() == null) {
throw new IllegalArgumentException("Server sent nonce is missing");
}
wrapper.read(Type.LONG); // Salt
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, nonceStorage.nonce());
});
}
});
registerClientbound(State.LOGIN, ClientboundLoginPackets.CUSTOM_QUERY.getId(), ClientboundLoginPackets.CUSTOM_QUERY.getId(), new PacketRemapper() {
@Override
public void registerMap() {
map(Type.VAR_INT);
map(Type.STRING);
handler(wrapper -> {
final String identifier = wrapper.get(Type.STRING, 0);
if (identifier.equals("velocity:player_info")) {
byte[] data = wrapper.passthrough(Type.REMAINING_BYTES);
// Velocity modern forwarding version above 1 includes the players public key.
// This is an issue because the player does not have a public key.
// Velocity itself does adjust the version accordingly: https://github.com/PaperMC/Velocity/blob/1a3fba4250553702d9dcd05731d04347bfc24c9f/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java#L176-L197
// However this becomes an issue when an 1.19.0 client tries to join a 1.19.1 server.
// (The protocol translation will go 1.19.1 -> 1.18.2 -> 1.19.0)
// The player does have a public key, but an outdated one.
// Velocity modern forwarding versions: https://github.com/PaperMC/Velocity/blob/1a3fba4250553702d9dcd05731d04347bfc24c9f/proxy/src/main/java/com/velocitypowered/proxy/connection/VelocityConstants.java#L27-L29
// And the version can be specified with a single byte: https://github.com/PaperMC/Velocity/blob/1a3fba4250553702d9dcd05731d04347bfc24c9f/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java#L88
if (data.length == 1 && data[0] > 1) {
data[0] = 1;
} else if (data.length == 0) { // Or the version is omitted (default version would be used)
data = new byte[]{1};
wrapper.set(Type.REMAINING_BYTES, 0, data);
} else {
ViaBackwards.getPlatform().getLogger().warning("Received unexpected data in velocity:player_info (length=" + data.length + ")");
}
}
});
}
});
cancelClientbound(ClientboundPackets1_19_1.CUSTOM_CHAT_COMPLETIONS); // Can't do anything with them unless we add clutter clients with fake player profiles
cancelClientbound(ClientboundPackets1_19_1.DELETE_CHAT_MESSAGE); // Can't do without the old "send 50 empty lines and then resend previous messages" trick
cancelClientbound(ClientboundPackets1_19_1.PLAYER_CHAT_HEADER);
}
@Override
public void init(final UserConnection user) {
user.put(new ChatRegistryStorage1_19_1());
user.put(new ReceivedMessagesStorage());
addEntityTracker(user, new EntityTrackerBase(user, Entity1_19Types.PLAYER, true));
}
@Override
public TranslatableRewriter getTranslatableRewriter() {
return translatableRewriter;
}
@Override
public EntityRewriter getEntityRewriter() {
return entityRewriter;
}
public static @Nullable JsonElement decorateChatMessage(final ChatRegistryStorage chatRegistryStorage, final int chatTypeId, final JsonElement senderName, @Nullable final JsonElement targetName, final JsonElement message) {
CompoundTag chatType = chatRegistryStorage.chatType(chatTypeId);
if (chatType == null) {
ViaBackwards.getPlatform().getLogger().warning("Chat message has unknown chat type id " + chatTypeId + ". Message: " + message);
return null;
}
chatType = chatType.<CompoundTag>get("element").get("chat");
if (chatType == null) {
return null;
}
final String translationKey = (String) chatType.get("translation_key").getValue();
final TranslatableComponent.Builder componentBuilder = Component.translatable().key(translationKey);
// Add the style
final CompoundTag style = chatType.get("style");
if (style != null) {
final Style.Builder styleBuilder = Style.style();
final StringTag color = style.get("color");
if (color != null) {
final NamedTextColor textColor = NamedTextColor.NAMES.value(color.getValue());
if (textColor != null) {
styleBuilder.color(NamedTextColor.NAMES.value(color.getValue()));
}
}
for (final String key : TextDecoration.NAMES.keys()) {
if (style.contains(key)) {
styleBuilder.decoration(TextDecoration.NAMES.value(key), style.<ByteTag>get(key).asByte() == 1);
}
}
componentBuilder.style(styleBuilder.build());
}
// Add the replacements
final ListTag parameters = chatType.get("parameters");
if (parameters != null) {
final List<Component> arguments = new ArrayList<>();
for (final Tag element : parameters) {
JsonElement argument = null;
switch ((String) element.getValue()) {
case "sender":
argument = senderName;
break;
case "content":
argument = message;
break;
case "target":
Preconditions.checkNotNull(targetName, "Target name is null");
argument = targetName;
break;
default:
ViaBackwards.getPlatform().getLogger().warning("Unknown parameter for chat decoration: " + element.getValue());
}
if (argument != null) {
arguments.add(GsonComponentSerializer.gson().deserializeFromTree(argument));
}
}
componentBuilder.args(arguments);
}
return GsonComponentSerializer.gson().serializeToTree(componentBuilder.build());
}
}
@@ -0,0 +1,51 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.packets;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.Protocol1_19To1_19_1;
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.type.types.version.Types1_19;
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ClientboundPackets1_19_1;
public final class EntityPackets1_19_1 extends EntityRewriter<Protocol1_19To1_19_1> {
public EntityPackets1_19_1(final Protocol1_19To1_19_1 protocol) {
super(protocol);
}
@Override
protected void registerPackets() {
registerMetadataRewriter(ClientboundPackets1_19_1.ENTITY_METADATA, Types1_19.METADATA_LIST);
registerRemoveEntities(ClientboundPackets1_19_1.REMOVE_ENTITIES);
registerSpawnTracker(ClientboundPackets1_19_1.SPAWN_ENTITY);
}
@Override
public void registerRewrites() {
filter().type(Entity1_19Types.ALLAY).cancel(16); // Dancing
filter().type(Entity1_19Types.ALLAY).cancel(17); // Can duplicate
}
@Override
public EntityType typeFromId(final int typeId) {
return Entity1_19Types.getTypeFromId(typeId);
}
}
@@ -0,0 +1,47 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
import org.checkerframework.checker.nullness.qual.Nullable;
public abstract class ChatRegistryStorage implements StorableObject {
private final Int2ObjectMap<CompoundTag> chatTypes = new Int2ObjectOpenHashMap<>();
public @Nullable CompoundTag chatType(final int id) {
return chatTypes.isEmpty() ? Protocol1_19To1_18_2.MAPPINGS.chatType(id) : chatTypes.get(id);
}
public void addChatType(final int id, final CompoundTag chatType) {
chatTypes.put(id, chatType);
}
public void clear() {
chatTypes.clear();
}
@Override
public boolean clearOnServerSwitch() {
return false;
}
}
@@ -0,0 +1,21 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage;
public final class ChatRegistryStorage1_19_1 extends ChatRegistryStorage {
}
@@ -0,0 +1,34 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class NonceStorage implements StorableObject {
private final byte[] nonce;
public NonceStorage(final byte @Nullable[] nonce) {
this.nonce = nonce;
}
public byte @Nullable [] nonce() {
return nonce;
}
}
@@ -0,0 +1,57 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2022 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
import com.viaversion.viaversion.api.minecraft.PlayerMessageSignature;
import java.util.Arrays;
public final class ReceivedMessagesStorage implements StorableObject {
private final PlayerMessageSignature[] signatures = new PlayerMessageSignature[5];
private int size;
private int unacknowledged;
public void add(final PlayerMessageSignature signature) {
PlayerMessageSignature toPush = signature;
for (int i = 0; i < this.size; ++i) {
final PlayerMessageSignature entry = this.signatures[i];
this.signatures[i] = toPush;
toPush = entry;
if (entry.uuid().equals(signature.uuid())) {
return;
}
}
if (this.size < this.signatures.length) {
this.signatures[this.size++] = toPush;
}
}
public PlayerMessageSignature[] lastSignatures() {
return Arrays.copyOf(this.signatures, size);
}
public int tickUnacknowledged() {
return unacknowledged++;
}
public void resetUnacknowledgedCount() {
unacknowledged = 0;
}
}
@@ -19,4 +19,14 @@ fix-formatted-inventory-titles: true
#
# Sends inventory acknowledgement packets to act as a replacement for ping packets for sub 1.17 clients.
# This only takes effect for ids in the short range. Useful for anticheat compatibility.
handle-pings-as-inv-acknowledgements: false
handle-pings-as-inv-acknowledgements: false
#
# 1.19.1 chat type formats.
chat-types-1_19_1:
"chat.type.text": "<%s> %s"
"chat.type.announcement": "[%s] %s"
"commands.message.display.incoming": "%s whispers to you: %s"
"commands.message.display.outgoing": "You whisper to %s: %s"
"chat.type.team.text": "%s <%s> %s"
"chat.type.team.sent": "-> %s <%s> %s"
"chat.type.emote": "* %s %s"
@@ -17,10 +17,12 @@
"minecraft:sparse_jungle": "jungle_edge",
"minecraft:stony_shore": "stone_shore",
"minecraft:old_growth_pine_taiga": "giant_spruce_taiga",
"minecraft:windswept_forest": "forest",
"minecraft:windswept_forest": "wooded_mountains",
"minecraft:wooded_badlands": "wooded_badlands_plateau",
"minecraft:windswept_gravelly_hills": "gravelly_mountains",
"minecraft:old_growth_birch_forest": "tall_birch_forest",
"minecraft:old_growth_spruce_taiga": "giant_spruce_taiga",
"minecraft:windswept_savanna": "shattered_savanna"
"minecraft:windswept_savanna": "shattered_savanna",
"minecraft:mangrove_swamp": "swamp",
"minecraft:deep_dark": "mountains"
}
@@ -0,0 +1,741 @@
{
"blockstates": {
"minecraft:sculk": "minecraft:black_concrete_powder",
"minecraft:sculk_vein": "minecraft:glow_lichen[",
"minecraft:sculk_catalyst": "minecraft:end_stone",
"minecraft:sculk_shrieker[can_summon=true,shrieking=true,waterlogged=true]": "minecraft:end_portal_frame[eye=true,facing=north]",
"minecraft:sculk_shrieker[can_summon=true,shrieking=true,waterlogged=false]": "minecraft:end_portal_frame[eye=true,facing=north]",
"minecraft:sculk_shrieker[can_summon=true,shrieking=false,waterlogged=true]": "minecraft:end_portal_frame[eye=false,facing=north]",
"minecraft:sculk_shrieker[can_summon=true,shrieking=false,waterlogged=false]": "minecraft:end_portal_frame[eye=false,facing=north]",
"minecraft:sculk_shrieker[can_summon=false,shrieking=true,waterlogged=true]": "minecraft:end_portal_frame[eye=true,facing=north]",
"minecraft:sculk_shrieker[can_summon=false,shrieking=true,waterlogged=false]": "minecraft:end_portal_frame[eye=true,facing=north]",
"minecraft:sculk_shrieker[can_summon=false,shrieking=false,waterlogged=true]": "minecraft:end_portal_frame[eye=false,facing=north]",
"minecraft:sculk_shrieker[can_summon=false,shrieking=false,waterlogged=false]": "minecraft:end_portal_frame[eye=false,facing=north]",
"minecraft:reinforced_deepslate": "minecraft:obsidian",
"minecraft:mangrove_planks": "minecraft:acacia_planks",
"minecraft:stripped_mangrove_log": "minecraft:stripped_acacia_log[",
"minecraft:stripped_mangrove_wood": "minecraft:stripped_acacia_wood[",
"minecraft:mangrove_wood": "minecraft:acacia_wood[",
"minecraft:mangrove_log": "minecraft:acacia_log[",
"minecraft:mangrove_sign": "minecraft:acacia_sign[",
"minecraft:mangrove_wall_sign": "minecraft:acacia_wall_sign[",
"minecraft:mangrove_pressure_plate": "minecraft:acacia_pressure_plate[",
"minecraft:mangrove_trapdoor": "minecraft:acacia_trapdoor[",
"minecraft:mangrove_button": "minecraft:acacia_button[",
"minecraft:mangrove_stairs": "minecraft:acacia_stairs[",
"minecraft:mangrove_slab": "minecraft:acacia_slab[",
"minecraft:mangrove_fence_gate": "minecraft:acacia_fence_gate[",
"minecraft:mangrove_fence": "minecraft:acacia_fence[",
"minecraft:mangrove_door": "minecraft:acacia_door[",
"minecraft:mud_bricks": "minecraft:bricks",
"minecraft:packed_mud": "minecraft:bricks",
"minecraft:mud_brick_stairs": "minecraft:brick_stairs[",
"minecraft:mud_brick_slab": "minecraft:brick_slab[",
"minecraft:mud_brick_wall": "minecraft:brick_wall[",
"minecraft:muddy_mangrove_roots": "minecraft:coarse_dirt",
"minecraft:mud": "minecraft:coarse_dirt",
"minecraft:mangrove_propagule": "minecraft:fern",
"minecraft:mangrove_roots": "minecraft:oak_wood[axis=y]",
"minecraft:ochre_froglight": "minecraft:sea_lantern",
"minecraft:verdant_froglight": "minecraft:sea_lantern",
"minecraft:pearlescent_froglight": "minecraft:sea_lantern",
"minecraft:potted_mangrove_propagule": "minecraft:potted_acacia_sapling",
"minecraft:frogspawn": "minecraft:air",
"minecraft:oak_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=1,persistent=true]",
"minecraft:oak_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=1,persistent=true]",
"minecraft:oak_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=1,persistent=false]",
"minecraft:oak_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=1,persistent=false]",
"minecraft:oak_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=2,persistent=true]",
"minecraft:oak_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=2,persistent=true]",
"minecraft:oak_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=2,persistent=false]",
"minecraft:oak_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=2,persistent=false]",
"minecraft:oak_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=3,persistent=true]",
"minecraft:oak_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=3,persistent=true]",
"minecraft:oak_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=3,persistent=false]",
"minecraft:oak_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=3,persistent=false]",
"minecraft:oak_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=4,persistent=true]",
"minecraft:oak_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=4,persistent=true]",
"minecraft:oak_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=4,persistent=false]",
"minecraft:oak_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=4,persistent=false]",
"minecraft:oak_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=5,persistent=true]",
"minecraft:oak_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=5,persistent=true]",
"minecraft:oak_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=5,persistent=false]",
"minecraft:oak_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=5,persistent=false]",
"minecraft:oak_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=6,persistent=true]",
"minecraft:oak_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=6,persistent=true]",
"minecraft:oak_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=6,persistent=false]",
"minecraft:oak_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=6,persistent=false]",
"minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=7,persistent=true]",
"minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=7,persistent=true]",
"minecraft:oak_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=7,persistent=false]",
"minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=7,persistent=false]",
"minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=1,persistent=true]",
"minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=1,persistent=true]",
"minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=1,persistent=false]",
"minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=1,persistent=false]",
"minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=2,persistent=true]",
"minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=2,persistent=true]",
"minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=2,persistent=false]",
"minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=2,persistent=false]",
"minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=3,persistent=true]",
"minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=3,persistent=true]",
"minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=3,persistent=false]",
"minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=3,persistent=false]",
"minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=4,persistent=true]",
"minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=4,persistent=true]",
"minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=4,persistent=false]",
"minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=4,persistent=false]",
"minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=5,persistent=true]",
"minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=5,persistent=true]",
"minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=5,persistent=false]",
"minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=5,persistent=false]",
"minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=6,persistent=true]",
"minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=6,persistent=true]",
"minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=6,persistent=false]",
"minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=6,persistent=false]",
"minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=7,persistent=true]",
"minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=7,persistent=true]",
"minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=7,persistent=false]",
"minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=7,persistent=false]",
"minecraft:birch_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=1,persistent=true]",
"minecraft:birch_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=1,persistent=true]",
"minecraft:birch_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=1,persistent=false]",
"minecraft:birch_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=1,persistent=false]",
"minecraft:birch_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=2,persistent=true]",
"minecraft:birch_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=2,persistent=true]",
"minecraft:birch_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=2,persistent=false]",
"minecraft:birch_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=2,persistent=false]",
"minecraft:birch_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=3,persistent=true]",
"minecraft:birch_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=3,persistent=true]",
"minecraft:birch_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=3,persistent=false]",
"minecraft:birch_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=3,persistent=false]",
"minecraft:birch_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=4,persistent=true]",
"minecraft:birch_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=4,persistent=true]",
"minecraft:birch_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=4,persistent=false]",
"minecraft:birch_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=4,persistent=false]",
"minecraft:birch_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=5,persistent=true]",
"minecraft:birch_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=5,persistent=true]",
"minecraft:birch_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=5,persistent=false]",
"minecraft:birch_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=5,persistent=false]",
"minecraft:birch_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=6,persistent=true]",
"minecraft:birch_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=6,persistent=true]",
"minecraft:birch_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=6,persistent=false]",
"minecraft:birch_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=6,persistent=false]",
"minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=7,persistent=true]",
"minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=7,persistent=true]",
"minecraft:birch_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=7,persistent=false]",
"minecraft:birch_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=7,persistent=false]",
"minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=1,persistent=true]",
"minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=1,persistent=true]",
"minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=1,persistent=false]",
"minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=1,persistent=false]",
"minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=2,persistent=true]",
"minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=2,persistent=true]",
"minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=2,persistent=false]",
"minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=2,persistent=false]",
"minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=3,persistent=true]",
"minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=3,persistent=true]",
"minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=3,persistent=false]",
"minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=3,persistent=false]",
"minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=4,persistent=true]",
"minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=4,persistent=true]",
"minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=4,persistent=false]",
"minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=4,persistent=false]",
"minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=5,persistent=true]",
"minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=5,persistent=true]",
"minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=5,persistent=false]",
"minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=5,persistent=false]",
"minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=6,persistent=true]",
"minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=6,persistent=true]",
"minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=6,persistent=false]",
"minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=6,persistent=false]",
"minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=7,persistent=true]",
"minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=7,persistent=true]",
"minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=7,persistent=false]",
"minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=7,persistent=false]",
"minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=true]",
"minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=true]",
"minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=false]",
"minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=false]",
"minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=true]",
"minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=true]",
"minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=false]",
"minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=false]",
"minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=true]",
"minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=true]",
"minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=false]",
"minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=false]",
"minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=true]",
"minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=true]",
"minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=false]",
"minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=false]",
"minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=true]",
"minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=true]",
"minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=false]",
"minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=false]",
"minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=true]",
"minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=true]",
"minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=false]",
"minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=false]",
"minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=true]",
"minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=true]",
"minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=false]",
"minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=false]",
"minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=1,persistent=true]",
"minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=1,persistent=true]",
"minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=1,persistent=false]",
"minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=1,persistent=false]",
"minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=2,persistent=true]",
"minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=2,persistent=true]",
"minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=2,persistent=false]",
"minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=2,persistent=false]",
"minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=3,persistent=true]",
"minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=3,persistent=true]",
"minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=3,persistent=false]",
"minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=3,persistent=false]",
"minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=4,persistent=true]",
"minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=4,persistent=true]",
"minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=4,persistent=false]",
"minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=4,persistent=false]",
"minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=5,persistent=true]",
"minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=5,persistent=true]",
"minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=5,persistent=false]",
"minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=5,persistent=false]",
"minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=6,persistent=true]",
"minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=6,persistent=true]",
"minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=6,persistent=false]",
"minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=6,persistent=false]",
"minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=7,persistent=true]",
"minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=7,persistent=true]",
"minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=7,persistent=false]",
"minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=7,persistent=false]",
"minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=true]",
"minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=true]",
"minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=false]",
"minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=false]",
"minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=true]",
"minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=true]",
"minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=false]",
"minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=false]",
"minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=true]",
"minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=true]",
"minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=false]",
"minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=false]",
"minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=true]",
"minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=true]",
"minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=false]",
"minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=false]",
"minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=true]",
"minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=true]",
"minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=false]",
"minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=false]",
"minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=true]",
"minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=true]",
"minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=false]",
"minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=false]",
"minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=true]",
"minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=true]",
"minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=false]",
"minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=false]",
"minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=1,persistent=true]",
"minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=1,persistent=true]",
"minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=1,persistent=false]",
"minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=1,persistent=false]",
"minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=2,persistent=true]",
"minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=2,persistent=true]",
"minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=2,persistent=false]",
"minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=2,persistent=false]",
"minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=3,persistent=true]",
"minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=3,persistent=true]",
"minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=3,persistent=false]",
"minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=3,persistent=false]",
"minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=4,persistent=true]",
"minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=4,persistent=true]",
"minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=4,persistent=false]",
"minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=4,persistent=false]",
"minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=5,persistent=true]",
"minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=5,persistent=true]",
"minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=5,persistent=false]",
"minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=5,persistent=false]",
"minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=6,persistent=true]",
"minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=6,persistent=true]",
"minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=6,persistent=false]",
"minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=6,persistent=false]",
"minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=7,persistent=true]",
"minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=7,persistent=true]",
"minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=7,persistent=false]",
"minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=7,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=1,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=1,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=1,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=1,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=2,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=2,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=2,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=2,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=3,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=3,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=3,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=3,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=4,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=4,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=4,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=4,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=5,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=5,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=5,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=5,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=6,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=6,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=6,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=6,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=7,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=7,persistent=true]",
"minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=7,persistent=false]",
"minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=7,persistent=false]",
"minecraft:chest[type=single,facing=north,waterlogged=true]": "minecraft:chest[facing=north,type=single,waterlogged=true]",
"minecraft:chest[type=single,facing=north,waterlogged=false]": "minecraft:chest[facing=north,type=single,waterlogged=false]",
"minecraft:chest[type=left,facing=north,waterlogged=true]": "minecraft:chest[facing=north,type=left,waterlogged=true]",
"minecraft:chest[type=left,facing=north,waterlogged=false]": "minecraft:chest[facing=north,type=left,waterlogged=false]",
"minecraft:chest[type=right,facing=north,waterlogged=true]": "minecraft:chest[facing=north,type=right,waterlogged=true]",
"minecraft:chest[type=right,facing=north,waterlogged=false]": "minecraft:chest[facing=north,type=right,waterlogged=false]",
"minecraft:chest[type=single,facing=south,waterlogged=true]": "minecraft:chest[facing=south,type=single,waterlogged=true]",
"minecraft:chest[type=single,facing=south,waterlogged=false]": "minecraft:chest[facing=south,type=single,waterlogged=false]",
"minecraft:chest[type=left,facing=south,waterlogged=true]": "minecraft:chest[facing=south,type=left,waterlogged=true]",
"minecraft:chest[type=left,facing=south,waterlogged=false]": "minecraft:chest[facing=south,type=left,waterlogged=false]",
"minecraft:chest[type=right,facing=south,waterlogged=true]": "minecraft:chest[facing=south,type=right,waterlogged=true]",
"minecraft:chest[type=right,facing=south,waterlogged=false]": "minecraft:chest[facing=south,type=right,waterlogged=false]",
"minecraft:chest[type=single,facing=west,waterlogged=true]": "minecraft:chest[facing=west,type=single,waterlogged=true]",
"minecraft:chest[type=single,facing=west,waterlogged=false]": "minecraft:chest[facing=west,type=single,waterlogged=false]",
"minecraft:chest[type=left,facing=west,waterlogged=true]": "minecraft:chest[facing=west,type=left,waterlogged=true]",
"minecraft:chest[type=left,facing=west,waterlogged=false]": "minecraft:chest[facing=west,type=left,waterlogged=false]",
"minecraft:chest[type=right,facing=west,waterlogged=true]": "minecraft:chest[facing=west,type=right,waterlogged=true]",
"minecraft:chest[type=right,facing=west,waterlogged=false]": "minecraft:chest[facing=west,type=right,waterlogged=false]",
"minecraft:chest[type=single,facing=east,waterlogged=true]": "minecraft:chest[facing=east,type=single,waterlogged=true]",
"minecraft:chest[type=single,facing=east,waterlogged=false]": "minecraft:chest[facing=east,type=single,waterlogged=false]",
"minecraft:chest[type=left,facing=east,waterlogged=true]": "minecraft:chest[facing=east,type=left,waterlogged=true]",
"minecraft:chest[type=left,facing=east,waterlogged=false]": "minecraft:chest[facing=east,type=left,waterlogged=false]",
"minecraft:chest[type=right,facing=east,waterlogged=true]": "minecraft:chest[facing=east,type=right,waterlogged=true]",
"minecraft:chest[type=right,facing=east,waterlogged=false]": "minecraft:chest[facing=east,type=right,waterlogged=false]",
"minecraft:trapped_chest[type=single,facing=north,waterlogged=true]": "minecraft:trapped_chest[facing=north,type=single,waterlogged=true]",
"minecraft:trapped_chest[type=single,facing=north,waterlogged=false]": "minecraft:trapped_chest[facing=north,type=single,waterlogged=false]",
"minecraft:trapped_chest[type=left,facing=north,waterlogged=true]": "minecraft:trapped_chest[facing=north,type=left,waterlogged=true]",
"minecraft:trapped_chest[type=left,facing=north,waterlogged=false]": "minecraft:trapped_chest[facing=north,type=left,waterlogged=false]",
"minecraft:trapped_chest[type=right,facing=north,waterlogged=true]": "minecraft:trapped_chest[facing=north,type=right,waterlogged=true]",
"minecraft:trapped_chest[type=right,facing=north,waterlogged=false]": "minecraft:trapped_chest[facing=north,type=right,waterlogged=false]",
"minecraft:trapped_chest[type=single,facing=south,waterlogged=true]": "minecraft:trapped_chest[facing=south,type=single,waterlogged=true]",
"minecraft:trapped_chest[type=single,facing=south,waterlogged=false]": "minecraft:trapped_chest[facing=south,type=single,waterlogged=false]",
"minecraft:trapped_chest[type=left,facing=south,waterlogged=true]": "minecraft:trapped_chest[facing=south,type=left,waterlogged=true]",
"minecraft:trapped_chest[type=left,facing=south,waterlogged=false]": "minecraft:trapped_chest[facing=south,type=left,waterlogged=false]",
"minecraft:trapped_chest[type=right,facing=south,waterlogged=true]": "minecraft:trapped_chest[facing=south,type=right,waterlogged=true]",
"minecraft:trapped_chest[type=right,facing=south,waterlogged=false]": "minecraft:trapped_chest[facing=south,type=right,waterlogged=false]",
"minecraft:trapped_chest[type=single,facing=west,waterlogged=true]": "minecraft:trapped_chest[facing=west,type=single,waterlogged=true]",
"minecraft:trapped_chest[type=single,facing=west,waterlogged=false]": "minecraft:trapped_chest[facing=west,type=single,waterlogged=false]",
"minecraft:trapped_chest[type=left,facing=west,waterlogged=true]": "minecraft:trapped_chest[facing=west,type=left,waterlogged=true]",
"minecraft:trapped_chest[type=left,facing=west,waterlogged=false]": "minecraft:trapped_chest[facing=west,type=left,waterlogged=false]",
"minecraft:trapped_chest[type=right,facing=west,waterlogged=true]": "minecraft:trapped_chest[facing=west,type=right,waterlogged=true]",
"minecraft:trapped_chest[type=right,facing=west,waterlogged=false]": "minecraft:trapped_chest[facing=west,type=right,waterlogged=false]",
"minecraft:trapped_chest[type=single,facing=east,waterlogged=true]": "minecraft:trapped_chest[facing=east,type=single,waterlogged=true]",
"minecraft:trapped_chest[type=single,facing=east,waterlogged=false]": "minecraft:trapped_chest[facing=east,type=single,waterlogged=false]",
"minecraft:trapped_chest[type=left,facing=east,waterlogged=true]": "minecraft:trapped_chest[facing=east,type=left,waterlogged=true]",
"minecraft:trapped_chest[type=left,facing=east,waterlogged=false]": "minecraft:trapped_chest[facing=east,type=left,waterlogged=false]",
"minecraft:trapped_chest[type=right,facing=east,waterlogged=true]": "minecraft:trapped_chest[facing=east,type=right,waterlogged=true]",
"minecraft:trapped_chest[type=right,facing=east,waterlogged=false]": "minecraft:trapped_chest[facing=east,type=right,waterlogged=false]",
"minecraft:moving_piston[type=normal,facing=north]": "minecraft:moving_piston[facing=north,type=normal]",
"minecraft:moving_piston[type=sticky,facing=north]": "minecraft:moving_piston[facing=north,type=sticky]",
"minecraft:moving_piston[type=normal,facing=east]": "minecraft:moving_piston[facing=east,type=normal]",
"minecraft:moving_piston[type=sticky,facing=east]": "minecraft:moving_piston[facing=east,type=sticky]",
"minecraft:moving_piston[type=normal,facing=south]": "minecraft:moving_piston[facing=south,type=normal]",
"minecraft:moving_piston[type=sticky,facing=south]": "minecraft:moving_piston[facing=south,type=sticky]",
"minecraft:moving_piston[type=normal,facing=west]": "minecraft:moving_piston[facing=west,type=normal]",
"minecraft:moving_piston[type=sticky,facing=west]": "minecraft:moving_piston[facing=west,type=sticky]",
"minecraft:moving_piston[type=normal,facing=up]": "minecraft:moving_piston[facing=up,type=normal]",
"minecraft:moving_piston[type=sticky,facing=up]": "minecraft:moving_piston[facing=up,type=sticky]",
"minecraft:moving_piston[type=normal,facing=down]": "minecraft:moving_piston[facing=down,type=normal]",
"minecraft:moving_piston[type=sticky,facing=down]": "minecraft:moving_piston[facing=down,type=sticky]",
"minecraft:piston_head[type=normal,facing=north,short=true]": "minecraft:piston_head[facing=north,short=true,type=normal]",
"minecraft:piston_head[type=sticky,facing=north,short=true]": "minecraft:piston_head[facing=north,short=true,type=sticky]",
"minecraft:piston_head[type=normal,facing=north,short=false]": "minecraft:piston_head[facing=north,short=false,type=normal]",
"minecraft:piston_head[type=sticky,facing=north,short=false]": "minecraft:piston_head[facing=north,short=false,type=sticky]",
"minecraft:piston_head[type=normal,facing=east,short=true]": "minecraft:piston_head[facing=east,short=true,type=normal]",
"minecraft:piston_head[type=sticky,facing=east,short=true]": "minecraft:piston_head[facing=east,short=true,type=sticky]",
"minecraft:piston_head[type=normal,facing=east,short=false]": "minecraft:piston_head[facing=east,short=false,type=normal]",
"minecraft:piston_head[type=sticky,facing=east,short=false]": "minecraft:piston_head[facing=east,short=false,type=sticky]",
"minecraft:piston_head[type=normal,facing=south,short=true]": "minecraft:piston_head[facing=south,short=true,type=normal]",
"minecraft:piston_head[type=sticky,facing=south,short=true]": "minecraft:piston_head[facing=south,short=true,type=sticky]",
"minecraft:piston_head[type=normal,facing=south,short=false]": "minecraft:piston_head[facing=south,short=false,type=normal]",
"minecraft:piston_head[type=sticky,facing=south,short=false]": "minecraft:piston_head[facing=south,short=false,type=sticky]",
"minecraft:piston_head[type=normal,facing=west,short=true]": "minecraft:piston_head[facing=west,short=true,type=normal]",
"minecraft:piston_head[type=sticky,facing=west,short=true]": "minecraft:piston_head[facing=west,short=true,type=sticky]",
"minecraft:piston_head[type=normal,facing=west,short=false]": "minecraft:piston_head[facing=west,short=false,type=normal]",
"minecraft:piston_head[type=sticky,facing=west,short=false]": "minecraft:piston_head[facing=west,short=false,type=sticky]",
"minecraft:piston_head[type=normal,facing=up,short=true]": "minecraft:piston_head[facing=up,short=true,type=normal]",
"minecraft:piston_head[type=sticky,facing=up,short=true]": "minecraft:piston_head[facing=up,short=true,type=sticky]",
"minecraft:piston_head[type=normal,facing=up,short=false]": "minecraft:piston_head[facing=up,short=false,type=normal]",
"minecraft:piston_head[type=sticky,facing=up,short=false]": "minecraft:piston_head[facing=up,short=false,type=sticky]",
"minecraft:piston_head[type=normal,facing=down,short=true]": "minecraft:piston_head[facing=down,short=true,type=normal]",
"minecraft:piston_head[type=sticky,facing=down,short=true]": "minecraft:piston_head[facing=down,short=true,type=sticky]",
"minecraft:piston_head[type=normal,facing=down,short=false]": "minecraft:piston_head[facing=down,short=false,type=normal]",
"minecraft:piston_head[type=sticky,facing=down,short=false]": "minecraft:piston_head[facing=down,short=false,type=sticky]"
},
"sounds": {
"music.overworld.deep_dark": "music.end",
"block.sculk_vein.break": "block.sculk_sensor.break",
"block.sculk_vein.fall": "block.sculk_sensor.fall",
"block.sculk_vein.hit": "block.sculk_sensor.hit",
"block.sculk_vein.place": "block.sculk_sensor.place",
"block.sculk_vein.step": "block.sculk_sensor.step",
"block.sculk_catalyst.bloom": "particle.soul_escape",
"block.sculk_catalyst.break": "block.sculk_sensor.break",
"block.sculk_catalyst.fall": "block.sculk_sensor.fall",
"block.sculk_catalyst.hit": "block.sculk_sensor.hit",
"block.sculk_catalyst.place": "block.sculk_sensor.place",
"block.sculk_catalyst.step": "block.sculk_sensor.step",
"block.sculk.spread": "item.ink_sac.use",
"block.sculk.charge": "block.bubble_column.bubble_pop",
"block.sculk.break": "block.sculk_sensor.break",
"block.sculk.fall": "block.sculk_sensor.fall",
"block.sculk.hit": "block.sculk_sensor.hit",
"block.sculk.place": "block.sculk_sensor.place",
"block.sculk.step": "block.sculk_sensor.step",
"block.sculk_shrieker.break": "block.sculk_sensor.break",
"block.sculk_shrieker.fall": "block.sculk_sensor.fall",
"block.sculk_shrieker.hit": "block.sculk_sensor.hit",
"block.sculk_shrieker.place": "block.sculk_sensor.place",
"block.sculk_shrieker.step": "block.sculk_sensor.step",
"block.sculk_shrieker.shriek": "entity.player.breath",
"entity.warden.ambient": "entity.ravager.ambient",
"entity.warden.listening": "entity.ravager.stunned",
"entity.warden.listening_angry": "entity.ravager.celebrate",
"entity.warden.angry": "entity.ravager.ambient",
"entity.warden.hurt": "entity.ravager.hurt",
"entity.warden.death": "entity.ravager.death",
"entity.warden.step": "entity.ravager.step",
"entity.warden.tendril_clicks": "block.sculk_sensor.clicking",
"entity.warden.heartbeat": "block.note_block.basedrum",
"entity.warden.agitated": "entity.ravager.roar",
"entity.warden.attack_impact": "entity.ravager.attack",
"entity.warden.roar": "entity.ravager.roar",
"entity.warden.sniff": "entity.piglin.admiring_item",
"entity.warden.emerge": "item.trident.thunder",
"entity.warden.dig": "block.beacon.deactivate",
"entity.warden.nearby_closest": "block.sculk_sensor.clicking",
"entity.warden.nearby_closer": "block.sculk_sensor.clicking",
"entity.warden.nearby_close": "block.sculk_sensor.clicking",
"item.bucket.empty_tadpole": "item.bucket.empty_fish",
"item.bucket.fill_tadpole": "item.bucket.fill_fish",
"block.froglight.break": "block.slime_block.break",
"block.froglight.fall": "block.slime_block.fall",
"block.froglight.hit": "block.slime_block.hit",
"block.froglight.place": "block.slime_block.place",
"block.froglight.step": "block.slime_block.step",
"block.frogspawn.step": "block.slime_block.step",
"block.frogspawn.break": "block.slime_block.break",
"block.frogspawn.fall": "block.slime_block.fall",
"block.frogspawn.hatch": "entity.turtle.egg_hatch",
"block.frogspawn.hit": "block.slime_block.hit",
"block.frogspawn.place": "block.slime_block.place",
"entity.frog.ambient": "entity.villager.ambient",
"entity.frog.death": "entity.villager.death",
"entity.frog.eat": "entity.player.burp",
"entity.frog.hurt": "entity.villager.hurt",
"entity.frog.lay_spawn": "entity.turtle.lay_egg",
"entity.frog.long_jump": "entity.salmon.flop",
"entity.frog.step": "entity.salmon.flop",
"entity.frog.tongue": "entity.salmon.flop",
"block.mangrove_roots.break": "block.vine.break",
"block.mangrove_roots.fall": "block.vine.fall",
"block.mangrove_roots.hit": "block.vine.hit",
"block.mangrove_roots.place": "block.vine.place",
"block.mangrove_roots.step": "block.vine.step",
"block.mud.break": "block.wet_grass.break",
"block.mud.fall": "block.wet_grass.fall",
"block.mud.hit": "block.wet_grass.hit",
"block.mud.place": "block.wet_grass.place",
"block.mud.step": "block.wet_grass.step",
"block.mud_bricks.break": "block.stone.break",
"block.mud_bricks.fall": "block.stone.fall",
"block.mud_bricks.hit": "block.stone.hit",
"block.mud_bricks.place": "block.stone.place",
"block.mud_bricks.step": "block.stone.step",
"block.muddy_mangrove_roots.break": "block.wet_grass.break",
"block.muddy_mangrove_roots.fall": "block.wet_grass.fall",
"block.muddy_mangrove_roots.hit": "block.wet_grass.hit",
"block.muddy_mangrove_roots.place": "block.wet_grass.place",
"block.muddy_mangrove_roots.step": "block.wet_grass.step",
"block.packed_mud.break": "block.stone.break",
"block.packed_mud.fall": "block.stone.fall",
"block.packed_mud.hit": "block.stone.hit",
"block.packed_mud.place": "block.stone.place",
"block.packed_mud.step": "block.stone.step",
"entity.tadpole.death": "entity.salmon.death",
"entity.tadpole.eat": "entity.salmon.flop",
"entity.tadpole.flop": "entity.salmon.flop",
"entity.tadpole.grow_up": "entity.villager.ambient",
"entity.tadpole.hurt": "entity.salmon.hurt",
"entity.tadpole.step": "entity.salmon.flop",
"entity.allay.ambient_with_item": "block.amethyst_block.chime",
"entity.allay.ambient_without_item": "block.amethyst_block.chime",
"entity.allay.death": "entity.vex.death",
"entity.allay.flap": "block.amethyst_block.chime",
"entity.allay.hurt": "entity.vex.hurt",
"entity.allay.item_given": "entity.item.pickup",
"entity.allay.item_taken": "entity.item.pickup",
"entity.parrot.imitate.warden": "entity.parrot.imitate.ravager",
"entity.warden.sonic_boom": "entity.generic.explode",
"entity.warden.sonic_charge": "entity.tnt.primed",
"entity.allay.item_thrown": "entity.item.pickup",
"music_disc.5": "music_disc.11",
"music.overworld.swamp": "music.game",
"music.overworld.jungle_and_forest": "music.game",
"music.overworld.old_growth_taiga": "music.game",
"entity.goat.horn_break": "entity.zombie.break_wooden_door",
"item.goat_horn.play": "block.note_block.banjo",
"entity.goat.screaming.horn_break": "entity.zombie.break_wooden_door",
"item.goat_horn.sound.0": "block.note_block.bass",
"item.goat_horn.sound.1": "block.note_block.snare",
"item.goat_horn.sound.2": "block.note_block.xylophone",
"item.goat_horn.sound.3": "block.note_block.bit",
"item.goat_horn.sound.4": "block.note_block.harp",
"item.goat_horn.sound.5": "block.note_block.pling",
"item.goat_horn.sound.6": "block.note_block.didgeridoo",
"item.goat_horn.sound.7": "block.note_block.guitar"
},
"items": {
"minecraft:warden_spawn_egg": {
"id": "minecraft:glow_squid_spawn_egg",
"name": "1.19 Warden Spawn Egg"
},
"minecraft:sculk_vein": {
"id": "minecraft:glow_lichen",
"name": "1.19 Sculk Vein"
},
"minecraft:sculk_catalyst": {
"id": "minecraft:end_stone",
"name": "1.19 Sculk Catalyst"
},
"minecraft:sculk": {
"id": "minecraft:black_concrete_powder",
"name": "1.19 Sculk"
},
"minecraft:sculk_shrieker": {
"id": "minecraft:end_portal_frame",
"name": "1.19 Sculk Shrieker"
},
"minecraft:mud": {
"id": "minecraft:coarse_dirt",
"name": "1.19 Mud"
},
"minecraft:mangrove_planks": {
"id": "minecraft:acacia_planks",
"name": "1.19 Mangrove Planks"
},
"minecraft:mangrove_propagule": {
"id": "minecraft:fern",
"name": "1.19 Mangrove Propagule"
},
"minecraft:mangrove_log": {
"id": "minecraft:acacia_log",
"name": "1.19 Mangrove Log"
},
"minecraft:mangrove_roots": {
"id": "minecraft:oak_wood",
"name": "1.19 Mangrove Roots"
},
"minecraft:muddy_mangrove_roots": {
"id": "minecraft:coarse_dirt",
"name": "1.19 Muddy Mangrove Roots"
},
"minecraft:stripped_mangrove_log": {
"id": "minecraft:stripped_acacia_log",
"name": "1.19 Stripped Mangrove Log"
},
"minecraft:stripped_mangrove_wood": {
"id": "minecraft:stripped_acacia_wood",
"name": "1.19 Stripped Mangrove Wood"
},
"minecraft:mangrove_wood": {
"id": "minecraft:acacia_wood",
"name": "1.19 Mangrove Wood"
},
"minecraft:mangrove_leaves": {
"id": "minecraft:acacia_leaves",
"name": "1.19 Mangrove Leaves"
},
"minecraft:mangrove_slab": {
"id": "minecraft:acacia_slab",
"name": "1.19 Mangrove Slab"
},
"minecraft:mud_brick_slab": {
"id": "minecraft:brick_slab",
"name": "1.19 Mud Brick Slab"
},
"minecraft:mangrove_fence": {
"id": "minecraft:acacia_fence",
"name": "1.19 Mangrove Fence"
},
"minecraft:packed_mud": {
"id": "minecraft:bricks",
"name": "1.19 Packed Mud"
},
"minecraft:mud_bricks": {
"id": "minecraft:bricks",
"name": "1.19 Mud Bricks"
},
"minecraft:mud_brick_stairs": {
"id": "minecraft:brick_stairs",
"name": "1.19 Mud Brick Stairs"
},
"minecraft:mud_brick_wall": {
"id": "minecraft:brick_wall",
"name": "1.19 Mud Brick Wall"
},
"minecraft:mangrove_stairs": {
"id": "minecraft:acacia_stairs",
"name": "1.19 Mangrove Stairs"
},
"minecraft:mangrove_button": {
"id": "minecraft:acacia_button",
"name": "1.19 Mangrove Button"
},
"minecraft:mangrove_pressure_plate": {
"id": "minecraft:acacia_pressure_plate",
"name": "1.19 Mangrove Pressure Plate"
},
"minecraft:mangrove_door": {
"id": "minecraft:acacia_door",
"name": "1.19 Mangrove Door"
},
"minecraft:mangrove_trapdoor": {
"id": "minecraft:acacia_trapdoor",
"name": "1.19 Mangrove Trapdoor"
},
"minecraft:mangrove_fence_gate": {
"id": "minecraft:acacia_fence_gate",
"name": "1.19 Mangrove Fence Gate"
},
"minecraft:mangrove_boat": {
"id": "minecraft:acacia_boat",
"name": "1.19 Mangrove Boat"
},
"minecraft:mangrove_sign": {
"id": "minecraft:acacia_sign",
"name": "1.19 Mangrove Sign"
},
"minecraft:tadpole_bucket": {
"id": "minecraft:pufferfish_bucket",
"name": "1.19 Tadpole Bucket"
},
"minecraft:frog_spawn_egg": {
"id": "minecraft:tropical_fish_spawn_egg",
"name": "1.19 Frog Spawn Egg"
},
"minecraft:tadpole_spawn_egg": {
"id": "minecraft:donkey_spawn_egg",
"name": "1.19 Tadpole Spawn Egg"
},
"minecraft:ochre_froglight": {
"id": "minecraft:sea_lantern",
"name": "1.19 Ochre Froglight"
},
"minecraft:verdant_froglight": {
"id": "minecraft:sea_lantern",
"name": "1.19 Verdant Froglight"
},
"minecraft:pearlescent_froglight": {
"id": "minecraft:sea_lantern",
"name": "1.19 Pearlescent Froglight"
},
"minecraft:frogspawn": {
"id": "minecraft:glow_lichen",
"name": "1.19 Frogspawn"
},
"minecraft:acacia_chest_boat": {
"id": "minecraft:acacia_boat",
"name": "1.19 Acacia Chest Boat"
},
"minecraft:dark_oak_chest_boat": {
"id": "minecraft:dark_oak_boat",
"name": "1.19 Dark Oak Chest Boat"
},
"minecraft:mangrove_chest_boat": {
"id": "minecraft:acacia_boat",
"name": "1.19 Mangrove Chest Boat"
},
"minecraft:jungle_chest_boat": {
"id": "minecraft:jungle_boat",
"name": "1.19 Jungle Chest Boat"
},
"minecraft:spruce_chest_boat": {
"id": "minecraft:spruce_boat",
"name": "1.19 Spruce Chest Boat"
},
"minecraft:oak_chest_boat": {
"id": "minecraft:oak_boat",
"name": "1.19 Oak Chest Boat"
},
"minecraft:birch_chest_boat": {
"id": "minecraft:birch_boat",
"name": "1.19 Birch Chest Boat"
},
"minecraft:allay_spawn_egg": {
"id": "minecraft:zombie_spawn_egg",
"name": "1.19 Allay Spawn Egg"
},
"minecraft:reinforced_deepslate": {
"id": "minecraft:obsidian",
"name": "1.19 Reinforced Deepslate"
},
"minecraft:echo_shard": {
"id": "minecraft:prismarine_shard",
"name": "1.19 Echo Shard"
},
"minecraft:recovery_compass": {
"id": "minecraft:compass",
"name": "1.19 Recovery Compass"
},
"minecraft:music_disc_5": {
"id": "minecraft:music_disc_13",
"name": "1.19 Music Disc 5"
},
"minecraft:disc_fragment_5": {
"id": "minecraft:music_disc_13",
"name": "1.19 Disc Fragment"
},
"minecraft:goat_horn": {
"id": "minecraft:dead_horn_coral",
"name": "1.19 Goat Horn"
}
},
"particles": {
"sculk_soul": "soul",
"sculk_charge": "",
"sculk_charge_pop": "bubble_pop",
"shriek": "",
"allay_dust": "wax_off",
"sonic_boom": "enchanted_hit"
},
"blockentities": {
"sculk_catalyst": "",
"sculk_shrieker": ""
},
"enchantments": {
"minecraft:swift_sneak": "minecraft:soul_speed"
},
"paintings": {
"minecraft:earth": "minecraft:void",
"minecraft:fire": "minecraft:void",
"minecraft:water": "minecraft:void",
"minecraft:wind": "minecraft:void"
},
"argumenttypes": {
"minecraft:template_mirror": "brigadier:string",
"minecraft:template_rotation": "brigadier:string"
},
"entitynames": {
"warden": "Warden",
"frog": "Frog",
"tadpole": "Tadpole",
"allay": "Allay"
}
}
@@ -0,0 +1,897 @@
{
"blockstates": {
"minecraft:note_block": "minecraft:note_block[instrument=harp,note=0,powered=false]",
"minecraft:piglin_head": "minecraft:zombie_head[",
"minecraft:piglin_wall_head": "minecraft:zombie_wall_head[",
"minecraft:bamboo_planks": "minecraft:birch_planks",
"minecraft:bamboo_mosaic": "minecraft:birch_planks",
"minecraft:chiseled_bookshelf": "minecraft:bookshelf",
"minecraft:bamboo_sign": "minecraft:birch_sign[",
"minecraft:bamboo_wall_sign": "minecraft:birch_wall_sign[",
"minecraft:oak_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:oak_sign[rotation=0,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:oak_sign[rotation=0,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:oak_sign[rotation=1,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:oak_sign[rotation=1,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:oak_sign[rotation=2,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:oak_sign[rotation=2,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:oak_sign[rotation=3,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:oak_sign[rotation=3,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:oak_sign[rotation=4,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:oak_sign[rotation=4,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:oak_sign[rotation=5,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:oak_sign[rotation=5,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:oak_sign[rotation=6,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:oak_sign[rotation=6,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:oak_sign[rotation=7,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:oak_sign[rotation=7,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:oak_sign[rotation=8,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:oak_sign[rotation=8,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:oak_sign[rotation=9,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:oak_sign[rotation=9,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:oak_sign[rotation=10,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:oak_sign[rotation=10,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:oak_sign[rotation=11,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:oak_sign[rotation=11,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:oak_sign[rotation=12,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:oak_sign[rotation=12,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:oak_sign[rotation=13,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:oak_sign[rotation=13,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:oak_sign[rotation=14,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:oak_sign[rotation=14,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:oak_sign[rotation=15,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:oak_sign[rotation=15,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:oak_sign[rotation=0,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:oak_sign[rotation=0,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:oak_sign[rotation=1,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:oak_sign[rotation=1,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:oak_sign[rotation=2,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:oak_sign[rotation=2,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:oak_sign[rotation=3,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:oak_sign[rotation=3,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:oak_sign[rotation=4,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:oak_sign[rotation=4,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:oak_sign[rotation=5,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:oak_sign[rotation=5,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:oak_sign[rotation=6,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:oak_sign[rotation=6,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:oak_sign[rotation=7,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:oak_sign[rotation=7,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:oak_sign[rotation=8,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:oak_sign[rotation=8,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:oak_sign[rotation=9,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:oak_sign[rotation=9,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:oak_sign[rotation=10,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:oak_sign[rotation=10,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:oak_sign[rotation=11,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:oak_sign[rotation=11,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:oak_sign[rotation=12,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:oak_sign[rotation=12,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:oak_sign[rotation=13,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:oak_sign[rotation=13,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:oak_sign[rotation=14,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:oak_sign[rotation=14,waterlogged=false]",
"minecraft:oak_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:oak_sign[rotation=15,waterlogged=true]",
"minecraft:oak_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:oak_sign[rotation=15,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:spruce_sign[rotation=0,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:spruce_sign[rotation=0,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:spruce_sign[rotation=1,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:spruce_sign[rotation=1,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:spruce_sign[rotation=2,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:spruce_sign[rotation=2,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:spruce_sign[rotation=3,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:spruce_sign[rotation=3,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:spruce_sign[rotation=4,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:spruce_sign[rotation=4,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:spruce_sign[rotation=5,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:spruce_sign[rotation=5,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:spruce_sign[rotation=6,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:spruce_sign[rotation=6,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:spruce_sign[rotation=7,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:spruce_sign[rotation=7,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:spruce_sign[rotation=8,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:spruce_sign[rotation=8,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:spruce_sign[rotation=9,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:spruce_sign[rotation=9,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:spruce_sign[rotation=10,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:spruce_sign[rotation=10,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:spruce_sign[rotation=11,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:spruce_sign[rotation=11,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:spruce_sign[rotation=12,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:spruce_sign[rotation=12,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:spruce_sign[rotation=13,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:spruce_sign[rotation=13,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:spruce_sign[rotation=14,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:spruce_sign[rotation=14,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:spruce_sign[rotation=15,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:spruce_sign[rotation=15,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:spruce_sign[rotation=0,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:spruce_sign[rotation=0,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:spruce_sign[rotation=1,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:spruce_sign[rotation=1,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:spruce_sign[rotation=2,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:spruce_sign[rotation=2,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:spruce_sign[rotation=3,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:spruce_sign[rotation=3,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:spruce_sign[rotation=4,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:spruce_sign[rotation=4,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:spruce_sign[rotation=5,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:spruce_sign[rotation=5,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:spruce_sign[rotation=6,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:spruce_sign[rotation=6,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:spruce_sign[rotation=7,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:spruce_sign[rotation=7,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:spruce_sign[rotation=8,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:spruce_sign[rotation=8,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:spruce_sign[rotation=9,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:spruce_sign[rotation=9,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:spruce_sign[rotation=10,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:spruce_sign[rotation=10,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:spruce_sign[rotation=11,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:spruce_sign[rotation=11,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:spruce_sign[rotation=12,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:spruce_sign[rotation=12,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:spruce_sign[rotation=13,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:spruce_sign[rotation=13,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:spruce_sign[rotation=14,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:spruce_sign[rotation=14,waterlogged=false]",
"minecraft:spruce_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:spruce_sign[rotation=15,waterlogged=true]",
"minecraft:spruce_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:spruce_sign[rotation=15,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:birch_sign[rotation=0,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:birch_sign[rotation=0,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:birch_sign[rotation=1,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:birch_sign[rotation=1,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:birch_sign[rotation=2,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:birch_sign[rotation=2,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:birch_sign[rotation=3,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:birch_sign[rotation=3,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:birch_sign[rotation=4,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:birch_sign[rotation=4,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:birch_sign[rotation=5,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:birch_sign[rotation=5,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:birch_sign[rotation=6,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:birch_sign[rotation=6,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:birch_sign[rotation=7,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:birch_sign[rotation=7,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:birch_sign[rotation=8,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:birch_sign[rotation=8,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:birch_sign[rotation=9,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:birch_sign[rotation=9,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:birch_sign[rotation=10,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:birch_sign[rotation=10,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:birch_sign[rotation=11,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:birch_sign[rotation=11,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:birch_sign[rotation=12,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:birch_sign[rotation=12,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:birch_sign[rotation=13,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:birch_sign[rotation=13,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:birch_sign[rotation=14,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:birch_sign[rotation=14,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:birch_sign[rotation=15,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:birch_sign[rotation=15,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:birch_sign[rotation=0,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:birch_sign[rotation=0,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:birch_sign[rotation=1,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:birch_sign[rotation=1,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:birch_sign[rotation=2,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:birch_sign[rotation=2,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:birch_sign[rotation=3,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:birch_sign[rotation=3,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:birch_sign[rotation=4,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:birch_sign[rotation=4,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:birch_sign[rotation=5,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:birch_sign[rotation=5,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:birch_sign[rotation=6,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:birch_sign[rotation=6,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:birch_sign[rotation=7,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:birch_sign[rotation=7,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:birch_sign[rotation=8,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:birch_sign[rotation=8,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:birch_sign[rotation=9,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:birch_sign[rotation=9,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:birch_sign[rotation=10,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:birch_sign[rotation=10,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:birch_sign[rotation=11,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:birch_sign[rotation=11,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:birch_sign[rotation=12,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:birch_sign[rotation=12,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:birch_sign[rotation=13,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:birch_sign[rotation=13,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:birch_sign[rotation=14,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:birch_sign[rotation=14,waterlogged=false]",
"minecraft:birch_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:birch_sign[rotation=15,waterlogged=true]",
"minecraft:birch_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:birch_sign[rotation=15,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:acacia_sign[rotation=0,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:acacia_sign[rotation=0,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:acacia_sign[rotation=1,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:acacia_sign[rotation=1,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:acacia_sign[rotation=2,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:acacia_sign[rotation=2,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:acacia_sign[rotation=3,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:acacia_sign[rotation=3,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:acacia_sign[rotation=4,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:acacia_sign[rotation=4,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:acacia_sign[rotation=5,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:acacia_sign[rotation=5,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:acacia_sign[rotation=6,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:acacia_sign[rotation=6,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:acacia_sign[rotation=7,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:acacia_sign[rotation=7,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:acacia_sign[rotation=8,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:acacia_sign[rotation=8,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:acacia_sign[rotation=9,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:acacia_sign[rotation=9,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:acacia_sign[rotation=10,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:acacia_sign[rotation=10,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:acacia_sign[rotation=11,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:acacia_sign[rotation=11,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:acacia_sign[rotation=12,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:acacia_sign[rotation=12,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:acacia_sign[rotation=13,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:acacia_sign[rotation=13,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:acacia_sign[rotation=14,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:acacia_sign[rotation=14,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:acacia_sign[rotation=15,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:acacia_sign[rotation=15,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:acacia_sign[rotation=0,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:acacia_sign[rotation=0,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:acacia_sign[rotation=1,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:acacia_sign[rotation=1,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:acacia_sign[rotation=2,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:acacia_sign[rotation=2,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:acacia_sign[rotation=3,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:acacia_sign[rotation=3,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:acacia_sign[rotation=4,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:acacia_sign[rotation=4,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:acacia_sign[rotation=5,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:acacia_sign[rotation=5,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:acacia_sign[rotation=6,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:acacia_sign[rotation=6,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:acacia_sign[rotation=7,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:acacia_sign[rotation=7,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:acacia_sign[rotation=8,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:acacia_sign[rotation=8,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:acacia_sign[rotation=9,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:acacia_sign[rotation=9,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:acacia_sign[rotation=10,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:acacia_sign[rotation=10,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:acacia_sign[rotation=11,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:acacia_sign[rotation=11,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:acacia_sign[rotation=12,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:acacia_sign[rotation=12,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:acacia_sign[rotation=13,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:acacia_sign[rotation=13,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:acacia_sign[rotation=14,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:acacia_sign[rotation=14,waterlogged=false]",
"minecraft:acacia_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:acacia_sign[rotation=15,waterlogged=true]",
"minecraft:acacia_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:acacia_sign[rotation=15,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:jungle_sign[rotation=0,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:jungle_sign[rotation=0,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:jungle_sign[rotation=1,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:jungle_sign[rotation=1,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:jungle_sign[rotation=2,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:jungle_sign[rotation=2,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:jungle_sign[rotation=3,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:jungle_sign[rotation=3,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:jungle_sign[rotation=4,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:jungle_sign[rotation=4,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:jungle_sign[rotation=5,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:jungle_sign[rotation=5,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:jungle_sign[rotation=6,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:jungle_sign[rotation=6,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:jungle_sign[rotation=7,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:jungle_sign[rotation=7,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:jungle_sign[rotation=8,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:jungle_sign[rotation=8,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:jungle_sign[rotation=9,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:jungle_sign[rotation=9,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:jungle_sign[rotation=10,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:jungle_sign[rotation=10,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:jungle_sign[rotation=11,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:jungle_sign[rotation=11,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:jungle_sign[rotation=12,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:jungle_sign[rotation=12,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:jungle_sign[rotation=13,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:jungle_sign[rotation=13,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:jungle_sign[rotation=14,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:jungle_sign[rotation=14,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:jungle_sign[rotation=15,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:jungle_sign[rotation=15,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:jungle_sign[rotation=0,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:jungle_sign[rotation=0,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:jungle_sign[rotation=1,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:jungle_sign[rotation=1,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:jungle_sign[rotation=2,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:jungle_sign[rotation=2,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:jungle_sign[rotation=3,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:jungle_sign[rotation=3,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:jungle_sign[rotation=4,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:jungle_sign[rotation=4,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:jungle_sign[rotation=5,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:jungle_sign[rotation=5,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:jungle_sign[rotation=6,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:jungle_sign[rotation=6,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:jungle_sign[rotation=7,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:jungle_sign[rotation=7,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:jungle_sign[rotation=8,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:jungle_sign[rotation=8,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:jungle_sign[rotation=9,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:jungle_sign[rotation=9,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:jungle_sign[rotation=10,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:jungle_sign[rotation=10,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:jungle_sign[rotation=11,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:jungle_sign[rotation=11,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:jungle_sign[rotation=12,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:jungle_sign[rotation=12,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:jungle_sign[rotation=13,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:jungle_sign[rotation=13,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:jungle_sign[rotation=14,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:jungle_sign[rotation=14,waterlogged=false]",
"minecraft:jungle_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:jungle_sign[rotation=15,waterlogged=true]",
"minecraft:jungle_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:jungle_sign[rotation=15,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:dark_oak_sign[rotation=0,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:dark_oak_sign[rotation=0,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:dark_oak_sign[rotation=1,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:dark_oak_sign[rotation=1,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:dark_oak_sign[rotation=2,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:dark_oak_sign[rotation=2,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:dark_oak_sign[rotation=3,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:dark_oak_sign[rotation=3,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:dark_oak_sign[rotation=4,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:dark_oak_sign[rotation=4,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:dark_oak_sign[rotation=5,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:dark_oak_sign[rotation=5,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:dark_oak_sign[rotation=6,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:dark_oak_sign[rotation=6,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:dark_oak_sign[rotation=7,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:dark_oak_sign[rotation=7,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:dark_oak_sign[rotation=8,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:dark_oak_sign[rotation=8,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:dark_oak_sign[rotation=9,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:dark_oak_sign[rotation=9,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:dark_oak_sign[rotation=10,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:dark_oak_sign[rotation=10,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:dark_oak_sign[rotation=11,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:dark_oak_sign[rotation=11,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:dark_oak_sign[rotation=12,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:dark_oak_sign[rotation=12,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:dark_oak_sign[rotation=13,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:dark_oak_sign[rotation=13,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:dark_oak_sign[rotation=14,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:dark_oak_sign[rotation=14,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:dark_oak_sign[rotation=15,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:dark_oak_sign[rotation=15,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:dark_oak_sign[rotation=0,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:dark_oak_sign[rotation=0,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:dark_oak_sign[rotation=1,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:dark_oak_sign[rotation=1,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:dark_oak_sign[rotation=2,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:dark_oak_sign[rotation=2,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:dark_oak_sign[rotation=3,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:dark_oak_sign[rotation=3,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:dark_oak_sign[rotation=4,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:dark_oak_sign[rotation=4,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:dark_oak_sign[rotation=5,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:dark_oak_sign[rotation=5,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:dark_oak_sign[rotation=6,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:dark_oak_sign[rotation=6,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:dark_oak_sign[rotation=7,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:dark_oak_sign[rotation=7,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:dark_oak_sign[rotation=8,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:dark_oak_sign[rotation=8,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:dark_oak_sign[rotation=9,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:dark_oak_sign[rotation=9,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:dark_oak_sign[rotation=10,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:dark_oak_sign[rotation=10,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:dark_oak_sign[rotation=11,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:dark_oak_sign[rotation=11,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:dark_oak_sign[rotation=12,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:dark_oak_sign[rotation=12,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:dark_oak_sign[rotation=13,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:dark_oak_sign[rotation=13,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:dark_oak_sign[rotation=14,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:dark_oak_sign[rotation=14,waterlogged=false]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:dark_oak_sign[rotation=15,waterlogged=true]",
"minecraft:dark_oak_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:dark_oak_sign[rotation=15,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:crimson_sign[rotation=0,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:crimson_sign[rotation=0,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:crimson_sign[rotation=1,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:crimson_sign[rotation=1,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:crimson_sign[rotation=2,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:crimson_sign[rotation=2,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:crimson_sign[rotation=3,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:crimson_sign[rotation=3,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:crimson_sign[rotation=4,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:crimson_sign[rotation=4,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:crimson_sign[rotation=5,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:crimson_sign[rotation=5,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:crimson_sign[rotation=6,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:crimson_sign[rotation=6,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:crimson_sign[rotation=7,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:crimson_sign[rotation=7,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:crimson_sign[rotation=8,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:crimson_sign[rotation=8,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:crimson_sign[rotation=9,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:crimson_sign[rotation=9,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:crimson_sign[rotation=10,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:crimson_sign[rotation=10,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:crimson_sign[rotation=11,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:crimson_sign[rotation=11,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:crimson_sign[rotation=12,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:crimson_sign[rotation=12,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:crimson_sign[rotation=13,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:crimson_sign[rotation=13,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:crimson_sign[rotation=14,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:crimson_sign[rotation=14,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:crimson_sign[rotation=15,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:crimson_sign[rotation=15,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:crimson_sign[rotation=0,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:crimson_sign[rotation=0,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:crimson_sign[rotation=1,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:crimson_sign[rotation=1,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:crimson_sign[rotation=2,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:crimson_sign[rotation=2,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:crimson_sign[rotation=3,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:crimson_sign[rotation=3,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:crimson_sign[rotation=4,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:crimson_sign[rotation=4,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:crimson_sign[rotation=5,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:crimson_sign[rotation=5,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:crimson_sign[rotation=6,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:crimson_sign[rotation=6,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:crimson_sign[rotation=7,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:crimson_sign[rotation=7,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:crimson_sign[rotation=8,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:crimson_sign[rotation=8,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:crimson_sign[rotation=9,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:crimson_sign[rotation=9,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:crimson_sign[rotation=10,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:crimson_sign[rotation=10,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:crimson_sign[rotation=11,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:crimson_sign[rotation=11,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:crimson_sign[rotation=12,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:crimson_sign[rotation=12,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:crimson_sign[rotation=13,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:crimson_sign[rotation=13,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:crimson_sign[rotation=14,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:crimson_sign[rotation=14,waterlogged=false]",
"minecraft:crimson_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:crimson_sign[rotation=15,waterlogged=true]",
"minecraft:crimson_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:crimson_sign[rotation=15,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:warped_sign[rotation=0,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:warped_sign[rotation=0,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:warped_sign[rotation=1,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:warped_sign[rotation=1,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:warped_sign[rotation=2,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:warped_sign[rotation=2,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:warped_sign[rotation=3,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:warped_sign[rotation=3,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:warped_sign[rotation=4,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:warped_sign[rotation=4,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:warped_sign[rotation=5,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:warped_sign[rotation=5,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:warped_sign[rotation=6,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:warped_sign[rotation=6,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:warped_sign[rotation=7,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:warped_sign[rotation=7,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:warped_sign[rotation=8,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:warped_sign[rotation=8,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:warped_sign[rotation=9,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:warped_sign[rotation=9,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:warped_sign[rotation=10,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:warped_sign[rotation=10,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:warped_sign[rotation=11,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:warped_sign[rotation=11,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:warped_sign[rotation=12,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:warped_sign[rotation=12,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:warped_sign[rotation=13,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:warped_sign[rotation=13,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:warped_sign[rotation=14,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:warped_sign[rotation=14,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:warped_sign[rotation=15,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:warped_sign[rotation=15,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:warped_sign[rotation=0,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:warped_sign[rotation=0,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:warped_sign[rotation=1,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:warped_sign[rotation=1,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:warped_sign[rotation=2,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:warped_sign[rotation=2,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:warped_sign[rotation=3,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:warped_sign[rotation=3,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:warped_sign[rotation=4,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:warped_sign[rotation=4,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:warped_sign[rotation=5,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:warped_sign[rotation=5,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:warped_sign[rotation=6,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:warped_sign[rotation=6,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:warped_sign[rotation=7,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:warped_sign[rotation=7,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:warped_sign[rotation=8,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:warped_sign[rotation=8,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:warped_sign[rotation=9,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:warped_sign[rotation=9,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:warped_sign[rotation=10,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:warped_sign[rotation=10,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:warped_sign[rotation=11,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:warped_sign[rotation=11,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:warped_sign[rotation=12,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:warped_sign[rotation=12,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:warped_sign[rotation=13,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:warped_sign[rotation=13,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:warped_sign[rotation=14,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:warped_sign[rotation=14,waterlogged=false]",
"minecraft:warped_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:warped_sign[rotation=15,waterlogged=true]",
"minecraft:warped_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:warped_sign[rotation=15,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:mangrove_sign[rotation=0,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:mangrove_sign[rotation=0,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:mangrove_sign[rotation=1,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:mangrove_sign[rotation=1,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:mangrove_sign[rotation=2,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:mangrove_sign[rotation=2,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:mangrove_sign[rotation=3,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:mangrove_sign[rotation=3,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:mangrove_sign[rotation=4,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:mangrove_sign[rotation=4,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:mangrove_sign[rotation=5,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:mangrove_sign[rotation=5,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:mangrove_sign[rotation=6,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:mangrove_sign[rotation=6,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:mangrove_sign[rotation=7,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:mangrove_sign[rotation=7,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:mangrove_sign[rotation=8,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:mangrove_sign[rotation=8,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:mangrove_sign[rotation=9,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:mangrove_sign[rotation=9,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:mangrove_sign[rotation=10,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:mangrove_sign[rotation=10,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:mangrove_sign[rotation=11,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:mangrove_sign[rotation=11,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:mangrove_sign[rotation=12,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:mangrove_sign[rotation=12,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:mangrove_sign[rotation=13,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:mangrove_sign[rotation=13,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:mangrove_sign[rotation=14,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:mangrove_sign[rotation=14,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:mangrove_sign[rotation=15,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:mangrove_sign[rotation=15,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:mangrove_sign[rotation=0,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:mangrove_sign[rotation=0,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:mangrove_sign[rotation=1,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:mangrove_sign[rotation=1,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:mangrove_sign[rotation=2,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:mangrove_sign[rotation=2,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:mangrove_sign[rotation=3,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:mangrove_sign[rotation=3,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:mangrove_sign[rotation=4,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:mangrove_sign[rotation=4,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:mangrove_sign[rotation=5,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:mangrove_sign[rotation=5,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:mangrove_sign[rotation=6,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:mangrove_sign[rotation=6,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:mangrove_sign[rotation=7,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:mangrove_sign[rotation=7,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:mangrove_sign[rotation=8,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:mangrove_sign[rotation=8,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:mangrove_sign[rotation=9,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:mangrove_sign[rotation=9,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:mangrove_sign[rotation=10,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:mangrove_sign[rotation=10,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:mangrove_sign[rotation=11,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:mangrove_sign[rotation=11,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:mangrove_sign[rotation=12,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:mangrove_sign[rotation=12,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:mangrove_sign[rotation=13,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:mangrove_sign[rotation=13,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:mangrove_sign[rotation=14,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:mangrove_sign[rotation=14,waterlogged=false]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:mangrove_sign[rotation=15,waterlogged=true]",
"minecraft:mangrove_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:mangrove_sign[rotation=15,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=0,waterlogged=true]": "minecraft:birch_sign[rotation=0,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=0,waterlogged=false]": "minecraft:birch_sign[rotation=0,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=1,waterlogged=true]": "minecraft:birch_sign[rotation=1,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=1,waterlogged=false]": "minecraft:birch_sign[rotation=1,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=2,waterlogged=true]": "minecraft:birch_sign[rotation=2,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=2,waterlogged=false]": "minecraft:birch_sign[rotation=2,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=3,waterlogged=true]": "minecraft:birch_sign[rotation=3,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=3,waterlogged=false]": "minecraft:birch_sign[rotation=3,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=4,waterlogged=true]": "minecraft:birch_sign[rotation=4,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=4,waterlogged=false]": "minecraft:birch_sign[rotation=4,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=5,waterlogged=true]": "minecraft:birch_sign[rotation=5,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=5,waterlogged=false]": "minecraft:birch_sign[rotation=5,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=6,waterlogged=true]": "minecraft:birch_sign[rotation=6,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=6,waterlogged=false]": "minecraft:birch_sign[rotation=6,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=7,waterlogged=true]": "minecraft:birch_sign[rotation=7,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=7,waterlogged=false]": "minecraft:birch_sign[rotation=7,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=8,waterlogged=true]": "minecraft:birch_sign[rotation=8,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=8,waterlogged=false]": "minecraft:birch_sign[rotation=8,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=9,waterlogged=true]": "minecraft:birch_sign[rotation=9,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=9,waterlogged=false]": "minecraft:birch_sign[rotation=9,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=10,waterlogged=true]": "minecraft:birch_sign[rotation=10,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=10,waterlogged=false]": "minecraft:birch_sign[rotation=10,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=11,waterlogged=true]": "minecraft:birch_sign[rotation=11,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=11,waterlogged=false]": "minecraft:birch_sign[rotation=11,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=12,waterlogged=true]": "minecraft:birch_sign[rotation=12,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=12,waterlogged=false]": "minecraft:birch_sign[rotation=12,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=13,waterlogged=true]": "minecraft:birch_sign[rotation=13,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=13,waterlogged=false]": "minecraft:birch_sign[rotation=13,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=14,waterlogged=true]": "minecraft:birch_sign[rotation=14,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=14,waterlogged=false]": "minecraft:birch_sign[rotation=14,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=15,waterlogged=true]": "minecraft:birch_sign[rotation=15,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=true,rotation=15,waterlogged=false]": "minecraft:birch_sign[rotation=15,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=0,waterlogged=true]": "minecraft:birch_sign[rotation=0,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=0,waterlogged=false]": "minecraft:birch_sign[rotation=0,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=1,waterlogged=true]": "minecraft:birch_sign[rotation=1,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=1,waterlogged=false]": "minecraft:birch_sign[rotation=1,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=2,waterlogged=true]": "minecraft:birch_sign[rotation=2,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=2,waterlogged=false]": "minecraft:birch_sign[rotation=2,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=3,waterlogged=true]": "minecraft:birch_sign[rotation=3,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=3,waterlogged=false]": "minecraft:birch_sign[rotation=3,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=4,waterlogged=true]": "minecraft:birch_sign[rotation=4,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=4,waterlogged=false]": "minecraft:birch_sign[rotation=4,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=5,waterlogged=true]": "minecraft:birch_sign[rotation=5,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=5,waterlogged=false]": "minecraft:birch_sign[rotation=5,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=6,waterlogged=true]": "minecraft:birch_sign[rotation=6,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=6,waterlogged=false]": "minecraft:birch_sign[rotation=6,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=7,waterlogged=true]": "minecraft:birch_sign[rotation=7,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=7,waterlogged=false]": "minecraft:birch_sign[rotation=7,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=8,waterlogged=true]": "minecraft:birch_sign[rotation=8,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=8,waterlogged=false]": "minecraft:birch_sign[rotation=8,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=9,waterlogged=true]": "minecraft:birch_sign[rotation=9,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=9,waterlogged=false]": "minecraft:birch_sign[rotation=9,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=10,waterlogged=true]": "minecraft:birch_sign[rotation=10,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=10,waterlogged=false]": "minecraft:birch_sign[rotation=10,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=11,waterlogged=true]": "minecraft:birch_sign[rotation=11,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=11,waterlogged=false]": "minecraft:birch_sign[rotation=11,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=12,waterlogged=true]": "minecraft:birch_sign[rotation=12,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=12,waterlogged=false]": "minecraft:birch_sign[rotation=12,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=13,waterlogged=true]": "minecraft:birch_sign[rotation=13,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=13,waterlogged=false]": "minecraft:birch_sign[rotation=13,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=14,waterlogged=true]": "minecraft:birch_sign[rotation=14,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=14,waterlogged=false]": "minecraft:birch_sign[rotation=14,waterlogged=false]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=15,waterlogged=true]": "minecraft:birch_sign[rotation=15,waterlogged=true]",
"minecraft:bamboo_hanging_sign[attached=false,rotation=15,waterlogged=false]": "minecraft:birch_sign[rotation=15,waterlogged=false]",
"minecraft:oak_wall_hanging_sign": "minecraft:oak_wall_sign[",
"minecraft:spruce_wall_hanging_sign": "minecraft:spruce_wall_sign[",
"minecraft:birch_wall_hanging_sign": "minecraft:birch_wall_sign[",
"minecraft:acacia_wall_hanging_sign": "minecraft:acacia_wall_sign[",
"minecraft:jungle_wall_hanging_sign": "minecraft:jungle_wall_sign[",
"minecraft:dark_oak_wall_hanging_sign": "minecraft:dark_oak_wall_sign[",
"minecraft:mangrove_wall_hanging_sign": "minecraft:mangrove_wall_sign[",
"minecraft:crimson_wall_hanging_sign": "minecraft:crimson_wall_sign[",
"minecraft:warped_wall_hanging_sign": "minecraft:warped_wall_sign[",
"minecraft:bamboo_wall_hanging_sign": "minecraft:birch_wall_sign[",
"minecraft:bamboo_pressure_plate": "minecraft:birch_pressure_plate[",
"minecraft:bamboo_trapdoor": "minecraft:birch_trapdoor[",
"minecraft:bamboo_button": "minecraft:birch_button[",
"minecraft:bamboo_stairs": "minecraft:birch_stairs[",
"minecraft:bamboo_mosaic_stairs": "minecraft:birch_stairs[",
"minecraft:bamboo_slab": "minecraft:birch_slab[",
"minecraft:bamboo_mosaic_slab": "minecraft:birch_slab[",
"minecraft:bamboo_fence": "minecraft:birch_fence[",
"minecraft:bamboo_fence_gate": "minecraft:birch_fence_gate[",
"minecraft:bamboo_door": "minecraft:birch_door[",
"minecraft:bamboo_block": "minecraft:birch_wood[",
"minecraft:stripped_bamboo_block": "minecraft:stripped_birch_wood["
},
"argumenttypes": {
"minecraft:resource_key": "minecraft:resource_or_tag",
"minecraft:resource_or_tag_key": "minecraft:resource_or_tag",
"minecraft:gamemode": "brigadier:string"
},
"blockentities": {
"hanging_sign": "sign",
"chiseled_bookshelf": ""
},
"items": {
"minecraft:bamboo_planks": {
"id": "minecraft:birch_planks",
"name": "1.19.3 Bamboo Planks"
},
"minecraft:bamboo_mosaic": {
"id": "minecraft:birch_planks",
"name": "1.19.3 Bamboo Mosaic"
},
"minecraft:bamboo_slab": {
"id": "minecraft:birch_slab",
"name": "1.19.3 Bamboo Slab"
},
"minecraft:bamboo_mosaic_slab": {
"id": "minecraft:birch_slab",
"name": "1.19.3 Bamboo Mosaic Slab"
},
"minecraft:chiseled_bookshelf": {
"id": "minecraft:bookshelf",
"name": "1.19.3 Chiseled Bookshelf"
},
"minecraft:bamboo_fence": {
"id": "minecraft:birch_fence",
"name": "1.19.3 Bamboo Fence"
},
"minecraft:bamboo_stairs": {
"id": "minecraft:birch_stairs",
"name": "1.19.3 Bamboo Stairs"
},
"minecraft:bamboo_mosaic_stairs": {
"id": "minecraft:birch_stairs",
"name": "1.19.3 Bamboo Mosaic Stairs"
},
"minecraft:bamboo_button": {
"id": "minecraft:birch_button",
"name": "1.19.3 Bamboo Button"
},
"minecraft:bamboo_pressure_plate": {
"id": "minecraft:birch_pressure_plate",
"name": "1.19.3 Bamboo Pressure Plate"
},
"minecraft:bamboo_door": {
"id": "minecraft:birch_door",
"name": "1.19.3 Bamboo Door"
},
"minecraft:bamboo_trapdoor": {
"id": "minecraft:birch_trapdoor",
"name": "1.19.3 Bamboo Trapdoor"
},
"minecraft:bamboo_fence_gate": {
"id": "minecraft:birch_fence_gate",
"name": "1.19.3 Bamboo Fence Gate"
},
"minecraft:bamboo_raft": {
"id": "minecraft:birch_boat",
"name": "1.19.3 Bamboo Raft"
},
"minecraft:bamboo_chest_raft": {
"id": "minecraft:birch_chest_boat",
"name": "1.19.3 Bamboo Chest Raft"
},
"minecraft:bamboo_sign": {
"id": "minecraft:birch_sign",
"name": "1.19.3 Bamboo Sign"
},
"minecraft:oak_hanging_sign": {
"id": "minecraft:birch_sign",
"name": "1.19.3 Oak Hanging Sign"
},
"minecraft:spruce_hanging_sign": {
"id": "minecraft:spruce_sign",
"name": "1.19.3 Spruce Hanging Sign"
},
"minecraft:birch_hanging_sign": {
"id": "minecraft:birch_sign",
"name": "1.19.3 Birch Hanging Sign"
},
"minecraft:jungle_hanging_sign": {
"id": "minecraft:jungle_sign",
"name": "1.19.3 Jungle Hanging Sign"
},
"minecraft:acacia_hanging_sign": {
"id": "minecraft:acacia_sign",
"name": "1.19.3 Acacia Hanging Sign"
},
"minecraft:dark_oak_hanging_sign": {
"id": "minecraft:dark_oak_sign",
"name": "1.19.3 Dark Oak Hanging Sign"
},
"minecraft:mangrove_hanging_sign": {
"id": "minecraft:mangrove_sign",
"name": "1.19.3 Mangrove Hanging Sign"
},
"minecraft:bamboo_hanging_sign": {
"id": "minecraft:birch_sign",
"name": "1.19.3 Bamboo Hanging Sign"
},
"minecraft:crimson_hanging_sign": {
"id": "minecraft:crimson_sign",
"name": "1.19.3 Crimson Hanging Sign"
},
"minecraft:warped_hanging_sign": {
"id": "minecraft:warped_sign",
"name": "1.19.3 Warped Hanging Sign"
},
"minecraft:camel_spawn_egg": {
"id": "minecraft:donkey_spawn_egg",
"name": "1.19.3 Camel Spawn Egg"
},
"minecraft:ender_dragon_spawn_egg": {
"id": "minecraft:enderman_spawn_egg",
"name": "1.19.3 Ender Dragon Spawn Egg"
},
"minecraft:iron_golem_spawn_egg": {
"id": "minecraft:polar_bear_spawn_egg",
"name": "1.19.3 Iron Golem Spawn Egg"
},
"minecraft:snow_golem_spawn_egg": {
"id": "minecraft:polar_bear_spawn_egg",
"name": "1.19.3 Snow Golem Spawn Egg"
},
"minecraft:wither_spawn_egg": {
"id": "minecraft:squid_spawn_egg",
"name": "1.19.3 Wither Spawn Egg"
},
"minecraft:bamboo_block": {
"id": "minecraft:birch_wood",
"name": "1.19.3 Bamboo Block"
},
"minecraft:stripped_bamboo_block": {
"id": "minecraft:stripped_birch_wood",
"name": "1.19.3 Stripped Bamboo Block"
},
"minecraft:piglin_head": {
"id": "minecraft:zombie_head",
"name": "1.19.3 Piglin Head"
}
},
"sounds": {
"block.bamboo_wood.break": "",
"block.bamboo_wood.fall": "",
"block.bamboo_wood.hit": "",
"block.bamboo_wood.place": "",
"block.bamboo_wood.step": "",
"block.bamboo_wood_door.close": "",
"block.bamboo_wood_door.open": "",
"block.bamboo_wood_trapdoor.close": "",
"block.bamboo_wood_trapdoor.open": "",
"block.bamboo_wood_button.click_off": "",
"block.bamboo_wood_button.click_on": "",
"block.bamboo_wood_pressure_plate.click_off": "",
"block.bamboo_wood_pressure_plate.click_on": "",
"block.bamboo_wood_fence_gate.close": "",
"block.bamboo_wood_fence_gate.open": "",
"entity.camel.ambient": "",
"entity.camel.dash": "",
"entity.camel.dash_ready": "",
"entity.camel.death": "",
"entity.camel.eat": "",
"entity.camel.hurt": "",
"entity.camel.saddle": "",
"entity.camel.sit": "",
"entity.camel.stand": "",
"entity.camel.step": "",
"entity.camel.step_sand": "",
"block.hanging_sign.step": "",
"block.hanging_sign.break": "",
"block.hanging_sign.fall": "",
"block.hanging_sign.hit": "",
"block.hanging_sign.place": "",
"block.nether_wood.break": "",
"block.nether_wood.fall": "",
"block.nether_wood.hit": "",
"block.nether_wood.place": "",
"block.nether_wood.step": "",
"block.nether_wood_door.close": "",
"block.nether_wood_door.open": "",
"block.nether_wood_trapdoor.close": "",
"block.nether_wood_trapdoor.open": "",
"block.nether_wood_button.click_off": "",
"block.nether_wood_button.click_on": "",
"block.nether_wood_pressure_plate.click_off": "",
"block.nether_wood_pressure_plate.click_on": "",
"block.nether_wood_fence_gate.close": "",
"block.nether_wood_fence_gate.open": "",
"block.chiseled_bookshelf.break": "",
"block.chiseled_bookshelf.fall": "",
"block.chiseled_bookshelf.hit": "",
"block.chiseled_bookshelf.insert": "",
"block.chiseled_bookshelf.insert.enchanted": "",
"block.chiseled_bookshelf.step": "",
"block.chiseled_bookshelf.pickup": "",
"block.chiseled_bookshelf.pickup.enchanted": "",
"block.chiseled_bookshelf.place": "",
"block.nether_wood_hanging_sign.step": "",
"block.nether_wood_hanging_sign.break": "",
"block.nether_wood_hanging_sign.fall": "",
"block.nether_wood_hanging_sign.hit": "",
"block.nether_wood_hanging_sign.place": "",
"block.bamboo_wood_hanging_sign.step": "",
"block.bamboo_wood_hanging_sign.break": "",
"block.bamboo_wood_hanging_sign.fall": "",
"block.bamboo_wood_hanging_sign.hit": "",
"block.bamboo_wood_hanging_sign.place": "",
"block.note_block.imitate.zombie": "",
"block.note_block.imitate.skeleton": "",
"block.note_block.imitate.creeper": "",
"block.note_block.imitate.ender_dragon": "",
"block.note_block.imitate.wither_skeleton": "",
"block.note_block.imitate.piglin": ""
},
"entitynames": {
"camel": "Camel"
}
}
@@ -1,4 +1,728 @@
{
"1.19.3": {
"gui.chatReport.discard.draft": "Save as Draft",
"gui.chatReport.draft.title": "Edit draft chat report?",
"gui.chatReport.draft.content": "Would you like to continue editing the existing report or discard it and create a new one?",
"gui.chatReport.draft.quittotitle.title": "You have a draft chat report that will be lost if you quit",
"gui.chatReport.draft.quittotitle.content": "Would you like to continue editing it or discard it?",
"gui.chatReport.draft.discard": "Discard",
"gui.chatReport.draft.edit": "Continue Editing",
"gui.chatSelection.join": "%s joined the chat",
"selectWorld.experimental": "Experimental",
"selectWorld.warning.experimental.title": "Warning! These settings are using experimental features",
"selectWorld.warning.experimental.question": "These settings are experimental and could one day stop working. Do you wish to proceed?",
"selectWorld.warning.deprecated.title": "Warning! These settings are using deprecated features",
"selectWorld.warning.deprecated.question": "Some features used are deprecated and will stop working in the future. Do you wish to proceed?",
"selectWorld.experimental.title": "Experimental Features Warning",
"selectWorld.experimental.message": "Be careful!\nSome of the selected packs require features that are still under development. Your world might crash, break or not work with future updates.",
"selectWorld.experimental.details": "Details",
"selectWorld.experimental.details.title": "Experimental feature requirements",
"selectWorld.experimental.details.entry": "Required experimental features: %s",
"lanServer.port": "Port Number",
"lanServer.port.unavailable": "Port not available.\nLeave the edit box empty or enter a different number between 1024 and 65535.",
"lanServer.port.unavailable.new": "Port not available.\nLeave the edit box empty or enter a different number between %s and %s.",
"lanServer.port.invalid": "Not a valid port.\nLeave the edit box empty or enter a number between 1024 and 65535.",
"lanServer.port.invalid.new": "Not a valid port.\nLeave the edit box empty or enter a number between %s and %s.",
"multiplayer.disconnect.expired_public_key": "Expired profile public key. Check that your system time is synchronized, and try restarting your game.",
"chat.disabled.expiredProfileKey": "Chat disabled due to expired profile public key. Please try reconnecting.",
"chat.disabled.chain_broken": "Chat disabled due to broken chain. Please try reconnecting.",
"chat.disabled.missingProfileKey": "Chat disabled due to missing profile public key. Please try reconnecting.",
"chat.tag.system": "Server message. Cannot be reported.",
"chat.tag.system_single_player": "Server message.",
"chat.filtered": "Filtered by the server.",
"chat.deleted_marker": "This chat message has been deleted by the server.",
"options.accessibility.panorama_speed": "Panorama Scroll Speed",
"options.telemetry": "Telemetry Data",
"options.telemetry.button": "Data Collection",
"options.telemetry.state.none": "None",
"options.telemetry.state.minimal": "Minimal",
"options.telemetry.state.all": "All",
"options.telemetry.button.tooltip": "\"%s\" includes only the required data.\n\"%s\" includes optional, as well as the required data.",
"options.operatorItemsTab": "Operator Items Tab",
"resourcePack.programmer_art.name": "Programmer Art",
"resourcePack.vanilla.name": "Default",
"dataPack.vanilla.name": "Default",
"dataPack.bundle.description": "Enables experimental Bundle item",
"dataPack.update_1_20.description": "New features and content for Minecraft 1.20",
"hanging_sign.edit": "Edit Hanging Sign Message",
"block.minecraft.bamboo_planks": "Bamboo Planks",
"block.minecraft.bamboo_mosaic": "Bamboo Mosaic",
"block.minecraft.bamboo_door": "Bamboo Door",
"block.minecraft.bamboo_block": "Block of Bamboo",
"block.minecraft.stripped_bamboo_block": "Block of Stripped Bamboo",
"block.minecraft.bamboo_slab": "Bamboo Slab",
"block.minecraft.bamboo_mosaic_slab": "Bamboo Mosaic Slab",
"block.minecraft.chiseled_bookshelf": "Chiseled Bookshelf",
"block.minecraft.spawner.desc1": "Interact with Spawn Egg:",
"block.minecraft.spawner.desc2": "Sets Mob Type",
"block.minecraft.bamboo_stairs": "Bamboo Stairs",
"block.minecraft.bamboo_mosaic_stairs": "Bamboo Mosaic Stairs",
"block.minecraft.bamboo_sign": "Bamboo Sign",
"block.minecraft.bamboo_wall_sign": "Bamboo Wall Sign",
"block.minecraft.oak_hanging_sign": "Oak Hanging Sign",
"block.minecraft.spruce_hanging_sign": "Spruce Hanging Sign",
"block.minecraft.birch_hanging_sign": "Birch Hanging Sign",
"block.minecraft.acacia_hanging_sign": "Acacia Hanging Sign",
"block.minecraft.jungle_hanging_sign": "Jungle Hanging Sign",
"block.minecraft.crimson_hanging_sign": "Crimson Hanging Sign",
"block.minecraft.warped_hanging_sign": "Warped Hanging Sign",
"block.minecraft.dark_oak_hanging_sign": "Dark Oak Hanging Sign",
"block.minecraft.mangrove_hanging_sign": "Mangrove Hanging Sign",
"block.minecraft.bamboo_hanging_sign": "Bamboo Hanging Sign",
"block.minecraft.oak_wall_hanging_sign": "Oak Wall Hanging Sign",
"block.minecraft.spruce_wall_hanging_sign": "Spruce Wall Hanging Sign",
"block.minecraft.birch_wall_hanging_sign": "Birch Wall Hanging Sign",
"block.minecraft.acacia_wall_hanging_sign": "Acacia Wall Hanging Sign",
"block.minecraft.jungle_wall_hanging_sign": "Jungle Wall Hanging Sign",
"block.minecraft.dark_oak_wall_hanging_sign": "Dark Oak Wall Hanging Sign",
"block.minecraft.mangrove_wall_hanging_sign": "Mangrove Wall Hanging Sign",
"block.minecraft.crimson_wall_hanging_sign": "Crimson Wall Hanging Sign",
"block.minecraft.warped_wall_hanging_sign": "Warped Wall Hanging Sign",
"block.minecraft.bamboo_wall_hanging_sign": "Bamboo Wall Hanging Sign",
"block.minecraft.bamboo_pressure_plate": "Bamboo Pressure Plate",
"block.minecraft.bamboo_button": "Bamboo Button",
"block.minecraft.bamboo_fence": "Bamboo Fence",
"block.minecraft.bamboo_fence_gate": "Bamboo Fence Gate",
"block.minecraft.bamboo_trapdoor": "Bamboo Trapdoor",
"block.minecraft.piglin_wall_head": "Piglin Wall Head",
"block.minecraft.piglin_head": "Piglin Head",
"item.minecraft.bamboo_raft": "Bamboo Raft",
"item.minecraft.bamboo_chest_raft": "Bamboo Raft with Chest",
"item.minecraft.camel_spawn_egg": "Camel Spawn Egg",
"item.minecraft.ender_dragon_spawn_egg": "Ender Dragon Spawn Egg",
"item.minecraft.iron_golem_spawn_egg": "Iron Golem Spawn Egg",
"item.minecraft.snow_golem_spawn_egg": "Snow Golem Spawn Egg",
"item.minecraft.wither_spawn_egg": "Wither Spawn Egg",
"item.disabled": "Disabled item",
"entity.minecraft.camel": "Camel",
"itemGroup.coloredBlocks": "Colored Blocks",
"itemGroup.natural": "Natural Blocks",
"itemGroup.functional": "Functional Blocks",
"itemGroup.op": "Operator Utilities",
"itemGroup.spawnEggs": "Spawn Eggs",
"itemGroup.consumables": "Consumables",
"itemGroup.foodAndDrink": "Food & Drinks",
"itemGroup.crafting": "Crafting",
"itemGroup.ingredients": "Ingredients",
"subtitles.chiseled_bookshelf.insert": "Book placed",
"subtitles.chiseled_bookshelf.insert_enchanted": "Enchanted book placed",
"subtitles.chiseled_bookshelf.take": "Book taken",
"subtitles.chiseled_bookshelf.take_enchanted": "Enchanted book taken",
"subtitles.entity.camel.ambient": "Camel grunts",
"subtitles.entity.camel.dash": "Camel yeets",
"subtitles.entity.camel.dash_ready": "Camel recovers",
"subtitles.entity.camel.death": "Camel dies",
"subtitles.entity.camel.eat": "Camel eats",
"subtitles.entity.camel.hurt": "Camel hurts",
"subtitles.entity.camel.saddle": "Saddle equips",
"subtitles.entity.camel.sit": "Camel sits down",
"subtitles.entity.camel.stand": "Camel stands up",
"subtitles.entity.camel.step": "Camel steps",
"subtitles.entity.camel.step_sand": "Camel sands",
"subtitles.entity.enderman.scream": "Enderman screams",
"subtitles.entity.tadpole.grow_up": "Tadpole grows up",
"telemetry_info.screen.title": "Telemetry Data Collection",
"telemetry_info.screen.description": "Collecting this data helps us improve Minecraft by guiding us in directions that are relevant to our players.\nYou can also send in additional feedback to help us keep improving Minecraft.",
"telemetry_info.button.show_data": "Open My Data",
"telemetry_info.button.give_feedback": "Give Feedback",
"telemetry_info.property_title": "Included Data",
"telemetry.property.user_id.title": "User ID",
"telemetry.property.client_id.title": "Client ID",
"telemetry.property.minecraft_session_id.title": "Minecraft Session ID",
"telemetry.property.game_version.title": "Game Version",
"telemetry.property.operating_system.title": "Operating System",
"telemetry.property.platform.title": "Platform",
"telemetry.property.client_modded.title": "Client Modded",
"telemetry.property.event_timestamp_utc.title": "Event Timestamp (UTC)",
"telemetry.property.opt_in.title": "Opt-In",
"telemetry.property.world_session_id.title": "World Session ID",
"telemetry.property.server_modded.title": "Server Modded",
"telemetry.property.server_type.title": "Server Type",
"telemetry.property.frame_rate_samples.title": "Frame Rate Samples (FPS)",
"telemetry.property.render_time_samples.title": "Render Time Samples",
"telemetry.property.used_memory_samples.title": "Used Random Access Memory",
"telemetry.property.number_of_samples.title": "Sample Count",
"telemetry.property.render_distance.title": "Render Distance",
"telemetry.property.dedicated_memory_kb.title": "Dedicated Memory (kB)",
"telemetry.property.game_mode.title": "Game Mode",
"telemetry.property.seconds_since_load.title": "Time Since Load (Seconds)",
"telemetry.property.ticks_since_load.title": "Time Since Load (Ticks)",
"telemetry.property.world_load_time_ms.title": "World Load Time (Milliseconds)",
"telemetry.property.new_world.title": "New World",
"telemetry.event.required": "%s (Required)",
"telemetry.event.optional": "%s (Optional)",
"telemetry.event.world_loaded.title": "World Loaded",
"telemetry.event.world_loaded.description": "Knowing how players play Minecraft (such as Game Mode, client or server modded, and game version) allows us to focus game updates to improve the areas that players care about most.\nThe World Loaded event is paired with the World Unloaded event to calculate how long the play session has lasted.",
"telemetry.event.world_unloaded.title": "World Unloaded",
"telemetry.event.world_unloaded.description": "This event is paired with the World Loaded event to calculate how long the world session has lasted.\nThe duration (in seconds and ticks) is measured when a world session has ended (quitting to title, disconnecting from a server).",
"telemetry.event.performance_metrics.title": "Performance Metrics",
"telemetry.event.performance_metrics.description": "Knowing the overall performance profile of Minecraft helps us tune and optimize the game for a wide range of machine specifications and operating systems. \nGame version is included to help us compare the performance profile for new versions of Minecraft.",
"telemetry.event.world_load_times.title": "World Load Times",
"telemetry.event.world_load_times.description": "It�s important for us to understand how long it takes to join a world, and how that changes over time. For example, when we add new features or do larger technical changes, we need to see what impact that had on load times.",
"argument.resource.not_found": "Can't find element '%s' of type '%s'",
"argument.resource.invalid_type": "Element '%s' has wrong type '%s' (expected '%s')",
"argument.resource_tag.not_found": "Can't find tag '%s' of type '%s'",
"argument.resource_tag.invalid_type": "Tag '%s' has wrong type '%s' (expected '%s')",
"arguments.nbtpath.too_deep": "Resulting NBT too deeply nested",
"arguments.nbtpath.too_large": "Resulting NBT too large",
"argument.gamemode.invalid": "Unknown gamemode: %s",
"entity.not_summonable": "Can't summon entity of type %s",
"commands.datapack.enable.failed.no_flags": "Pack '%s' cannot be enabled, since required flags are not enabled in this world: %s!",
"commands.fillbiome.toobig": "Too many blocks in the specified volume (maximum %s, specified %s)",
"commands.fillbiome.success": "Biomes set between %s, %s, %s and %s, %s, %s",
"commands.fillbiome.success.count": "%s biome entries set between %s, %s, %s and %s, %s, %s",
"gamerule.blockExplosionDropDecay": "In block interaction explosions, some blocks won't drop their loot",
"gamerule.blockExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by block interactions are lost in the explosion.",
"gamerule.mobExplosionDropDecay": "In mob explosions, some blocks won't drop their loot",
"gamerule.mobExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by mobs are lost in the explosion.",
"gamerule.tntExplosionDropDecay": "In TNT explosions, some blocks won't drop their loot",
"gamerule.tntExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by TNT are lost in the explosion.",
"gamerule.snowAccumulationHeight": "Snow accumulation height",
"gamerule.snowAccumulationHeight.description": "When it snows, layers of snow form on the ground up to at most this number of layers.",
"gamerule.waterSourceConversion": "Water converts to source",
"gamerule.waterSourceConversion.description": "When flowing water is surrounded on two sides by water sources it converts into a source.",
"gamerule.lavaSourceConversion": "Lava converts to source",
"gamerule.lavaSourceConversion.description": "When flowing lava is surrounded on two sides by lava sources it converts into a source.",
"gamerule.globalSoundEvents": "Global sound events",
"gamerule.globalSoundEvents.description": "When certain game events happen, like a boss spawning, the sound is heard everywhere.",
"pack.source.feature": "feature",
"mco.gui.ok": "Ok",
"mco.gui.button": "Button",
"mco.terms.buttons.agree": "Agree",
"mco.terms.buttons.disagree": "Don't agree",
"mco.terms.title": "Realms Terms of Service",
"mco.terms.sentence.1": "I agree to the Minecraft Realms",
"mco.terms.sentence.2": "Terms of Service",
"mco.selectServer.play": "Play",
"mco.selectServer.configure": "Configure",
"mco.selectServer.configureRealm": "Configure realm",
"mco.selectServer.leave": "Leave realm",
"mco.selectServer.create": "Create realm",
"mco.selectServer.purchase": "Add Realm",
"mco.selectServer.buy": "Buy a realm!",
"mco.selectServer.trial": "Get a trial!",
"mco.selectServer.close": "Close",
"mco.selectServer.expiredTrial": "Your trial has ended",
"mco.selectServer.expiredList": "Your subscription has expired",
"mco.selectServer.expiredSubscribe": "Subscribe",
"mco.selectServer.expiredRenew": "Renew",
"mco.selectServer.expired": "Expired realm",
"mco.selectServer.open": "Open realm",
"mco.selectServer.closed": "Closed realm",
"mco.selectServer.openserver": "Open realm",
"mco.selectServer.closeserver": "Close realm",
"mco.selectServer.minigame": "Minigame:",
"mco.selectServer.uninitialized": "Click to start your new realm!",
"mco.selectServer.expires.days": "Expires in %s days",
"mco.selectServer.expires.day": "Expires in a day",
"mco.selectServer.expires.soon": "Expires soon",
"mco.selectServer.note": "Note:",
"mco.selectServer.mapOnlySupportedForVersion": "This map is unsupported in %s",
"mco.selectServer.minigameNotSupportedInVersion": "Can't play this minigame in %s",
"mco.selectServer.popup": "Realms is a safe, simple way to enjoy an online Minecraft world with up to ten friends at a time. It supports loads of minigames and plenty of custom worlds! Only the owner of the realm needs to pay.",
"mco.configure.world.settings.title": "Settings",
"mco.configure.world.title": "Configure realm:",
"mco.configure.worlds.title": "Worlds",
"mco.configure.world.name": "Realm name",
"mco.configure.world.description": "Realm description",
"mco.configure.world.location": "Location",
"mco.configure.world.invited": "Invited",
"mco.configure.world.invite.narration": "You have %s new invites",
"mco.configure.world.buttons.edit": "Settings",
"mco.configure.world.buttons.done": "Done",
"mco.configure.world.buttons.delete": "Delete",
"mco.configure.world.buttons.open": "Open realm",
"mco.configure.world.buttons.close": "Close realm",
"mco.configure.world.buttons.invite": "Invite player",
"mco.configure.world.buttons.activity": "Player activity",
"mco.configure.world.activityfeed.disabled": "Player feed temporarily disabled",
"mco.configure.world.buttons.moreoptions": "More options",
"mco.configure.world.invite.profile.name": "Name",
"mco.configure.world.uninvite.question": "Are you sure that you want to uninvite",
"mco.configure.world.status": "Status",
"mco.configure.world.invites.ops.tooltip": "Operator",
"mco.configure.world.invites.normal.tooltip": "Normal user",
"mco.configure.world.invites.remove.tooltip": "Remove",
"mco.configure.world.closing": "Closing the realm...",
"mco.configure.world.opening": "Opening the realm...",
"mco.configure.world.buttons.players": "Players",
"mco.configure.world.buttons.settings": "Settings",
"mco.configure.world.buttons.subscription": "Subscription",
"mco.configure.world.buttons.options": "World options",
"mco.configure.world.backup": "World backups",
"mco.configure.world.buttons.resetworld": "Reset world",
"mco.configure.world.buttons.switchminigame": "Switch minigame",
"mco.configure.current.minigame": "Current",
"mco.configure.world.subscription.title": "Your subscription",
"mco.configure.world.subscription.timeleft": "Time left",
"mco.configure.world.subscription.unknown": "Unknown",
"mco.configure.world.subscription.recurring.daysleft": "Renewed automatically in",
"mco.configure.world.subscription.less_than_a_day": "Less than a day",
"mco.configure.world.subscription.expired": "Expired",
"mco.configure.world.subscription.start": "Start date",
"mco.configure.world.subscription.extend": "Extend subscription",
"mco.configure.world.subscription.day": "day",
"mco.configure.world.subscription.month": "month",
"mco.configure.world.subscription.days": "days",
"mco.configure.world.subscription.months": "months",
"mco.configure.world.pvp": "PVP",
"mco.configure.world.spawn_toggle.title": "Warning!",
"mco.configure.world.spawn_toggle.message": "Turning this option off will REMOVE ALL existing entities of that type",
"mco.configure.world.spawn_toggle.message.npc": "Turning this option off will REMOVE ALL existing entities of that type, like Villagers",
"mco.configure.world.spawnAnimals": "Spawn animals",
"mco.configure.world.spawnNPCs": "Spawn NPCs",
"mco.configure.world.spawnMonsters": "Spawn monsters",
"mco.configure.world.spawnProtection": "Spawn protection",
"mco.configure.world.commandBlocks": "Command blocks",
"mco.configure.world.forceGameMode": "Force game mode",
"mco.configure.world.slot": "World %s",
"mco.configure.world.slot.empty": "Empty",
"mco.create.world.wait": "Creating the realm...",
"mco.create.world.error": "You must enter a name!",
"mco.create.world.subtitle": "Optionally, select what world to put on your new realm",
"mco.create.world.skip": "Skip",
"mco.reset.world.title": "Reset world",
"mco.reset.world.warning": "This will replace the current world of your realm",
"mco.reset.world.seed": "Seed (Optional)",
"mco.reset.world.resetting.screen.title": "Resetting world...",
"mco.reset.world.generate": "New world",
"mco.reset.world.upload": "Upload world",
"mco.reset.world.adventure": "Adventures",
"mco.reset.world.template": "World templates",
"mco.reset.world.experience": "Experiences",
"mco.reset.world.inspiration": "Inspiration",
"mco.minigame.world.title": "Switch realm to minigame",
"mco.minigame.world.info.line1": "This will temporarily replace your world with a minigame!",
"mco.minigame.world.info.line2": "You can later return to your original world without losing anything.",
"mco.minigame.world.selected": "Selected minigame:",
"mco.minigame.world.noSelection": "Please make a selection",
"mco.minigame.world.startButton": "Switch",
"mco.minigame.world.starting.screen.title": "Starting minigame...",
"mco.minigame.world.changeButton": "Select another minigame",
"mco.minigame.world.stopButton": "End minigame",
"mco.minigame.world.switch.title": "Switch minigame",
"mco.minigame.world.switch.new": "Select another minigame?",
"mco.minigame.world.restore.question.line1": "The minigame will end and your realm will be restored.",
"mco.minigame.world.restore.question.line2": "Are you sure you want to continue?",
"mco.minigame.world.restore": "Ending minigame...",
"mco.configure.world.slot.tooltip": "Switch to world",
"mco.configure.world.slot.tooltip.minigame": "Switch to minigame",
"mco.configure.world.slot.tooltip.active": "Join",
"mco.configure.world.close.question.line1": "Your realm will become unavailable.",
"mco.configure.world.close.question.line2": "Are you sure you want to continue?",
"mco.configure.world.leave.question.line1": "If you leave this realm you won't see it unless you are invited again",
"mco.configure.world.leave.question.line2": "Are you sure you want to continue?",
"mco.configure.world.resourcepack.question.line1": "You need a custom resource pack to play on this realm",
"mco.configure.world.resourcepack.question.line2": "Do you want to download it and play?",
"mco.configure.world.reset.question.line1": "Your world will be regenerated and your current world will be lost",
"mco.configure.world.reset.question.line2": "Are you sure you want to continue?",
"mco.configure.world.restore.question.line1": "Your world will be restored to date '%s' (%s)",
"mco.configure.world.restore.question.line2": "Are you sure you want to continue?",
"mco.configure.world.restore.download.question.line1": "The world will be downloaded and added to your single player worlds.",
"mco.configure.world.restore.download.question.line2": "Do you want to continue?",
"mco.configure.world.slot.switch.question.line1": "Your realm will be switched to another world",
"mco.configure.world.slot.switch.question.line2": "Are you sure you want to continue?",
"mco.configure.world.switch.slot": "Create world",
"mco.configure.world.switch.slot.subtitle": "This world is empty, choose how to create your world",
"mco.minigame.world.slot.screen.title": "Switching world...",
"mco.configure.world.edit.subscreen.adventuremap": "Some settings are disabled since your current world is an adventure",
"mco.configure.world.edit.subscreen.experience": "Some settings are disabled since your current world is an experience",
"mco.configure.world.edit.subscreen.inspiration": "Some settings are disabled since your current world is an inspiration",
"mco.configure.world.edit.slot.name": "World name",
"mco.configure.world.players.title": "Players",
"mco.configure.world.players.error": "A player with the provided name does not exist",
"mco.configure.world.delete.button": "Delete realm",
"mco.configure.world.delete.question.line1": "Your realm will be permanently deleted",
"mco.configure.world.delete.question.line2": "Are you sure you want to continue?",
"mco.connect.connecting": "Connecting to the realm...",
"mco.connect.authorizing": "Logging in...",
"mco.connect.failed": "Failed to connect to the realm",
"mco.connect.success": "Done",
"mco.create.world": "Create",
"mco.create.world.reset.title": "Creating world...",
"mco.client.incompatible.title": "Client incompatible!",
"mco.client.incompatible.msg.line1": "Your client is not compatible with Realms.",
"mco.client.incompatible.msg.line2": "Please use the most recent version of Minecraft.",
"mco.client.incompatible.msg.line3": "Realms is not compatible with snapshot versions.",
"mco.backup.button.restore": "Restore",
"mco.backup.generate.world": "Generate world",
"mco.backup.restoring": "Restoring your realm",
"mco.backup.button.download": "Download latest",
"mco.backup.changes.tooltip": "Changes",
"mco.backup.nobackups": "This realm doesn't have any backups currently.",
"mco.backup.button.upload": "Upload world",
"mco.backup.button.reset": "Reset world",
"mco.download.title": "Downloading latest world",
"mco.download.cancelled": "Download cancelled",
"mco.download.failed": "Download failed",
"mco.download.done": "Download done",
"mco.download.downloading": "Downloading",
"mco.download.extracting": "Extracting",
"mco.download.preparing": "Preparing download",
"mco.download.confirmation.line1": "The world you are going to download is larger than %s",
"mco.download.confirmation.line2": "You won't be able to upload this world to your realm again",
"mco.template.title": "World templates",
"mco.template.title.minigame": "Minigames",
"mco.template.button.select": "Select",
"mco.template.button.trailer": "Trailer",
"mco.template.button.publisher": "Publisher",
"mco.template.default.name": "World template",
"mco.template.name": "Template",
"mco.template.info.tooltip": "Publisher website",
"mco.template.trailer.tooltip": "Map trailer",
"mco.template.select.none": "Oops, it looks like this content category is currently empty.\nPlease check back later for new content, or if you're a creator,\n%s.",
"mco.template.select.none.linkTitle": "consider submitting something yourself",
"mco.template.select.failure": "We couldn't retrieve the list of content for this category.\nPlease check your internet connection, or try again later.",
"mco.template.select.narrate.authors": "Authors: %s",
"mco.template.select.narrate.version": "version %s",
"mco.invites.button.accept": "Accept",
"mco.invites.button.reject": "Reject",
"mco.invites.title": "Pending Invites",
"mco.invites.pending": "New invites!",
"mco.invites.nopending": "No pending invites!",
"mco.upload.select.world.title": "Upload world",
"mco.upload.select.world.subtitle": "Please select a singleplayer world to upload",
"mco.upload.select.world.none": "No singleplayer worlds found!",
"mco.upload.button.name": "Upload",
"mco.upload.verifying": "Verifying your world",
"mco.upload.preparing": "Preparing your world",
"mco.upload.close.failure": "Could not close your realm, please try again later",
"mco.upload.size.failure.line1": "'%s' is too big!",
"mco.upload.size.failure.line2": "It is %s. The maximum allowed size is %s.",
"mco.upload.uploading": "Uploading '%s'",
"mco.upload.done": "Upload done",
"mco.upload.failed": "Upload failed! (%s)",
"mco.upload.cancelled": "Upload cancelled",
"mco.upload.hardcore": "Hardcore worlds can't be uploaded!",
"mco.activity.title": "Player activity",
"mco.activity.noactivity": "No activity for the past %s days",
"mco.errorMessage.6001": "Client outdated",
"mco.errorMessage.6002": "Terms of service not accepted",
"mco.errorMessage.6003": "Download limit reached",
"mco.errorMessage.6004": "Upload limit reached",
"mco.errorMessage.connectionFailure": "An error occurred, please try again later.",
"mco.errorMessage.serviceBusy": "Realms is busy at the moment.\nPlease try connecting to your Realm again in a couple of minutes.",
"mco.trial.message.line1": "Want to get your own realm?",
"mco.trial.message.line2": "Click here for more info!",
"mco.brokenworld.play": "Play",
"mco.brokenworld.download": "Download",
"mco.brokenworld.downloaded": "Downloaded",
"mco.brokenworld.reset": "Reset",
"mco.brokenworld.title": "Your current world is no longer supported",
"mco.brokenworld.message.line1": "Please reset or select another world.",
"mco.brokenworld.message.line2": "You can also choose to download the world to singleplayer.",
"mco.brokenworld.minigame.title": "This minigame is no longer supported",
"mco.brokenworld.nonowner.title": "World is out of date",
"mco.brokenworld.nonowner.error": "Please wait for the realm owner to reset the world",
"mco.error.invalid.session.title": "Invalid session",
"mco.error.invalid.session.message": "Please try restarting Minecraft",
"mco.news": "Realms news",
"mco.account.privacyinfo": "Mojang implements certain procedures to help protect children and their privacy including complying with the Children�s Online Privacy Protection Act (COPPA) and General Data Protection Regulation (GDPR).\n\nYou may need to obtain parental consent before accessing your Realms account.\n\nIf you have an older Minecraft account (you log in with your username), you need to migrate the account to a Mojang account in order to access Realms.",
"mco.account.update": "Update account",
"mco.account.privacy.info": "Read more about Mojang and privacy laws"
},
"1.19.1": {
"gui.acknowledge": "Acknowledge",
"gui.socialInteractions.report": "Report",
"gui.socialInteractions.tooltip.report": "Report player",
"gui.socialInteractions.tooltip.report.disabled": "The reporting service is unavailable",
"gui.socialInteractions.tooltip.report.no_messages": "No reportable messages from player %s",
"gui.socialInteractions.tooltip.report.not_reportable": "This player can't be reported, because their chat messages can't be verified on this server",
"gui.socialInteractions.narration.hide": "Hide messages from %s",
"gui.socialInteractions.narration.show": "Show messages from %s",
"gui.socialInteractions.narration.report": "Report player %s",
"gui.chatReport.title": "Report Player",
"gui.chatReport.send": "Send Report",
"gui.chatReport.send.comments_too_long": "Please shorten the comment",
"gui.chatReport.send.no_reason": "Please select a report category",
"gui.chatReport.send.no_reported_messages": "Please select at least one chat message to report",
"gui.chatReport.send.too_many_messages": "Trying to include too many messages in the report",
"gui.chatReport.observed_what": "Why are you reporting this?",
"gui.chatReport.select_reason": "Select Report Category",
"gui.chatReport.more_comments": "Please describe what happened:",
"gui.chatReport.describe": "Sharing details will help us make a well-informed decision.",
"gui.chatReport.comments": "Comments edit box",
"gui.chatReport.read_info": "Learn About Reporting",
"gui.chatReport.select_chat": "Select Chat Messages to Report",
"gui.chatReport.selected_chat": "%s Chat Message(s) Selected to Report",
"gui.chatReport.report_sent_msg": "We�ve successfully received your report. Thank you!\n\nOur team will review it as soon as possible.",
"gui.chatReport.discard.title": "Discard report and comments?",
"gui.chatReport.discard.content": "If you leave, you'll lose this report and your comments.\nAre you sure you want to leave?",
"gui.chatReport.discard.discard": "Leave and Discard Report",
"gui.chatReport.discard.return": "Continue Editing",
"gui.abuseReport.reason.title": "Select Report Category",
"gui.abuseReport.reason.description": "Description:",
"gui.abuseReport.reason.narration": "%s: %s",
"gui.abuseReport.reason.false_reporting": "False Reporting",
"gui.abuseReport.reason.child_sexual_exploitation_or_abuse": "Child sexual exploitation or abuse",
"gui.abuseReport.reason.child_sexual_exploitation_or_abuse.description": "Someone is talking about or otherwise promoting indecent behavior involving children.",
"gui.abuseReport.reason.terrorism_or_violent_extremism": "Terrorism or violent extremism",
"gui.abuseReport.reason.terrorism_or_violent_extremism.description": "Someone is talking about, promoting, or threatening to commit acts of terrorism or violent extremism for political, religious, ideological, or other reasons.",
"gui.abuseReport.reason.hate_speech": "Hate speech",
"gui.abuseReport.reason.hate_speech.description": "Someone is attacking you or another player based on characteristics of their identity, like religion, race, or sexuality.",
"gui.abuseReport.reason.harassment_or_bullying": "Harassment or bullying",
"gui.abuseReport.reason.harassment_or_bullying.description": "Someone is shaming, attacking, or bullying you or someone else. This includes when someone is repeatedly trying to contact you or someone else without consent or posting private personal information about you or someone else without consent (\"doxing\").",
"gui.abuseReport.reason.imminent_harm": "Imminent harm - Threat to harm others",
"gui.abuseReport.reason.imminent_harm.description": "Someone is threatening to harm you or someone else in real life.",
"gui.abuseReport.reason.defamation_impersonation_false_information": "Defamation, impersonation, or false information",
"gui.abuseReport.reason.defamation_impersonation_false_information.description": "Someone is damaging someone else's reputation, pretending to be someone they're not, or sharing false information with the aim to exploit or mislead others.",
"gui.abuseReport.reason.self_harm_or_suicide": "Imminent harm - Self-harm or suicide",
"gui.abuseReport.reason.self_harm_or_suicide.description": "Someone is threatening to harm themselves in real life or talking about harming themselves in real life.",
"gui.abuseReport.reason.alcohol_tobacco_drugs": "Drugs or alcohol",
"gui.abuseReport.reason.alcohol_tobacco_drugs.description": "Someone is encouraging others to partake in illegal drug related activities or encouraging underage drinking.",
"gui.abuseReport.reason.non_consensual_intimate_imagery": "Non-consensual intimate imagery",
"gui.abuseReport.reason.non_consensual_intimate_imagery.description": "Someone is talking about, sharing, or otherwise promoting private and intimate images.",
"gui.abuseReport.sending.title": "Sending your report...",
"gui.abuseReport.sent.title": "Report sent",
"gui.abuseReport.error.title": "Problem sending your report",
"gui.abuseReport.send.generic_error": "Encountered an unexpected error while sending your report.",
"gui.abuseReport.send.error_message": "An error was returned while sending your report:\n'%s'",
"gui.abuseReport.send.service_unavailable": "Unable to reach the Abuse Reporting service. Please make sure you are connected to the internet and try again.",
"gui.abuseReport.send.http_error": "An unexpected HTTP error occurred while sending your report.",
"gui.abuseReport.send.json_error": "Encountered malformed payload while sending your report.",
"gui.chatSelection.title": "Select Chat Messages to Report",
"gui.chatSelection.context": "Messages surrounding this selection will be included to provide additional context",
"gui.chatSelection.selected": "%s/%s message(s) selected",
"gui.chatSelection.heading": "%s %s",
"gui.chatSelection.message.narrate": "%s said: %s at %s",
"gui.chatSelection.fold": "%s unrelated messages hidden",
"gui.multiLineEditBox.character_limit": "%s/%s",
"gui.banned.title.temporary": "Account temporarily suspended",
"gui.banned.title.permanent": "Account permanently banned",
"gui.banned.description": "%s\n\n%s\n\nLearn more at the following link: %s",
"gui.banned.description.reason": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified it as %s, which goes against the Minecraft Community Standards.",
"gui.banned.description.reason_id": "Code: %s",
"gui.banned.description.reason_id_message": "Code: %s - %s",
"gui.banned.description.unknownreason": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified that it goes against the Minecraft Community Standards.",
"gui.banned.description.temporary.duration": "Your account is temporarily suspended and will be reactivated in %s.",
"gui.banned.description.temporary": "%s Until then, you can�t play online or join Realms.",
"gui.banned.description.permanent": "Your account is permanently banned, which means you can�t play online or join Realms.",
"menu.playerReporting": "Player Reporting",
"multiplayer.disconnect.unsigned_chat": "Received chat packet with missing or invalid signature.",
"multiplayer.disconnect.too_many_pending_chats": "Too many unacknowledged chat messages",
"multiplayer.disconnect.chat_validation_failed": "Chat message validation failure",
"multiplayer.unsecureserver.toast.title": "Chat messages can't be verified",
"multiplayer.unsecureserver.toast": "Messages sent on this server may be modified and might not reflect the original message",
"chat.previewInput": "Press [%s] to preview",
"chat.tag.not_secure": "This message is not secure, which means that it might have been modified by the server",
"chat.tag.modified": "This message has been modified by the server.",
"chat.tag.modified.original": "Original text: %s",
"chat.tag.filtered": "This message has been filtered by the server.",
"chat.filtered_full": "The server has hidden your message for some players.",
"disconnect.loginFailedInfo.userBanned": "You are banned from playing online",
"options.chatPreview.live": "While Typing",
"options.chatPreview.confirm": "When Sending",
"options.chatPreview.tooltip.off": "Any modifications applied to your chat messages by a server will not be previewed and will be treated as insecure.",
"options.chatPreview.tooltip.live": "If a server uses Chat Previews: Any modifications applied to your chat messages by a server will be dynamically sent for previewing as the chat message is typed.",
"options.chatPreview.tooltip.confirm": "If a server uses Chat Previews: A chat preview is only generated when attempting to send a message that does not have a preview or is waiting for a preview.\nSending the message requires confirmation.",
"title.multiplayer.disabled.banned.temporary": "Your account is temporarily suspended from online play",
"title.multiplayer.disabled.banned.permanent": "Your account is permanently suspended from online play",
"gui.minutes": "%s minute(s)",
"gui.hours": "%s hour(s)",
"gui.days": "%s day(s)"
},
"1.19": {
"selectWorld.loading_list": "Loading world list",
"flat_world_preset.unknown": "???",
"flat_world_preset.minecraft.classic_flat": "Classic Flat",
"flat_world_preset.minecraft.tunnelers_dream": "Tunnelers' Dream",
"flat_world_preset.minecraft.water_world": "Water World",
"flat_world_preset.minecraft.overworld": "Overworld",
"flat_world_preset.minecraft.snowy_kingdom": "Snowy Kingdom",
"flat_world_preset.minecraft.bottomless_pit": "Bottomless Pit",
"flat_world_preset.minecraft.desert": "Desert",
"flat_world_preset.minecraft.redstone_ready": "Redstone Ready",
"flat_world_preset.minecraft.the_void": "The Void",
"generator.minecraft.normal": "Default",
"generator.minecraft.flat": "Superflat",
"generator.minecraft.large_biomes": "Large Biomes",
"generator.minecraft.amplified": "AMPLIFIED",
"generator.minecraft.amplified.info": "Notice: Just for fun! Requires a beefy computer.",
"generator.minecraft.debug_all_block_states": "Debug Mode",
"generator.minecraft.single_biome_surface": "Single Biome",
"multiplayer.disconnect.missing_public_key": "Missing profile public key.\nThis server requires secure profiles.",
"multiplayer.disconnect.invalid_public_key_signature": "Invalid signature for profile public key.\nTry restarting your game.",
"multiplayer.disconnect.invalid_public_key": "Unable to parse profile public key.",
"multiplayer.disconnect.out_of_order_chat": "Out-of-order chat packet received. Did your system time change?",
"chatPreview.warning.title": "This server uses Chat Preview",
"chatPreview.warning.content": "Chat Preview allows the server to see your messages in real time as you type them, even before they�re sent. This is often used to preview your message with styling applied.\n\nChat Preview is on by default, but can be turned off in Chat Settings.",
"chatPreview.warning.check": "Do not notify again for this server",
"chatPreview.warning.toast.title": "Chat Preview is enabled",
"chatPreview.warning.toast": "This server uses Chat Preview and can see your messages as you type them, even before they're sent. You can turn this off in Chat Settings.",
"chat.disabled.profile.moreInfo": "Chat not allowed by account settings. Cannot send or view messages.",
"chat.preview": "Type to preview",
"options.darknessEffectScale": "Darkness Pulsing",
"options.darknessEffectScale.tooltip": "Controls how much the Darkness effect pulses when a Warden or Sculk Shrieker gives it to you.",
"options.chatPreview": "Chat Preview",
"options.chatPreview.tooltip": "Chat Preview allows servers to see your messages as you type, which allows them to style your message. You can still chat if you turn this off.",
"options.onlyShowSecureChat": "Only Show Secure Chat",
"options.onlyShowSecureChat.tooltip": "Only display messages from other players that can be verified to have been sent by that player, and have not been modified.",
"options.directionalAudio": "Directional Audio",
"options.directionalAudio.on.tooltip": "Uses HRTF-based directional audio to improve the simulation of 3D sound. Requires HRTF compatible audio hardware, and is best experienced with headphones.",
"options.directionalAudio.off.tooltip": "Classic Stereo sound",
"block.minecraft.mangrove_planks": "Mangrove Planks",
"block.minecraft.mangrove_propagule": "Mangrove Propagule",
"block.minecraft.mangrove_door": "Mangrove Door",
"block.minecraft.mangrove_wood": "Mangrove Wood",
"block.minecraft.mangrove_log": "Mangrove Log",
"block.minecraft.mangrove_roots": "Mangrove Roots",
"block.minecraft.muddy_mangrove_roots": "Muddy Mangrove Roots",
"block.minecraft.stripped_mangrove_log": "Stripped Mangrove Log",
"block.minecraft.stripped_mangrove_wood": "Stripped Mangrove Wood",
"block.minecraft.mangrove_leaves": "Mangrove Leaves",
"block.minecraft.mud_brick_slab": "Mud Brick Slab",
"block.minecraft.mangrove_slab": "Mangrove Slab",
"block.minecraft.mangrove_stairs": "Mangrove Stairs",
"block.minecraft.mangrove_sign": "Mangrove Sign",
"block.minecraft.mangrove_wall_sign": "Mangrove Wall Sign",
"block.minecraft.mangrove_pressure_plate": "Mangrove Pressure Plate",
"block.minecraft.mangrove_button": "Mangrove Button",
"block.minecraft.mangrove_fence": "Mangrove Fence",
"block.minecraft.mangrove_fence_gate": "Mangrove Fence Gate",
"block.minecraft.mangrove_trapdoor": "Mangrove Trapdoor",
"block.minecraft.packed_mud": "Packed Mud",
"block.minecraft.mud_bricks": "Mud Bricks",
"block.minecraft.mud_brick_stairs": "Mud Brick Stairs",
"block.minecraft.potted_mangrove_propagule": "Potted Mangrove Propagule",
"block.minecraft.mud_brick_wall": "Mud Brick Wall",
"block.minecraft.mud": "Mud",
"block.minecraft.sculk": "Sculk",
"block.minecraft.sculk_catalyst": "Sculk Catalyst",
"block.minecraft.sculk_shrieker": "Sculk Shrieker",
"block.minecraft.sculk_vein": "Sculk Vein",
"block.minecraft.ochre_froglight": "Ochre Froglight",
"block.minecraft.verdant_froglight": "Verdant Froglight",
"block.minecraft.pearlescent_froglight": "Pearlescent Froglight",
"block.minecraft.frogspawn": "Frogspawn",
"block.minecraft.reinforced_deepslate": "Reinforced Deepslate",
"item.minecraft.tadpole_bucket": "Bucket of Tadpole",
"item.minecraft.oak_chest_boat": "Oak Boat with Chest",
"item.minecraft.spruce_chest_boat": "Spruce Boat with Chest",
"item.minecraft.birch_chest_boat": "Birch Boat with Chest",
"item.minecraft.jungle_chest_boat": "Jungle Boat with Chest",
"item.minecraft.acacia_chest_boat": "Acacia Boat with Chest",
"item.minecraft.dark_oak_chest_boat": "Dark Oak Boat with Chest",
"item.minecraft.mangrove_boat": "Mangrove Boat",
"item.minecraft.mangrove_chest_boat": "Mangrove Boat with Chest",
"item.minecraft.recovery_compass": "Recovery Compass",
"item.minecraft.music_disc_5": "Music Disc",
"item.minecraft.music_disc_5.desc": "Samuel �berg - 5",
"item.minecraft.disc_fragment_5": "Disc Fragment",
"item.minecraft.disc_fragment_5.desc": "Music Disc - 5",
"item.minecraft.allay_spawn_egg": "Allay Spawn Egg",
"item.minecraft.frog_spawn_egg": "Frog Spawn Egg",
"item.minecraft.tadpole_spawn_egg": "Tadpole Spawn Egg",
"item.minecraft.warden_spawn_egg": "Warden Spawn Egg",
"item.minecraft.echo_shard": "Echo Shard",
"item.minecraft.goat_horn": "Goat Horn",
"instrument.minecraft.ponder_goat_horn": "Ponder",
"instrument.minecraft.sing_goat_horn": "Sing",
"instrument.minecraft.seek_goat_horn": "Seek",
"instrument.minecraft.feel_goat_horn": "Feel",
"instrument.minecraft.admire_goat_horn": "Admire",
"instrument.minecraft.call_goat_horn": "Call",
"instrument.minecraft.yearn_goat_horn": "Yearn",
"instrument.minecraft.dream_goat_horn": "Dream",
"entity.minecraft.allay": "Allay",
"entity.minecraft.chest_boat": "Boat with Chest",
"entity.minecraft.frog": "Frog",
"entity.minecraft.tadpole": "Tadpole",
"entity.minecraft.warden": "Warden",
"death.attack.onFire.item": "%1$s was burnt to a crisp whilst fighting %2$s wielding %3$s",
"death.attack.witherSkull.item": "%1$s was shot by a skull from %2$s using %3$s",
"death.attack.sonic_boom": "%1$s was obliterated by a sonically-charged shriek",
"death.attack.sonic_boom.item": "%1$s was obliterated by a sonically-charged shriek whilst trying to escape %2$s wielding %3$s",
"death.attack.sonic_boom.player": "%1$s was obliterated by a sonically-charged shriek whilst trying to escape %2$s",
"death.attack.sting.item": "%1$s was stung to death by %2$s using %3$s",
"effect.minecraft.darkness": "Darkness",
"enchantment.minecraft.swift_sneak": "Swift Sneak",
"subtitles.block.frogspawn.hatch": "Tadpole hatches",
"subtitles.block.sculk.charge": "Sculk bubbles",
"subtitles.block.sculk.spread": "Sculk spreads",
"subtitles.block.sculk_catalyst.bloom": "Sculk Catalyst blooms",
"subtitles.block.sculk_shrieker.shriek": "Sculk Shrieker shrieks",
"subtitles.entity.allay.death": "Allay dies",
"subtitles.entity.allay.hurt": "Allay hurts",
"subtitles.entity.allay.ambient_with_item": "Allay seeks",
"subtitles.entity.allay.ambient_without_item": "Allay yearns",
"subtitles.entity.allay.item_given": "Allay chortles",
"subtitles.entity.allay.item_taken": "Allay allays",
"subtitles.entity.allay.item_thrown": "Allay tosses",
"subtitles.entity.frog.ambient": "Frog croaks",
"subtitles.entity.frog.death": "Frog dies",
"subtitles.entity.frog.eat": "Frog eats",
"subtitles.entity.frog.hurt": "Frog hurts",
"subtitles.entity.frog.lay_spawn": "Frog lays spawn",
"subtitles.entity.frog.long_jump": "Frog jumps",
"subtitles.entity.goat.horn_break": "Goat Horn breaks off",
"subtitles.entity.parrot.imitate.warden": "Parrot whines",
"subtitles.entity.tadpole.death": "Tadpole dies",
"subtitles.entity.tadpole.flop": "Tadpole flops",
"subtitles.entity.tadpole.hurt": "Tadpole hurts",
"subtitles.entity.warden.roar": "Warden roars",
"subtitles.entity.warden.sniff": "Warden sniffs",
"subtitles.entity.warden.emerge": "Warden emerges",
"subtitles.entity.warden.dig": "Warden digs",
"subtitles.entity.warden.hurt": "Warden hurts",
"subtitles.entity.warden.death": "Warden dies",
"subtitles.entity.warden.step": "Warden steps",
"subtitles.entity.warden.listening": "Warden takes notice",
"subtitles.entity.warden.listening_angry": "Warden takes notice angrily",
"subtitles.entity.warden.heartbeat": "Warden's heart beats",
"subtitles.entity.warden.attack_impact": "Warden lands hit",
"subtitles.entity.warden.tendril_clicks": "Warden's tendrils click",
"subtitles.entity.warden.angry": "Warden rages",
"subtitles.entity.warden.agitated": "Warden groans angrily",
"subtitles.entity.warden.ambient": "Warden whines",
"subtitles.entity.warden.nearby_close": "Warden approaches",
"subtitles.entity.warden.nearby_closer": "Warden advances",
"subtitles.entity.warden.nearby_closest": "Warden draws close",
"subtitles.entity.warden.sonic_charge": "Warden charges",
"subtitles.entity.warden.sonic_boom": "Warden booms",
"subtitles.item.bucket.fill_tadpole": "Tadpole captured",
"subtitles.item.goat_horn.play": "Goat Horn plays",
"advancements.adventure.avoid_vibration.title": "Sneak 100",
"advancements.adventure.avoid_vibration.description": "Sneak near a Sculk Sensor or Warden to prevent it from detecting you",
"advancements.adventure.kill_mob_near_sculk_catalyst.title": "It Spreads",
"advancements.adventure.kill_mob_near_sculk_catalyst.description": "Kill a mob near a Sculk Catalyst",
"advancements.husbandry.froglights.title": "With Our Powers Combined!",
"advancements.husbandry.froglights.description": "Have all Froglights in your inventory",
"advancements.husbandry.tadpole_in_a_bucket.title": "Bukkit Bukkit",
"advancements.husbandry.tadpole_in_a_bucket.description": "Catch a Tadpole in a Bucket",
"advancements.husbandry.leash_all_frog_variants.title": "When the Squad Hops into Town",
"advancements.husbandry.leash_all_frog_variants.description": "Get each Frog variant on a Lead",
"advancements.husbandry.allay_deliver_item_to_player.title": "You've Got a Friend in Me",
"advancements.husbandry.allay_deliver_item_to_player.description": "Have an Allay deliver items to you",
"advancements.husbandry.allay_deliver_cake_to_note_block.title": "Birthday Song",
"advancements.husbandry.allay_deliver_cake_to_note_block.description": "Have an Allay drop a Cake at a Note Block",
"argument.enum.invalid": "Invalid value \"%s\"",
"commands.locate.structure.success": "The nearest %s is at %s (%s blocks away)",
"commands.locate.structure.not_found": "Could not find a structure of type \"%s\" nearby",
"commands.locate.structure.invalid": "There is no structure with type \"%s\"",
"commands.locate.biome.success": "The nearest %s is at %s (%s blocks away)",
"commands.locate.biome.not_found": "Could not find a biome of type \"%s\" within reasonable distance",
"commands.locate.biome.invalid": "There is no biome with type \"%s\"",
"commands.locate.poi.success": "The nearest %s is at %s (%s blocks away)",
"commands.locate.poi.not_found": "Could not find a point of interest of type \"%s\" within reasonable distance",
"commands.locate.poi.invalid": "There is no point of interest with type \"%s\"",
"commands.place.feature.failed": "Failed to place feature",
"commands.place.feature.invalid": "There is no feature with type \"%s\"",
"commands.place.feature.success": "Placed \"%s\" at %s, %s, %s",
"commands.place.jigsaw.failed": "Failed to generate jigsaw",
"commands.place.jigsaw.invalid": "There is no template pool with type \"%s\"",
"commands.place.jigsaw.success": "Generated jigsaw at %s, %s, %s",
"commands.place.structure.failed": "Failed to place structure",
"commands.place.structure.invalid": "There is no structure with type \"%s\"",
"commands.place.structure.success": "Generated structure \"%s\" at %s, %s, %s",
"commands.place.template.failed": "Failed to place template",
"commands.place.template.invalid": "There is no template with id \"%s\"",
"commands.place.template.success": "Loaded template \"%s\" at %s, %s, %s",
"biome.minecraft.deep_dark": "Deep Dark",
"biome.minecraft.mangrove_swamp": "Mangrove Swamp",
"gamerule.doWardenSpawning": "Spawn Wardens",
"outOfMemory.title": "Out of memory!",
"outOfMemory.message": "Minecraft has run out of memory.\n\nThis could be caused by a bug in the game or by the Java Virtual Machine not being allocated enough memory.\n\nTo prevent level corruption, the current game has quit. We've tried to free up enough memory to let you go back to the main menu and back to playing, but this may not have worked.\n\nPlease restart the game if you see this message again."
},
"1.18": {
"selectWorld.conversion.tooltip": "This world must be opened in an older version (like 1.6.4) to be safely converted",
"selectWorld.incompatible_series": "Created by an incompatible version",
+1 -1
View File
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
viaver = "4.2.1"
viaver = "4.5.0"
# Common provided
netty = "4.0.20.Final"
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+11 -5
View File
@@ -1,7 +1,7 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -32,10 +32,10 @@
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
@@ -205,6 +205,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
Vendored
+8 -6
View File
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,7 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
if "%DIRNAME%"=="" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal