Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
65afe42d2c | ||
|
|
9da206e280 | ||
|
|
c2ae3df1db | ||
|
|
dc9fe10779 | ||
|
|
08a583526e | ||
|
|
125fa885f6 | ||
|
|
4a1eefcf87 | ||
|
|
68c0a0b333 | ||
|
|
fdc73126f7 | ||
|
|
1e0c0ebb2d | ||
|
|
5bffa2c51c | ||
|
|
34fa4f85db | ||
|
|
ef0e412d36 | ||
|
|
7df02934f3 | ||
|
|
d64b259b77 | ||
|
|
8850d5c8ff | ||
|
|
15c7106430 | ||
|
|
56dfc985d2 | ||
|
|
dfa778942c | ||
|
|
bd71833f18 | ||
|
|
c6f25bf33f | ||
|
|
fc22d7e6c8 | ||
|
|
22f604cd7e | ||
|
|
a85b9e8100 | ||
|
|
8d380f4278 | ||
|
|
1486d58813 | ||
|
|
9d3de047a0 | ||
|
|
c75e5bd6a7 | ||
|
|
30a3a4fb89 | ||
|
|
9fe9cd3a8a | ||
|
|
12926980e2 | ||
|
|
31787b5e5b | ||
|
|
d56921b611 | ||
|
|
15a5e6f710 | ||
|
|
422f2b699b | ||
|
|
eda8abf55c | ||
|
|
2b955894d3 | ||
|
|
539c4e696a | ||
|
|
aa35ace816 | ||
|
|
8ea7686b2c |
No files matched your search
+1
-1
@@ -5,7 +5,7 @@ plugins {
|
||||
|
||||
allprojects {
|
||||
group = "com.viaversion"
|
||||
version = "4.2.0"
|
||||
version = "4.3.0"
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
+3
-4
@@ -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
|
||||
}
|
||||
|
||||
+1
-6
@@ -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;
|
||||
}
|
||||
}
|
||||
+22
-16
@@ -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);
|
||||
|
||||
+1
-1
@@ -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";
|
||||
|
||||
-1
@@ -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;
|
||||
}
|
||||
|
||||
+1
-1
@@ -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")) {
|
||||
|
||||
+42
-1
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_13to1_13_1.packets;
|
||||
|
||||
import com.viaversion.viaversion.api.minecraft.BlockFace;
|
||||
import com.viaversion.viaversion.api.minecraft.Position;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
|
||||
import com.viaversion.viaversion.api.protocol.Protocol;
|
||||
@@ -58,6 +60,45 @@ public class WorldPackets1_13_1 {
|
||||
blockRewriter.registerBlockAction(ClientboundPackets1_13.BLOCK_ACTION);
|
||||
blockRewriter.registerBlockChange(ClientboundPackets1_13.BLOCK_CHANGE);
|
||||
blockRewriter.registerMultiBlockChange(ClientboundPackets1_13.MULTI_BLOCK_CHANGE);
|
||||
blockRewriter.registerEffect(ClientboundPackets1_13.EFFECT, 1010, 2001);
|
||||
protocol.registerClientbound(ClientboundPackets1_13.EFFECT, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.INT); // Effect Id
|
||||
map(Type.POSITION); // Location
|
||||
map(Type.INT); // Data
|
||||
handler(wrapper -> {
|
||||
int id = wrapper.get(Type.INT, 0);
|
||||
int data = wrapper.get(Type.INT, 1);
|
||||
if (id == 1010) { // Play record
|
||||
wrapper.set(Type.INT, 1, protocol.getMappingData().getNewItemId(data));
|
||||
} else if (id == 2001) { // Block break + block break sound
|
||||
wrapper.set(Type.INT, 1, protocol.getMappingData().getNewBlockStateId(data));
|
||||
} else if (id == 2000) { // Smoke
|
||||
switch (data) {
|
||||
case 0: // Down
|
||||
case 1: // Up
|
||||
Position pos = wrapper.get(Type.POSITION, 0);
|
||||
BlockFace relative = data == 0 ? BlockFace.BOTTOM : BlockFace.TOP;
|
||||
wrapper.set(Type.POSITION, 0, pos.getRelative(relative)); // Y Offset
|
||||
wrapper.set(Type.INT, 1, 4); // Self
|
||||
break;
|
||||
case 2: // North
|
||||
wrapper.set(Type.INT, 1, 1); // North
|
||||
break;
|
||||
case 3: // South
|
||||
wrapper.set(Type.INT, 1, 7); // South
|
||||
break;
|
||||
case 4: // West
|
||||
wrapper.set(Type.INT, 1, 3); // West
|
||||
break;
|
||||
case 5: // East
|
||||
wrapper.set(Type.INT, 1, 5); // East
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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());
|
||||
});
|
||||
}
|
||||
|
||||
+1
-1
@@ -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";
|
||||
}
|
||||
|
||||
+25
-9
@@ -17,16 +17,19 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_15_2to1_16.packets;
|
||||
|
||||
import com.viaversion.viabackwards.ViaBackwards;
|
||||
import com.viaversion.viabackwards.api.rewriters.EnchantmentRewriter;
|
||||
import com.viaversion.viabackwards.api.rewriters.MapColorRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_15_2to1_16.Protocol1_15_2To1_16;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_15_2to1_16.data.MapColorRewrites;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.storage.BiomeStorage;
|
||||
import com.viaversion.viaversion.api.minecraft.Position;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
|
||||
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.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.api.type.types.UUIDIntArrayType;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||
@@ -170,15 +173,28 @@ public class BlockItemPackets1_16 extends com.viaversion.viabackwards.api.rewrit
|
||||
}
|
||||
|
||||
if (chunk.isBiomeData()) {
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
int biome = chunk.getBiomeData()[i];
|
||||
switch (biome) {
|
||||
case 170: // new nether biomes
|
||||
case 171:
|
||||
case 172:
|
||||
case 173:
|
||||
chunk.getBiomeData()[i] = 8;
|
||||
break;
|
||||
if (wrapper.user().getProtocolInfo().getServerProtocolVersion() >= ProtocolVersion.v1_16_2.getVersion()) {
|
||||
BiomeStorage biomeStorage = wrapper.user().get(BiomeStorage.class);
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
int biome = chunk.getBiomeData()[i];
|
||||
int legacyBiome = biomeStorage.legacyBiome(biome);
|
||||
if (legacyBiome == -1) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("Biome sent that does not exist in the biome registry: " + biome);
|
||||
legacyBiome = 1;
|
||||
}
|
||||
chunk.getBiomeData()[i] = legacyBiome;
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
int biome = chunk.getBiomeData()[i];
|
||||
switch (biome) {
|
||||
case 170: // new nether biomes
|
||||
case 171:
|
||||
case 172:
|
||||
case 173:
|
||||
chunk.getBiomeData()[i] = 8;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
@@ -24,6 +24,7 @@ import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.data.CommandRewriter1_16_2;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.packets.BlockItemPackets1_16_2;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.packets.EntityPackets1_16_2;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.storage.BiomeStorage;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_16_2Types;
|
||||
@@ -136,6 +137,7 @@ public class Protocol1_16_1To1_16_2 extends BackwardsProtocol<ClientboundPackets
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.put(new BiomeStorage());
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, Entity1_16_2Types.PLAYER));
|
||||
}
|
||||
|
||||
|
||||
+149
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
* 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_16_1to1_16_2.data;
|
||||
|
||||
import com.viaversion.viabackwards.ViaBackwards;
|
||||
import com.viaversion.viabackwards.api.data.VBMappingDataLoader;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.libs.fastutil.objects.Object2IntMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.objects.Object2IntOpenHashMap;
|
||||
import com.viaversion.viaversion.libs.gson.JsonElement;
|
||||
import com.viaversion.viaversion.libs.gson.JsonObject;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public final class BiomeMappings {
|
||||
|
||||
private static final Object2IntMap<String> MODERN_TO_LEGACY_ID = new Object2IntOpenHashMap<>();
|
||||
private static final Object2IntMap<String> LEGACY_BIOMES = new Object2IntOpenHashMap<>();
|
||||
|
||||
static {
|
||||
LEGACY_BIOMES.defaultReturnValue(-1);
|
||||
MODERN_TO_LEGACY_ID.defaultReturnValue(-1);
|
||||
|
||||
add(0, "ocean");
|
||||
add(1, "plains");
|
||||
add(2, "desert");
|
||||
add(3, "mountains");
|
||||
add(4, "forest");
|
||||
add(5, "taiga");
|
||||
add(6, "swamp");
|
||||
add(7, "river");
|
||||
add(8, "nether");
|
||||
add(9, "the_end");
|
||||
add(10, "frozen_ocean");
|
||||
add(11, "frozen_river");
|
||||
add(12, "snowy_tundra");
|
||||
add(13, "snowy_mountains");
|
||||
add(14, "mushroom_fields");
|
||||
add(15, "mushroom_field_shore");
|
||||
add(16, "beach");
|
||||
add(17, "desert_hills");
|
||||
add(18, "wooded_hills");
|
||||
add(19, "taiga_hills");
|
||||
add(20, "mountain_edge");
|
||||
add(21, "jungle");
|
||||
add(22, "jungle_hills");
|
||||
add(23, "jungle_edge");
|
||||
add(24, "deep_ocean");
|
||||
add(25, "stone_shore");
|
||||
add(26, "snowy_beach");
|
||||
add(27, "birch_forest");
|
||||
add(28, "birch_forest_hills");
|
||||
add(29, "dark_forest");
|
||||
add(30, "snowy_taiga");
|
||||
add(31, "snowy_taiga_hills");
|
||||
add(32, "giant_tree_taiga");
|
||||
add(33, "giant_tree_taiga_hills");
|
||||
add(34, "wooded_mountains");
|
||||
add(35, "savanna");
|
||||
add(36, "savanna_plateau");
|
||||
add(37, "badlands");
|
||||
add(38, "wooded_badlands_plateau");
|
||||
add(39, "badlands_plateau");
|
||||
add(40, "small_end_islands");
|
||||
add(41, "end_midlands");
|
||||
add(42, "end_highlands");
|
||||
add(43, "end_barrens");
|
||||
add(44, "warm_ocean");
|
||||
add(45, "lukewarm_ocean");
|
||||
add(46, "cold_ocean");
|
||||
add(47, "deep_warm_ocean");
|
||||
add(48, "deep_lukewarm_ocean");
|
||||
add(49, "deep_cold_ocean");
|
||||
add(50, "deep_frozen_ocean");
|
||||
add(127, "the_void");
|
||||
add(129, "sunflower_plains");
|
||||
add(130, "desert_lakes");
|
||||
add(131, "gravelly_mountains");
|
||||
add(132, "flower_forest");
|
||||
add(133, "taiga_mountains");
|
||||
add(134, "swamp_hills");
|
||||
add(140, "ice_spikes");
|
||||
add(149, "modified_jungle");
|
||||
add(151, "modified_jungle_edge");
|
||||
add(155, "tall_birch_forest");
|
||||
add(156, "tall_birch_hills");
|
||||
add(157, "dark_forest_hills");
|
||||
add(158, "snowy_taiga_mountains");
|
||||
add(160, "giant_spruce_taiga");
|
||||
add(161, "giant_spruce_taiga_hills");
|
||||
add(162, "modified_gravelly_mountains");
|
||||
add(163, "shattered_savanna");
|
||||
add(164, "shattered_savanna_plateau");
|
||||
add(165, "eroded_badlands");
|
||||
add(166, "modified_wooded_badlands_plateau");
|
||||
add(167, "modified_badlands_plateau");
|
||||
add(168, "bamboo_jungle");
|
||||
add(169, "bamboo_jungle_hills");
|
||||
|
||||
// Include the legacy biomes themselves
|
||||
for (final Object2IntMap.Entry<String> entry : LEGACY_BIOMES.object2IntEntrySet()) {
|
||||
MODERN_TO_LEGACY_ID.put("minecraft:" + entry.getKey(), entry.getIntValue());
|
||||
}
|
||||
|
||||
final JsonObject mappings = VBMappingDataLoader.loadFromDataDir("biome-mappings.json");
|
||||
for (final Map.Entry<String, JsonElement> entry : mappings.entrySet()) {
|
||||
final int legacyBiome = LEGACY_BIOMES.getInt(entry.getValue().getAsString());
|
||||
if (legacyBiome == -1) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("Unknown legacy biome: " + entry.getValue().getAsString());
|
||||
continue;
|
||||
}
|
||||
|
||||
MODERN_TO_LEGACY_ID.put(entry.getKey(), legacyBiome);
|
||||
}
|
||||
}
|
||||
|
||||
private static void add(final int id, final String biome) {
|
||||
LEGACY_BIOMES.put(biome, id);
|
||||
}
|
||||
|
||||
public static int toLegacyBiome(String biome) {
|
||||
if (biome.indexOf(':') == -1) {
|
||||
biome = "minecraft:" + biome;
|
||||
}
|
||||
final int legacyBiome = MODERN_TO_LEGACY_ID.getInt(biome);
|
||||
if (legacyBiome == -1) {
|
||||
if (!Via.getConfig().isSuppressConversionWarnings()) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("Biome with id " + biome + " has no legacy biome mapping (custom datapack?)");
|
||||
}
|
||||
return 1; // Plains
|
||||
}
|
||||
return legacyBiome;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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";
|
||||
}
|
||||
|
||||
+27
-2
@@ -18,16 +18,22 @@
|
||||
package com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.packets;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.viaversion.viabackwards.ViaBackwards;
|
||||
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.Protocol1_16_1To1_16_2;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.storage.BiomeStorage;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_16Types;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_16_2Types;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.api.type.types.version.Types1_16;
|
||||
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_16_2to1_16_1.ClientboundPackets1_16_2;
|
||||
import com.viaversion.viaversion.protocols.protocol1_16to1_15_2.packets.EntityPackets;
|
||||
|
||||
@@ -36,6 +42,7 @@ import java.util.Set;
|
||||
public class EntityPackets1_16_2 extends EntityRewriter<Protocol1_16_1To1_16_2> {
|
||||
|
||||
private final Set<String> oldDimensions = Sets.newHashSet("minecraft:overworld", "minecraft:the_nether", "minecraft:the_end");
|
||||
private boolean warned;
|
||||
|
||||
public EntityPackets1_16_2(Protocol1_16_1To1_16_2 protocol) {
|
||||
super(protocol);
|
||||
@@ -66,8 +73,25 @@ public class EntityPackets1_16_2 extends EntityRewriter<Protocol1_16_1To1_16_2>
|
||||
map(Type.BYTE); // Previous Gamemode
|
||||
map(Type.STRING_ARRAY); // World List
|
||||
handler(wrapper -> {
|
||||
CompoundTag registry = wrapper.read(Type.NBT);
|
||||
if (wrapper.user().getProtocolInfo().getProtocolVersion() <= ProtocolVersion.v1_15_2.getVersion()) {
|
||||
// Store biomes for <1.16 client handling
|
||||
CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome");
|
||||
ListTag biomes = biomeRegistry.get("value");
|
||||
BiomeStorage biomeStorage = wrapper.user().get(BiomeStorage.class);
|
||||
biomeStorage.clear();
|
||||
for (Tag biome : biomes) {
|
||||
CompoundTag biomeCompound = (CompoundTag) biome;
|
||||
StringTag name = biomeCompound.get("name");
|
||||
NumberTag id = biomeCompound.get("id");
|
||||
biomeStorage.addBiome(name.getValue(), id.asInt());
|
||||
}
|
||||
} else if (!warned) {
|
||||
warned = true;
|
||||
ViaBackwards.getPlatform().getLogger().warning("1.16 and 1.16.1 clients are only partially supported and may have wrong biomes displayed.");
|
||||
}
|
||||
|
||||
// Just screw the registry and write the defaults for 1.16 and 1.16.1 clients
|
||||
wrapper.read(Type.NBT);
|
||||
wrapper.write(Type.NBT, EntityPackets.DIMENSIONS_TAG);
|
||||
|
||||
CompoundTag dimensionData = wrapper.read(Type.NBT);
|
||||
@@ -98,7 +122,8 @@ public class EntityPackets1_16_2 extends EntityRewriter<Protocol1_16_1To1_16_2>
|
||||
private String getDimensionFromData(CompoundTag dimensionData) {
|
||||
// This may technically break other custom dimension settings for 1.16/1.16.1 clients, so those cases are considered semi "unsupported" here
|
||||
StringTag effectsLocation = dimensionData.get("effects");
|
||||
return effectsLocation != null && oldDimensions.contains(effectsLocation.getValue()) ? effectsLocation.getValue() : "minecraft:overworld";
|
||||
return effectsLocation != null && oldDimensions.contains(effectsLocation.getValue()) ?
|
||||
effectsLocation.getValue() : "minecraft:overworld";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* 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_16_1to1_16_2.storage;
|
||||
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.data.BiomeMappings;
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2IntMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2IntOpenHashMap;
|
||||
|
||||
public final class BiomeStorage implements StorableObject {
|
||||
|
||||
private final Int2IntMap modernToLegacyBiomes = new Int2IntOpenHashMap();
|
||||
|
||||
public BiomeStorage() {
|
||||
modernToLegacyBiomes.defaultReturnValue(-1);
|
||||
}
|
||||
|
||||
public void addBiome(final String biome, final int id) {
|
||||
modernToLegacyBiomes.put(id, BiomeMappings.toLegacyBiome(biome));
|
||||
}
|
||||
|
||||
public int legacyBiome(final int biome) {
|
||||
return modernToLegacyBiomes.get(biome);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
modernToLegacyBiomes.clear();
|
||||
}
|
||||
}
|
||||
+2
@@ -25,6 +25,7 @@ import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.packets.BlockItemPackets1_17;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.packets.EntityPackets1_17;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.storage.PingRequests;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.storage.PlayerLastCursorItem;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
import com.viaversion.viaversion.api.minecraft.TagData;
|
||||
@@ -249,6 +250,7 @@ public final class Protocol1_16_4To1_17 extends BackwardsProtocol<ClientboundPac
|
||||
public void init(UserConnection user) {
|
||||
addEntityTracker(user, new EntityTrackerBase(user, Entity1_17Types.PLAYER));
|
||||
user.put(new PingRequests());
|
||||
user.put(new PlayerLastCursorItem());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+79
-9
@@ -23,15 +23,18 @@ import com.viaversion.viabackwards.api.rewriters.MapColorRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.Protocol1_16_4To1_17;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.data.MapColorRewrites;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.storage.PingRequests;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.storage.PlayerLastCursorItem;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockChangeRecord;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
|
||||
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.libs.opennbt.tag.builtin.CompoundTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.LongArrayTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
|
||||
import com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.ClientboundPackets1_16_2;
|
||||
import com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.ServerboundPackets1_16_2;
|
||||
@@ -63,7 +66,6 @@ public final class BlockItemPackets1_17 extends ItemRewriter<Protocol1_16_4To1_1
|
||||
|
||||
registerSetCooldown(ClientboundPackets1_17.COOLDOWN);
|
||||
registerWindowItems(ClientboundPackets1_17.WINDOW_ITEMS, Type.FLAT_VAR_INT_ITEM_ARRAY);
|
||||
registerSetSlot(ClientboundPackets1_17.SET_SLOT, Type.FLAT_VAR_INT_ITEM);
|
||||
registerEntityEquipmentArray(ClientboundPackets1_17.ENTITY_EQUIPMENT, Type.FLAT_VAR_INT_ITEM);
|
||||
registerTradeList(ClientboundPackets1_17.TRADE_LIST, Type.FLAT_VAR_INT_ITEM);
|
||||
registerAdvancements(ClientboundPackets1_17.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
|
||||
@@ -81,24 +83,87 @@ public final class BlockItemPackets1_17 extends ItemRewriter<Protocol1_16_4To1_1
|
||||
}
|
||||
});
|
||||
|
||||
//TODO This will cause desync issues for players under certain circumstances, but mostly works:tm:
|
||||
// TODO Since the carried and modified items are typically set incorrectly, the server sends unnecessary
|
||||
// set slot packets after practically every window click, since it thinks the client and server
|
||||
// inventories are desynchronized. Ideally, we want to store a replica of each container state, and update
|
||||
// it appropriately for both serverbound and clientbound window packets, then fill in the carried
|
||||
// and modified items array as appropriate here. That would be a ton of work and replicated vanilla code,
|
||||
// and the hack below mitigates the worst side effects of this issue, which is an incorrect carried item
|
||||
// sent to the client when a right/left click drag is started. It works, at least for now...
|
||||
protocol.registerServerbound(ServerboundPackets1_16_2.CLICK_WINDOW, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.UNSIGNED_BYTE); // Window Id
|
||||
map(Type.SHORT); // Slot
|
||||
map(Type.BYTE); // Button
|
||||
map(Type.SHORT, Type.NOTHING); // Action id - removed
|
||||
map(Type.VAR_INT); // Mode
|
||||
map(Type.UNSIGNED_BYTE);
|
||||
handler(wrapper -> {
|
||||
short slot = wrapper.passthrough(Type.SHORT); // Slot
|
||||
byte button = wrapper.passthrough(Type.BYTE); // Button
|
||||
wrapper.read(Type.SHORT); // Action id - removed
|
||||
int mode = wrapper.passthrough(Type.VAR_INT); // Mode
|
||||
Item clicked = handleItemToServer(wrapper.read(Type.FLAT_VAR_INT_ITEM)); // Clicked item
|
||||
|
||||
// The 1.17 client would check the entire inventory for changes before -> after a click and send the changed slots here
|
||||
wrapper.write(Type.VAR_INT, 0); // Empty array of slot+item
|
||||
|
||||
// Expected is the carried item after clicking, old clients send the clicked one (*mostly* being the same)
|
||||
handleItemToServer(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM));
|
||||
PlayerLastCursorItem state = wrapper.user().get(PlayerLastCursorItem.class);
|
||||
if (mode == 0 && button == 0 && clicked != null) {
|
||||
// Left click PICKUP
|
||||
// Carried item will (usually) be the entire clicked stack
|
||||
state.setLastCursorItem(clicked);
|
||||
} else if (mode == 0 && button == 1 && clicked != null) {
|
||||
// Right click PICKUP
|
||||
// Carried item will (usually) be half of the clicked stack (rounding up)
|
||||
// if the clicked slot is empty, otherwise it will (usually) be the whole clicked stack
|
||||
if (state.isSet()) {
|
||||
state.setLastCursorItem(clicked);
|
||||
} else {
|
||||
state.setLastCursorItem(clicked, (clicked.amount() + 1) / 2);
|
||||
}
|
||||
} else if (mode == 5 && slot == -999 && (button == 0 || button == 4)) {
|
||||
// Start drag (left or right click)
|
||||
// Preserve guessed carried item and forward to server
|
||||
// This mostly fixes the click and drag ghost item issue
|
||||
|
||||
// no-op
|
||||
} else {
|
||||
// Carried item unknown (TODO)
|
||||
state.setLastCursorItem(null);
|
||||
}
|
||||
|
||||
Item carried = state.getLastCursorItem();
|
||||
if (carried == null) {
|
||||
// Expected is the carried item after clicking, old clients send the clicked one (*mostly* being the same)
|
||||
wrapper.write(Type.FLAT_VAR_INT_ITEM, clicked);
|
||||
} else {
|
||||
wrapper.write(Type.FLAT_VAR_INT_ITEM, carried);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_17.SET_SLOT, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
short windowId = wrapper.passthrough(Type.UNSIGNED_BYTE);
|
||||
short slot = wrapper.passthrough(Type.SHORT);
|
||||
|
||||
Item carried = wrapper.read(Type.FLAT_VAR_INT_ITEM);
|
||||
if (carried != null && windowId == -1 && slot == -1) {
|
||||
// This is related to the hack to fix click and drag ghost items above.
|
||||
// After a completed drag, we have no idea how many items remain on the cursor,
|
||||
// and vanilla logic replication would be required to calculate the value.
|
||||
// When the click drag complete packet is sent, we will send an incorrect
|
||||
// carried item, and the server will helpfully send this packet allowing us
|
||||
// to update the internal state. This is necessary for fixing multiple sequential
|
||||
// click drag actions without intermittent pickup actions.
|
||||
wrapper.user().get(PlayerLastCursorItem.class).setLastCursorItem(carried);
|
||||
}
|
||||
|
||||
wrapper.write(Type.FLAT_VAR_INT_ITEM, handleItemToClient(carried));
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerServerbound(ServerboundPackets1_16_2.WINDOW_CONFIRMATION, null, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
@@ -305,6 +370,11 @@ public final class BlockItemPackets1_17 extends ItemRewriter<Protocol1_16_4To1_1
|
||||
section.setPaletteEntry(j, protocol.getMappingData().getNewBlockStateId(old));
|
||||
}
|
||||
}
|
||||
|
||||
chunk.getBlockEntities().removeIf(compound -> {
|
||||
NumberTag tag = compound.get("y");
|
||||
return tag != null && (tag.asInt() < 0 || tag.asInt() > 255);
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* 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_16_4to1_17.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.minecraft.item.DataItem;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
|
||||
public class PlayerLastCursorItem implements StorableObject {
|
||||
private Item lastCursorItem;
|
||||
|
||||
public Item getLastCursorItem() {
|
||||
return copyItem(lastCursorItem);
|
||||
}
|
||||
|
||||
public void setLastCursorItem(Item item) {
|
||||
this.lastCursorItem = copyItem(item);
|
||||
}
|
||||
|
||||
public void setLastCursorItem(Item item, int amount) {
|
||||
this.lastCursorItem = copyItem(item);
|
||||
this.lastCursorItem.setAmount(amount);
|
||||
}
|
||||
|
||||
public boolean isSet() {
|
||||
return lastCursorItem != null;
|
||||
}
|
||||
|
||||
private static Item copyItem(Item item) {
|
||||
if (item == null) {
|
||||
return null;
|
||||
}
|
||||
Item copy = new DataItem(item);
|
||||
copy.setTag(copy.tag() == null ? null : copy.tag().clone());
|
||||
return copy;
|
||||
}
|
||||
}
|
||||
+44
@@ -26,6 +26,7 @@ import com.viaversion.viabackwards.protocol.protocol1_17_1to1_18.packets.EntityP
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_17Types;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
|
||||
@@ -88,6 +89,49 @@ public final class Protocol1_17_1To1_18 extends BackwardsProtocol<ClientboundPac
|
||||
create(Type.BOOLEAN, true); // Allow listing in server list preview
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(ClientboundPackets1_18.SCOREBOARD_OBJECTIVE, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Name
|
||||
handler(cutName(0, 16));
|
||||
}
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_18.DISPLAY_SCOREBOARD, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.BYTE); // Slot
|
||||
map(Type.STRING); // Name
|
||||
handler(cutName(0, 16));
|
||||
}
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_18.TEAMS, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Name
|
||||
handler(cutName(0, 16));
|
||||
}
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_18.UPDATE_SCORE, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Owner
|
||||
map(Type.VAR_INT); // Method
|
||||
map(Type.STRING); // Name
|
||||
handler(cutName(0, 40));
|
||||
handler(cutName(1, 16));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private PacketHandler cutName(final int index, final int maxLength) {
|
||||
// May in some case cause clashes or bad ordering, but nothing we can do about that
|
||||
return wrapper -> {
|
||||
final String s = wrapper.get(Type.STRING, index);
|
||||
if (s.length() > maxLength) {
|
||||
wrapper.set(Type.STRING, index, s.substring(0, maxLength));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
+12
-1
@@ -18,6 +18,7 @@
|
||||
package com.viaversion.viabackwards.protocol.protocol1_17to1_17_1;
|
||||
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.storage.PlayerLastCursorItem;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_17to1_17_1.storage.InventoryStateIds;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
@@ -91,7 +92,17 @@ public final class Protocol1_17To1_17_1 extends BackwardsProtocol<ClientboundPac
|
||||
wrapper.write(Type.FLAT_VAR_INT_ITEM_ARRAY, wrapper.read(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT));
|
||||
|
||||
// Carried item - should work without adding it to the array above
|
||||
wrapper.read(Type.FLAT_VAR_INT_ITEM);
|
||||
Item carried = wrapper.read(Type.FLAT_VAR_INT_ITEM);
|
||||
|
||||
PlayerLastCursorItem lastCursorItem = wrapper.user().get(PlayerLastCursorItem.class);
|
||||
if (lastCursorItem != null) {
|
||||
// For click drag ghost item fix -- since the state ID is always wrong,
|
||||
// the server always resends the entire window contents after a drag action,
|
||||
// which is useful since we need to update the carried item in preparation
|
||||
// for a subsequent drag
|
||||
|
||||
lastCursorItem.setLastCursorItem(carried);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
+333
@@ -0,0 +1,333 @@
|
||||
/*
|
||||
* 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.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.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.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 text) throws Exception {
|
||||
translatableRewriter.processText(text);
|
||||
|
||||
final byte type = wrapper.get(Type.BYTE, 0);
|
||||
if (type > 2) {
|
||||
wrapper.set(Type.BYTE, 0, (byte) 0); // Chat type
|
||||
}
|
||||
|
||||
final String key = CHAT_KEYS[type];
|
||||
if (key != null) {
|
||||
Component component = Component.text(ViaBackwards.getConfig().chatTypeFormat(key));
|
||||
if (key.equals("chat.type.team.text")) {
|
||||
Preconditions.checkNotNull(teamName, "Team name is null");
|
||||
component = component.replaceText(replace(teamName));
|
||||
}
|
||||
if (senderName != null) {
|
||||
component = component.replaceText(replace(senderName));
|
||||
}
|
||||
component = component.replaceText(replace(text));
|
||||
wrapper.set(Type.COMPONENT, 0, GsonComponentSerializer.gson().serializeToTree(component));
|
||||
}
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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.libs.gson.JsonArray;
|
||||
import com.viaversion.viaversion.libs.gson.JsonElement;
|
||||
import com.viaversion.viaversion.libs.gson.JsonObject;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public final class BackwardsMappings extends com.viaversion.viabackwards.api.data.BackwardsMappings {
|
||||
|
||||
private String[] argumentTypes;
|
||||
|
||||
public BackwardsMappings() {
|
||||
super("1.19", "1.18", Protocol1_19To1_18_2.class, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadExtras(final JsonObject oldMappings, final JsonObject newMappings, @Nullable final JsonObject diffMappings) {
|
||||
super.loadExtras(oldMappings, newMappings, diffMappings);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public @Nullable String argumentType(final int argumentTypeId) {
|
||||
return argumentTypeId >= 0 && argumentTypeId < argumentTypes.length ? argumentTypes[argumentTypeId] : null;
|
||||
}
|
||||
}
|
||||
+31
@@ -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));
|
||||
}
|
||||
}
|
||||
+190
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* 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.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);
|
||||
registerTradeList(ClientboundPackets1_19.TRADE_LIST, 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.registerServerbound(ServerboundPackets1_17.EDIT_BOOK, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> handleItemToServer(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)));
|
||||
}
|
||||
});
|
||||
|
||||
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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+338
@@ -0,0 +1,338 @@
|
||||
/*
|
||||
* 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.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;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
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 String dimensionKey = wrapper.read(Type.STRING);
|
||||
final ListTag dimensions = ((CompoundTag) wrapper.get(Type.NBT, 0).get("minecraft:dimension_type")).get("value");
|
||||
final Map<String, CompoundTag> dimensionsMap = new HashMap<>(dimensions.size());
|
||||
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");
|
||||
dimensionsMap.put(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");
|
||||
}
|
||||
|
||||
wrapper.user().get(DimensionRegistryStorage.class).setDimensions(dimensionsMap);
|
||||
});
|
||||
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());
|
||||
handler(wrapper -> {
|
||||
final CompoundTag registry = wrapper.get(Type.NBT, 0);
|
||||
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"));
|
||||
}
|
||||
|
||||
registry.remove("minecraft:chat_type");
|
||||
|
||||
// Track amount of biomes sent
|
||||
tracker(wrapper.user()).setBiomesSent(biomes.size());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* 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.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 Map<String, CompoundTag> dimensions = new HashMap<>();
|
||||
|
||||
public @Nullable CompoundTag dimension(final String dimensionKey) {
|
||||
final CompoundTag compoundTag = dimensions.get(dimensionKey);
|
||||
return compoundTag != null ? compoundTag.clone() : null;
|
||||
}
|
||||
|
||||
public void setDimensions(final Map<String, CompoundTag> dimensions) {
|
||||
this.dimensions = dimensions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean clearOnServerSwitch() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+71
@@ -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);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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,26 @@
|
||||
{
|
||||
"minecraft:nether_wastes": "nether",
|
||||
"minecraft:soul_sand_valley": "nether",
|
||||
"minecraft:crimson_forest": "nether",
|
||||
"minecraft:warped_forest": "nether",
|
||||
"minecraft:basalt_deltas": "nether",
|
||||
"minecraft:dripstone_caves": "mountains",
|
||||
"minecraft:lush_caves": "mountains",
|
||||
"minecraft:meadow": "plains",
|
||||
"minecraft:grove": "snowy_mountains",
|
||||
"minecraft:snowy_slopes": "snowy_mountains",
|
||||
"minecraft:frozen_peaks": "snowy_mountains",
|
||||
"minecraft:jagged_peaks": "mountains",
|
||||
"minecraft:stony_peaks": "mountains",
|
||||
"minecraft:windswept_hills": "mountains",
|
||||
"minecraft:snowy_plains": "snowy_tundra",
|
||||
"minecraft:sparse_jungle": "jungle_edge",
|
||||
"minecraft:stony_shore": "stone_shore",
|
||||
"minecraft:old_growth_pine_taiga": "giant_spruce_taiga",
|
||||
"minecraft:windswept_forest": "forest",
|
||||
"minecraft:wooded_badlands": "wooded_badlands_plateau",
|
||||
"minecraft:windswept_gravelly_hills": "gravelly_mountains",
|
||||
"minecraft:old_growth_birch_forest": "tall_birch_forest",
|
||||
"minecraft:old_growth_spruce_taiga": "giant_spruce_taiga",
|
||||
"minecraft:windswept_savanna": "shattered_savanna"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
|
||||
[versions]
|
||||
|
||||
# ViaVersion
|
||||
viaver = "4.2.0-1.18.2-pre1-SNAPSHOT"
|
||||
viaver = "4.3.0-1.19-rc2-SNAPSHOT"
|
||||
|
||||
# Common provided
|
||||
netty = "4.0.20.Final"
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+1
-1
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -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:
|
||||
#
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||
enableFeaturePreview("VERSION_CATALOGS")
|
||||
|
||||
rootProject.name = "viabackwards-parent"
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ public class SpongePlugin implements ViaBackwardsPlatform {
|
||||
@Listener
|
||||
public void constructPlugin(ConstructPluginEvent event) {
|
||||
// Init!
|
||||
Via.getManager().addEnableListener(() -> this.init(configPath.resolve("config.yml").toFile()));
|
||||
Via.getManager().addEnableListener(() -> this.init(getDataFolder()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -53,7 +53,7 @@ public class VelocityPlugin implements ViaBackwardsPlatform {
|
||||
public void onProxyStart(ProxyInitializeEvent e) {
|
||||
// Setup Logger
|
||||
this.logger = new LoggerWrapper(loggerSlf4j);
|
||||
Via.getManager().addEnableListener(() -> this.init(configPath.resolve("config.yml").toFile()));
|
||||
Via.getManager().addEnableListener(() -> this.init(getDataFolder()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in new issue
Block a user