Compare commits

...
40 Commits
Author SHA1 Message Date
Nassim Jahnke 3826be4f5f 4.3.1 Release 2022-07-02 19:34:07 +02:00
Myles 4dd7d384c8 Add feature request label to issue templates 2022-06-27 13:37:20 +01: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
35 changed files with 2199 additions and 59 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
+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.3.1"
description = "Allow older clients to join newer server versions."
}
@@ -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", 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,6 +45,7 @@ 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_9_4to1_10.Protocol1_9_4To1_10;
import com.viaversion.viaversion.api.Via;
@@ -57,7 +58,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "4.2.0";
String MINIMUM_VV_VERSION = "4.3.0";
String IMPL_VERSION = "$IMPL_VERSION";
/**
@@ -111,6 +112,8 @@ 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);
}
/**
@@ -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) {
@@ -108,7 +108,7 @@ public class BackwardsMappings extends MappingDataBase {
}
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() + " :( ");
}
}
@@ -67,6 +67,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 +90,13 @@ public abstract class EntityRewriter<T extends BackwardsProtocol> extends Entity
});
}
private EntityType setOldEntityId(PacketWrapper wrapper) throws Exception {
/**
* 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
}
@@ -41,7 +41,6 @@ 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);
@@ -50,7 +49,7 @@ public class BackwardsMappings extends com.viaversion.viabackwards.api.data.Back
@Override
public void loadVBExtras(JsonObject oldMappings, JsonObject newMappings) {
enchantmentMappings = VBMappings.vbBuilder().warnOnMissing(false)
.unmapped(oldMappings.getAsJsonObject("enchantments")).mapped(newMappings.getAsJsonObject("enchantments")).build();
.unmapped(oldMappings.getAsJsonArray("enchantments")).mapped(newMappings.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);
@@ -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;
}
@@ -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")) {
@@ -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());
});
}
@@ -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";
}
@@ -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";
}
@@ -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,384 @@
/*
* 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.google.common.base.Preconditions;
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.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.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.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.kyori.adventure.text.Component;
import com.viaversion.viaversion.libs.kyori.adventure.text.TextReplacementConfig;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
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.Tag;
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_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.Map;
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 String[] CHAT_KEYS = {"chat.type.text", null, null, "chat.type.announcement", "commands.message.display.incoming", "chat.type.team.text", "chat.type.emote", null};
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();
});
//TODO update translation mappings on release
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 -> {
// Send the unsigned message if present, otherwise the signed message
final JsonElement message = wrapper.read(Type.COMPONENT);
final JsonElement unsignedMessage = wrapper.read(Type.OPTIONAL_COMPONENT);
wrapper.write(Type.COMPONENT, unsignedMessage != null ? unsignedMessage : message);
});
map(Type.VAR_INT, Type.BYTE); // Chat type
map(Type.UUID); // Sender
handler(wrapper -> {
final JsonElement senderName = wrapper.read(Type.COMPONENT);
final JsonElement teamName = wrapper.read(Type.OPTIONAL_COMPONENT);
final JsonElement element = wrapper.get(Type.COMPONENT, 0);
handleChatType(wrapper, senderName, teamName, element);
});
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() {
map(Type.COMPONENT); // Message
map(Type.VAR_INT, Type.BYTE); // Chat type
create(Type.UUID, ZERO_UUID); // Sender
handler(wrapper -> handleChatType(wrapper, null, null, wrapper.get(Type.COMPONENT, 0)));
}
});
registerServerbound(ServerboundPackets1_17.CHAT_MESSAGE, new PacketRemapper() {
@Override
public void registerMap() {
map(Type.STRING); // Message
create(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
wrapper.write(Type.BOOLEAN, false); // No signed preview
} 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
create(Type.BOOLEAN, false); // No public key - requiring this has to be disabled on the server
}
});
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;
}
private TextReplacementConfig replace(final JsonElement replacement) {
return TextReplacementConfig.builder().matchLiteral("%s").replacement(GsonComponentSerializer.gson().deserializeFromTree(replacement)).once().build();
}
private void handleChatType(final PacketWrapper wrapper, final JsonElement senderName, final JsonElement teamName, final JsonElement message) throws Exception {
translatableRewriter.processText(message);
final byte id = wrapper.get(Type.BYTE, 0);
CompoundTag chatType = wrapper.user().get(DimensionRegistryStorage.class).chatType(id);
CompoundTag handlers = chatType.get("element");
boolean handled = false;
for (Map.Entry<String, Tag> handler : handlers) {
byte oldId;
switch (handler.getKey()) {
case "chat":
oldId = 1;
break;
case "overlay":
oldId = 2;
break;
default:
continue;
}
CompoundTag decoration = ((CompoundTag) handler.getValue()).get("decoration");
JsonElement formattedMessage;
if (decoration != null) {
String translationKey = (String) decoration.get("translation_key").getValue();
String rawTranslation = ViaBackwards.getConfig().chatTypeFormat(translationKey);
if (rawTranslation == null) {
ViaBackwards.getPlatform().getLogger().warning("Missing chat type translation for key " + translationKey);
continue;
}
Component component = Component.text(rawTranslation);
ListTag parameters = decoration.get("parameters");
if (parameters != null) for (Tag element : parameters) {
switch ((String) element.getValue()) {
case "sender":
component = component.replaceText(replace(senderName));
break;
case "content":
component = component.replaceText(replace(message));
break;
case "team_name":
Preconditions.checkNotNull(teamName, "Team name is null");
component = component.replaceText(replace(teamName));
break;
default:
ViaBackwards.getPlatform().getLogger().warning("Unknown parameter for chat decoration: " + element.getValue());
}
}
formattedMessage = GsonComponentSerializer.gson().serializeToTree(component);
} else {
formattedMessage = message;
}
if (!handled) {
handled = true;
wrapper.set(Type.BYTE, 0, oldId);
wrapper.set(Type.COMPONENT, 0, formattedMessage);
} else {
PacketWrapper extra = wrapper.create(ClientboundPackets1_18.CHAT_MESSAGE);
extra.write(Type.COMPONENT, formattedMessage);
extra.write(Type.BYTE, oldId);
extra.write(Type.UUID, wrapper.get(Type.UUID, 0));
}
}
if (!handled) wrapper.cancel();
}
}
@@ -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 oldMappings, final JsonObject newMappings) {
int i = 0;
final JsonArray types = oldMappings.getAsJsonArray("argumenttypes");
this.argumentTypes = new String[types.size()];
for (final JsonElement element : types) {
final String id = element.getAsString();
this.argumentTypes[i++] = id;
}
try {
ListTag chatTypes = BinaryTagIO.readCompressedInputStream(VBMappingDataLoader.getResource("chat-types-1.19.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 (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, Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT, Type.FLAT_VAR_INT_ITEM);
registerSetSlot1_17_1(ClientboundPackets1_19.SET_SLOT, Type.FLAT_VAR_INT_ITEM);
registerEntityEquipmentArray(ClientboundPackets1_19.ENTITY_EQUIPMENT, Type.FLAT_VAR_INT_ITEM);
registerAdvancements(ClientboundPackets1_19.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
registerClickWindow1_17_1(ServerboundPackets1_17.CLICK_WINDOW, Type.FLAT_VAR_INT_ITEM);
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,340 @@
/*
* 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
if (wrapper.passthrough(Type.BOOLEAN)) {
wrapper.passthrough(Type.STRING); // Signature
}
}
wrapper.passthrough(Type.VAR_INT); // Gamemode
wrapper.passthrough(Type.VAR_INT); // Ping
if (wrapper.passthrough(Type.BOOLEAN)) {
wrapper.passthrough(Type.COMPONENT); // Display name
}
// Remove public profile signature
if (wrapper.read(Type.BOOLEAN)) {
wrapper.read(Type.LONG); // Timestamp
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE); // Key
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
}
} else if (action == 1 || action == 2) { // Update gamemode/update latency
wrapper.passthrough(Type.VAR_INT);
} else if (action == 3) { // Update display name
if (wrapper.passthrough(Type.BOOLEAN)) {
wrapper.passthrough(Type.COMPONENT);
}
}
}
});
}
});
}
@Override
public void onMappingDataLoaded() {
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);
mapTypes();
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
mapEntityTypeWithData(Entity1_19Types.FROG, Entity1_19Types.RABBIT).jsonName();
mapEntityTypeWithData(Entity1_19Types.TADPOLE, Entity1_19Types.PUFFERFISH).jsonName();
mapEntityTypeWithData(Entity1_19Types.CHEST_BOAT, Entity1_19Types.BOAT);
filter().type(Entity1_19Types.WARDEN).cancel(16); // Anger
mapEntityTypeWithData(Entity1_19Types.WARDEN, Entity1_19Types.IRON_GOLEM).jsonName();
mapEntityTypeWithData(Entity1_19Types.ALLAY, Entity1_19Types.VEX).jsonName();
filter().type(Entity1_19Types.GOAT).cancel(18);
filter().type(Entity1_19Types.GOAT).cancel(19);
}
@Override
public EntityType typeFromId(final int typeId) {
return Entity1_19Types.getTypeFromId(typeId);
}
}
@@ -0,0 +1,62 @@
/*
* 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) {
if (chatTypes.isEmpty()) return Protocol1_18_2To1_19.MAPPINGS.chatType(id);
return 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";
}
@@ -19,4 +19,12 @@ 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
#
# Chat type formats used for sub 1.19 clients.
chat-types:
"chat.type.text": "<%s> %s"
"chat.type.announcement": "[%s] %s"
"commands.message.display.incoming": "%s whispers to you: %s"
"chat.type.team.text": "%s <%s> %s"
"chat.type.emote": "* %s %s"
@@ -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": "",
"block.sculk_vein.break": "",
"block.sculk_vein.fall": "",
"block.sculk_vein.hit": "",
"block.sculk_vein.place": "",
"block.sculk_vein.step": "",
"block.sculk_catalyst.bloom": "",
"block.sculk_catalyst.break": "",
"block.sculk_catalyst.fall": "",
"block.sculk_catalyst.hit": "",
"block.sculk_catalyst.place": "",
"block.sculk_catalyst.step": "",
"block.sculk.spread": "",
"block.sculk.charge": "",
"block.sculk.break": "",
"block.sculk.fall": "",
"block.sculk.hit": "",
"block.sculk.place": "",
"block.sculk.step": "",
"block.sculk_shrieker.break": "",
"block.sculk_shrieker.fall": "",
"block.sculk_shrieker.hit": "",
"block.sculk_shrieker.place": "",
"block.sculk_shrieker.step": "",
"block.sculk_shrieker.shriek": "",
"entity.warden.ambient": "",
"entity.warden.listening": "",
"entity.warden.listening_angry": "",
"entity.warden.angry": "",
"entity.warden.hurt": "",
"entity.warden.death": "",
"entity.warden.step": "",
"entity.warden.tendril_clicks": "",
"entity.warden.heartbeat": "",
"entity.warden.agitated": "",
"entity.warden.attack_impact": "",
"entity.warden.roar": "",
"entity.warden.sniff": "",
"entity.warden.emerge": "",
"entity.warden.dig": "",
"entity.warden.nearby_closest": "",
"entity.warden.nearby_closer": "",
"entity.warden.nearby_close": "",
"item.bucket.empty_tadpole": "",
"item.bucket.fill_tadpole": "",
"block.froglight.break": "",
"block.froglight.fall": "",
"block.froglight.hit": "",
"block.froglight.place": "",
"block.froglight.step": "",
"block.frogspawn.step": "",
"block.frogspawn.break": "",
"block.frogspawn.fall": "",
"block.frogspawn.hatch": "",
"block.frogspawn.hit": "",
"block.frogspawn.place": "",
"entity.frog.ambient": "",
"entity.frog.death": "",
"entity.frog.eat": "",
"entity.frog.hurt": "",
"entity.frog.lay_spawn": "",
"entity.frog.long_jump": "",
"entity.frog.step": "",
"entity.frog.tounge": "",
"block.mangrove_roots.break": "",
"block.mangrove_roots.fall": "",
"block.mangrove_roots.hit": "",
"block.mangrove_roots.place": "",
"block.mangrove_roots.step": "",
"block.mud.break": "",
"block.mud.fall": "",
"block.mud.hit": "",
"block.mud.place": "",
"block.mud.step": "",
"block.mud_bricks.break": "",
"block.mud_bricks.fall": "",
"block.mud_bricks.hit": "",
"block.mud_bricks.place": "",
"block.mud_bricks.step": "",
"block.muddy_mangrove_roots.break": "",
"block.muddy_mangrove_roots.fall": "",
"block.muddy_mangrove_roots.hit": "",
"block.muddy_mangrove_roots.place": "",
"block.muddy_mangrove_roots.step": "",
"block.packed_mud.break": "",
"block.packed_mud.fall": "",
"block.packed_mud.hit": "",
"block.packed_mud.place": "",
"block.packed_mud.step": "",
"entity.tadpole.death": "",
"entity.tadpole.eat": "",
"entity.tadpole.flop": "",
"entity.tadpole.grow_up": "",
"entity.tadpole.hurt": "",
"entity.tadpole.step": "",
"entity.allay.ambient_with_item": "",
"entity.allay.ambient_without_item": "",
"entity.allay.death": "",
"entity.allay.flap": "",
"entity.allay.hurt": "",
"entity.allay.item_given": "",
"entity.allay.item_taken": "",
"entity.parrot.imitate.warden": "",
"entity.warden.sonic_boom": "",
"entity.warden.sonic_charge": "",
"entity.allay.item_thrown": "",
"music_disc.5": "",
"music.overworld.swamp": "",
"music.overworld.jungle_and_forest": "",
"music.overworld.old_growth_taiga": "",
"entity.goat.horn_break": "",
"item.goat_horn.play": "",
"entity.goat.screaming.horn_break": "",
"item.goat_horn.sound.0": "",
"item.goat_horn.sound.1": "",
"item.goat_horn.sound.2": "",
"item.goat_horn.sound.3": "",
"item.goat_horn.sound.4": "",
"item.goat_horn.sound.5": "",
"item.goat_horn.sound.6": "",
"item.goat_horn.sound.7": ""
},
"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"
}
}
@@ -1,4 +1,174 @@
{
"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.",
"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.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.recovery_compass": "Recovery Compass",
"item.minecraft.music_disc_5": "Music Disc",
"item.minecraft.music_disc_5.desc": "Samuel Åberg - 5",
"item.minecraft.mangrove_chest_boat": "Mangrove Boat with Chest",
"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.sonic_boom": "%1$s was obliterated by a sonically-charged shriek",
"death.attack.sonic_boom.player": "%1$s was obliterated by a sonically-charged shriek whilst trying to escape %2$s",
"effect.minecraft.darkness": "Darkness",
"enchantment.minecraft.swift_sneak": "Swift Sneak",
"subtitles.block.frogspawn.hatch": "Tadpole hatches",
"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.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",
"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",
"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.3.1"
# 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.4.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+5 -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:
#