Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40047330b4 | ||
|
|
98304168b8 | ||
|
|
3695df1e44 | ||
|
|
958f265e18 | ||
|
|
394c944c50 | ||
|
|
d559c7cff1 | ||
|
|
3d4f4438a8 | ||
|
|
2972fb8422 | ||
|
|
817593ee43 | ||
|
|
044980c1a8 | ||
|
|
245bd53850 | ||
|
|
b632e4772f | ||
|
|
b336b8a1fc | ||
|
|
304b21425c | ||
|
|
bb17bb3bfd | ||
|
|
941bb91be8 | ||
|
|
fb334c6c14 | ||
|
|
90460ee99f | ||
|
|
81a737886a | ||
|
|
356158a9d4 | ||
|
|
32bd9378e1 | ||
|
|
317af16975 | ||
|
|
3826be4f5f | ||
|
|
282afe94cc | ||
|
|
9d86b31cb7 | ||
|
|
80041606a7 | ||
|
|
41e4172136 | ||
|
|
a856658399 | ||
|
|
7173bbbbce | ||
|
|
54507c6175 | ||
|
|
4dd7d384c8 | ||
|
|
fc751aedf3 | ||
|
|
a1da3dc11c | ||
|
|
87c37b08e8 | ||
|
|
187b79f4e1 | ||
|
|
b84cda54c3 | ||
|
|
f474067eb2 | ||
|
|
6a700d228d | ||
|
|
f08223d1e9 | ||
|
|
a5e3a6b563 | ||
|
|
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 | ||
|
|
d56921b611 | ||
|
|
15a5e6f710 | ||
|
|
422f2b699b |
No files matched your search
@@ -1,5 +1,6 @@
|
||||
name: Feature Request
|
||||
description: Suggest a feature to be added
|
||||
labels: [Feature Request]
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
@@ -34,4 +35,4 @@ body:
|
||||
description: |
|
||||
Does the feature apply to any specific version or environment?
|
||||
validations:
|
||||
required: false
|
||||
required: false
|
||||
@@ -11,7 +11,7 @@ Supported Versions
|
||||
**Green** = ViaVersion\
|
||||
**Purple** = ViaBackwards addition
|
||||
|
||||

|
||||

|
||||
|
||||
Releases / Dev Builds
|
||||
-
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ plugins {
|
||||
|
||||
allprojects {
|
||||
group = "com.viaversion"
|
||||
version = "4.2.1"
|
||||
version = "4.4.2"
|
||||
description = "Allow older clients to join newer server versions."
|
||||
}
|
||||
|
||||
|
||||
@@ -50,6 +50,11 @@ public class BukkitPlugin extends JavaPlugin implements ViaBackwardsPlatform {
|
||||
}
|
||||
|
||||
private void onServerLoaded() {
|
||||
if (isOutdatedPostLoad()) {
|
||||
disable();
|
||||
return;
|
||||
}
|
||||
|
||||
BukkitViaLoader loader = (BukkitViaLoader) Via.getManager().getLoader();
|
||||
int protocolVersion = Via.getAPI().getServerVersion().highestSupportedVersion();
|
||||
if (protocolVersion >= ProtocolVersion.v1_16.getVersion()) {
|
||||
|
||||
@@ -18,10 +18,12 @@
|
||||
package com.viaversion.viabackwards;
|
||||
|
||||
import com.viaversion.viaversion.util.Config;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -33,6 +35,7 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
|
||||
private boolean alwaysShowOriginalMobName;
|
||||
private boolean fix1_13FormattedInventoryTitles;
|
||||
private boolean handlePingsAsInvAcknowledgements;
|
||||
private Map<String, String> chatTypeFormats;
|
||||
|
||||
public ViaBackwardsConfig(File configFile) {
|
||||
super(configFile);
|
||||
@@ -51,6 +54,7 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
|
||||
fix1_13FormattedInventoryTitles = getBoolean("fix-formatted-inventory-titles", true);
|
||||
alwaysShowOriginalMobName = getBoolean("always-show-original-mob-name", true);
|
||||
handlePingsAsInvAcknowledgements = getBoolean("handle-pings-as-inv-acknowledgements", false);
|
||||
chatTypeFormats = get("chat-types-1_19_1", Map.class, new HashMap<String, String>());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -83,6 +87,11 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
|
||||
return handlePingsAsInvAcknowledgements || Boolean.getBoolean("com.viaversion.handlePingsAsInvAcknowledgements");
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable String chatTypeFormat(final String translationKey) {
|
||||
return chatTypeFormats.get(translationKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public URL getDefaultConfigURL() {
|
||||
return getClass().getClassLoader().getResource("assets/viabackwards/config.yml");
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.api;
|
||||
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public interface ViaBackwardsConfig {
|
||||
|
||||
/**
|
||||
@@ -50,4 +52,6 @@ public interface ViaBackwardsConfig {
|
||||
boolean alwaysShowOriginalMobName();
|
||||
|
||||
boolean handlePingsAsInvAcknowledgements();
|
||||
|
||||
@Nullable String chatTypeFormat(String translationKey);
|
||||
}
|
||||
@@ -45,7 +45,9 @@ 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_19to1_19_1.Protocol1_19To1_19_1;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_9_4to1_10.Protocol1_9_4To1_10;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.protocol.ProtocolManager;
|
||||
@@ -57,7 +59,7 @@ import java.util.logging.Logger;
|
||||
|
||||
public interface ViaBackwardsPlatform {
|
||||
|
||||
String MINIMUM_VV_VERSION = "4.2.0";
|
||||
String MINIMUM_VV_VERSION = "4.4.2";
|
||||
String IMPL_VERSION = "$IMPL_VERSION";
|
||||
|
||||
/**
|
||||
@@ -69,14 +71,17 @@ public interface ViaBackwardsPlatform {
|
||||
|
||||
ViaBackwards.init(this, config);
|
||||
|
||||
if (isOutdated()) return;
|
||||
if (isOutdated()) {
|
||||
disable();
|
||||
return;
|
||||
}
|
||||
|
||||
Via.getManager().getSubPlatforms().add(IMPL_VERSION);
|
||||
|
||||
getLogger().info("Loading translations...");
|
||||
TranslatableRewriter.loadTranslatables();
|
||||
|
||||
ProtocolManager protocolManager = Via.getManager().getProtocolManager();
|
||||
final ProtocolManager protocolManager = Via.getManager().getProtocolManager();
|
||||
protocolManager.registerProtocol(new Protocol1_9_4To1_10(), ProtocolVersion.v1_9_3, ProtocolVersion.v1_10);
|
||||
|
||||
protocolManager.registerProtocol(new Protocol1_10To1_11(), ProtocolVersion.v1_10, ProtocolVersion.v1_11);
|
||||
@@ -111,6 +116,9 @@ public interface ViaBackwardsPlatform {
|
||||
|
||||
protocolManager.registerProtocol(new Protocol1_17_1To1_18(), ProtocolVersion.v1_17_1, ProtocolVersion.v1_18);
|
||||
protocolManager.registerProtocol(new Protocol1_18To1_18_2(), ProtocolVersion.v1_18, ProtocolVersion.v1_18_2);
|
||||
|
||||
protocolManager.registerProtocol(new Protocol1_18_2To1_19(), ProtocolVersion.v1_18_2, ProtocolVersion.v1_19);
|
||||
protocolManager.registerProtocol(new Protocol1_19To1_19_1(), ProtocolVersion.v1_19, ProtocolVersion.v1_19_1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -129,11 +137,12 @@ public interface ViaBackwardsPlatform {
|
||||
getLogger().severe("LINK: https://ci.viaversion.com/");
|
||||
getLogger().severe("VIABACKWARDS WILL NOW DISABLE");
|
||||
getLogger().severe("================================");
|
||||
|
||||
disable();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
default boolean isOutdatedPostLoad() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ public class BackwardsMappings extends MappingDataBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadExtras(JsonObject oldMappings, JsonObject newMappings, @Nullable JsonObject diffMappings) {
|
||||
protected final void loadExtras(JsonObject oldMappings, JsonObject newMappings, @Nullable JsonObject diffMappings) {
|
||||
if (diffMappings != null) {
|
||||
JsonObject diffItems = diffMappings.getAsJsonObject("items");
|
||||
if (diffItems != null) {
|
||||
@@ -108,7 +108,7 @@ public class BackwardsMappings extends MappingDataBase {
|
||||
}
|
||||
|
||||
protected boolean shouldWarnOnMissing(String key) {
|
||||
return !key.equals("blocks") && !key.equals("statistics");
|
||||
return !key.equals("blocks") && !key.equals("statistics") && !key.equals("entities");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -154,6 +154,11 @@ public class BackwardsMappings extends MappingDataBase {
|
||||
}
|
||||
|
||||
public @Nullable String mappedEntityName(String entityName) {
|
||||
if (entityNames == null) {
|
||||
ViaBackwards.getPlatform().getLogger().severe("No entity mappings found when requesting them for " + entityName);
|
||||
new Exception().printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return entityNames.get(entityName);
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.viaversion.viaversion.libs.gson.JsonObject;
|
||||
import com.viaversion.viaversion.libs.gson.JsonPrimitive;
|
||||
import com.viaversion.viaversion.libs.gson.JsonSyntaxException;
|
||||
import com.viaversion.viaversion.util.GsonUtil;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
@@ -58,10 +59,14 @@ public final class VBMappingDataLoader {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static @Nullable InputStream getResource(String name) {
|
||||
return VBMappingDataLoader.class.getClassLoader().getResourceAsStream("assets/viabackwards/data/" + name);
|
||||
}
|
||||
|
||||
public static JsonObject loadData(String name) {
|
||||
InputStream stream = VBMappingDataLoader.class.getClassLoader().getResourceAsStream("assets/viabackwards/data/" + name);
|
||||
try (InputStreamReader reader = new InputStreamReader(stream)) {
|
||||
return GsonUtil.getGson().fromJson(reader, JsonObject.class);
|
||||
try (InputStream stream = getResource(name)) {
|
||||
if (stream == null) return null;
|
||||
return GsonUtil.getGson().fromJson(new InputStreamReader(stream), JsonObject.class);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
@@ -135,12 +140,12 @@ public final class VBMappingDataLoader {
|
||||
|
||||
public static Int2ObjectMap<MappedItem> loadItemMappings(JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping, boolean warnOnMissing) {
|
||||
Int2ObjectMap<MappedItem> itemMapping = new Int2ObjectOpenHashMap<>(diffMapping.size(), 0.99F);
|
||||
Object2IntMap<String> newIdenfierMap = MappingDataLoader.indexedObjectToMap(newMapping);
|
||||
Object2IntMap<String> oldIdenfierMap = MappingDataLoader.indexedObjectToMap(oldMapping);
|
||||
Object2IntMap<String> newIdentifierMap = MappingDataLoader.indexedObjectToMap(newMapping);
|
||||
Object2IntMap<String> oldIdentifierMap = MappingDataLoader.indexedObjectToMap(oldMapping);
|
||||
for (Map.Entry<String, JsonElement> entry : diffMapping.entrySet()) {
|
||||
JsonObject object = entry.getValue().getAsJsonObject();
|
||||
String mappedIdName = object.getAsJsonPrimitive("id").getAsString();
|
||||
int mappedId = newIdenfierMap.getInt(mappedIdName);
|
||||
int mappedId = newIdentifierMap.getInt(mappedIdName);
|
||||
if (mappedId == -1) {
|
||||
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("No key for " + mappedIdName + " :( ");
|
||||
@@ -148,7 +153,7 @@ public final class VBMappingDataLoader {
|
||||
continue;
|
||||
}
|
||||
|
||||
int oldId = oldIdenfierMap.getInt(entry.getKey());
|
||||
int oldId = oldIdentifierMap.getInt(entry.getKey());
|
||||
if (oldId == -1) {
|
||||
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("No old entry for " + mappedIdName + " :( ");
|
||||
@@ -162,8 +167,8 @@ public final class VBMappingDataLoader {
|
||||
|
||||
// Look for missing keys
|
||||
if (warnOnMissing && !Via.getConfig().isSuppressConversionWarnings()) {
|
||||
for (Object2IntMap.Entry<String> entry : oldIdenfierMap.object2IntEntrySet()) {
|
||||
if (!newIdenfierMap.containsKey(entry.getKey()) && !itemMapping.containsKey(entry.getIntValue())) {
|
||||
for (Object2IntMap.Entry<String> entry : oldIdentifierMap.object2IntEntrySet()) {
|
||||
if (!newIdentifierMap.containsKey(entry.getKey()) && !itemMapping.containsKey(entry.getIntValue())) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("No item mapping for " + entry.getKey() + " :( ");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package com.viaversion.viabackwards.api.rewriters;
|
||||
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.metadata.MetaType;
|
||||
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
|
||||
@@ -67,6 +68,17 @@ public abstract class EntityRewriter<T extends BackwardsProtocol> extends Entity
|
||||
};
|
||||
}
|
||||
|
||||
public PacketHandler getSpawnTrackerWithDataHandler1_19(EntityType fallingBlockType) {
|
||||
return wrapper -> {
|
||||
// Check against the UNMAPPED entity type
|
||||
EntityType entityType = setOldEntityId(wrapper);
|
||||
if (entityType == fallingBlockType) {
|
||||
int blockState = wrapper.get(Type.VAR_INT, 2);
|
||||
wrapper.set(Type.VAR_INT, 2, protocol.getMappingData().getNewBlockStateId(blockState));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void registerSpawnTracker(ClientboundPacketType packetType) {
|
||||
protocol.registerClientbound(packetType, new PacketRemapper() {
|
||||
@Override
|
||||
@@ -79,7 +91,25 @@ public abstract class EntityRewriter<T extends BackwardsProtocol> extends Entity
|
||||
});
|
||||
}
|
||||
|
||||
private EntityType setOldEntityId(PacketWrapper wrapper) throws Exception {
|
||||
public PacketHandler worldTrackerHandlerByKey() {
|
||||
return wrapper -> {
|
||||
EntityTracker tracker = tracker(wrapper.user());
|
||||
String world = wrapper.get(Type.STRING, 1);
|
||||
if (tracker.currentWorld() != null && !tracker.currentWorld().equals(world)) {
|
||||
tracker.clearEntities();
|
||||
tracker.trackClientEntity();
|
||||
}
|
||||
tracker.setCurrentWorld(world);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the mapped entity id and returns the unmapped entity type.
|
||||
*
|
||||
* @param wrapper packet wrapper
|
||||
* @return unmapped (!) entity type
|
||||
*/
|
||||
protected EntityType setOldEntityId(PacketWrapper wrapper) throws Exception {
|
||||
int typeId = wrapper.get(Type.VAR_INT, 1);
|
||||
EntityType entityType = typeFromId(typeId);
|
||||
tracker(wrapper.user()).addEntity(wrapper.get(Type.VAR_INT, 0), entityType);
|
||||
|
||||
+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
|
||||
}
|
||||
|
||||
-9
@@ -80,15 +80,6 @@ public class TranslatableRewriter extends ComponentRewriter {
|
||||
});
|
||||
}
|
||||
|
||||
public void registerChatMessage(ClientboundPacketType packetType) {
|
||||
protocol.registerClientbound(packetType, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> processText(wrapper.passthrough(Type.COMPONENT)));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void registerLegacyOpenWindow(ClientboundPacketType packetType) {
|
||||
protocol.registerClientbound(packetType, new PacketRemapper() {
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ public class PlayerPackets1_11 {
|
||||
private static final ValueTransformer<Short, Float> TO_NEW_FLOAT = new ValueTransformer<Short, Float>(Type.FLOAT) {
|
||||
@Override
|
||||
public Float transform(PacketWrapper wrapper, Short inputValue) throws Exception {
|
||||
return inputValue / 15f;
|
||||
return inputValue / 16f;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+1
-1
@@ -73,7 +73,7 @@ public class Protocol1_12_2To1_13 extends BackwardsProtocol<ClientboundPackets1_
|
||||
};
|
||||
translatableRewriter.registerPing();
|
||||
translatableRewriter.registerBossBar(ClientboundPackets1_13.BOSSBAR);
|
||||
translatableRewriter.registerChatMessage(ClientboundPackets1_13.CHAT_MESSAGE);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_13.CHAT_MESSAGE);
|
||||
translatableRewriter.registerLegacyOpenWindow(ClientboundPackets1_13.OPEN_WINDOW);
|
||||
translatableRewriter.registerDisconnect(ClientboundPackets1_13.DISCONNECT);
|
||||
translatableRewriter.registerCombatEvent(ClientboundPackets1_13.COMBAT_EVENT);
|
||||
|
||||
+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
@@ -59,7 +59,7 @@ public class Protocol1_13_2To1_14 extends BackwardsProtocol<ClientboundPackets1_
|
||||
executeAsyncAfterLoaded(Protocol1_14To1_13_2.class, MAPPINGS::load);
|
||||
|
||||
translatableRewriter.registerBossBar(ClientboundPackets1_14.BOSSBAR);
|
||||
translatableRewriter.registerChatMessage(ClientboundPackets1_14.CHAT_MESSAGE);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_14.CHAT_MESSAGE);
|
||||
translatableRewriter.registerCombatEvent(ClientboundPackets1_14.COMBAT_EVENT);
|
||||
translatableRewriter.registerDisconnect(ClientboundPackets1_14.DISCONNECT);
|
||||
translatableRewriter.registerTabList(ClientboundPackets1_14.TAB_LIST);
|
||||
|
||||
+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
@@ -66,7 +66,7 @@ public class Protocol1_13To1_13_1 extends BackwardsProtocol<ClientboundPackets1_
|
||||
WorldPackets1_13_1.register(this);
|
||||
|
||||
TranslatableRewriter translatableRewriter = new TranslatableRewriter(this);
|
||||
translatableRewriter.registerChatMessage(ClientboundPackets1_13.CHAT_MESSAGE);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_13.CHAT_MESSAGE);
|
||||
translatableRewriter.registerCombatEvent(ClientboundPackets1_13.COMBAT_EVENT);
|
||||
translatableRewriter.registerDisconnect(ClientboundPackets1_13.DISCONNECT);
|
||||
translatableRewriter.registerTabList(ClientboundPackets1_13.TAB_LIST);
|
||||
|
||||
+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")) {
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ public class Protocol1_14_4To1_15 extends BackwardsProtocol<ClientboundPackets1_
|
||||
executeAsyncAfterLoaded(Protocol1_15To1_14_4.class, MAPPINGS::load);
|
||||
|
||||
translatableRewriter.registerBossBar(ClientboundPackets1_15.BOSSBAR);
|
||||
translatableRewriter.registerChatMessage(ClientboundPackets1_15.CHAT_MESSAGE);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_15.CHAT_MESSAGE);
|
||||
translatableRewriter.registerCombatEvent(ClientboundPackets1_15.COMBAT_EVENT);
|
||||
translatableRewriter.registerDisconnect(ClientboundPackets1_15.DISCONNECT);
|
||||
translatableRewriter.registerOpenWindow(ClientboundPackets1_15.OPEN_WINDOW);
|
||||
|
||||
+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";
|
||||
}
|
||||
|
||||
+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";
|
||||
}
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ public final class Protocol1_16_4To1_17 extends BackwardsProtocol<ClientboundPac
|
||||
protected void registerPackets() {
|
||||
executeAsyncAfterLoaded(Protocol1_17To1_16_4.class, MAPPINGS::load);
|
||||
|
||||
translatableRewriter.registerChatMessage(ClientboundPackets1_17.CHAT_MESSAGE);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_17.CHAT_MESSAGE);
|
||||
translatableRewriter.registerBossBar(ClientboundPackets1_17.BOSSBAR);
|
||||
translatableRewriter.registerDisconnect(ClientboundPackets1_17.DISCONNECT);
|
||||
translatableRewriter.registerTabList(ClientboundPackets1_17.TAB_LIST);
|
||||
|
||||
+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();
|
||||
|
||||
+315
@@ -0,0 +1,315 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19;
|
||||
|
||||
import com.viaversion.viabackwards.ViaBackwards;
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
|
||||
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.data.BackwardsMappings;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.data.CommandRewriter1_19;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets.BlockItemPackets1_19;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets.EntityPackets1_19;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage.DimensionRegistryStorage;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.Protocol1_19To1_19_1;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
|
||||
import com.viaversion.viaversion.api.protocol.packet.State;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
|
||||
import com.viaversion.viaversion.api.rewriter.EntityRewriter;
|
||||
import com.viaversion.viaversion.api.rewriter.ItemRewriter;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
|
||||
import com.viaversion.viaversion.libs.gson.JsonElement;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
|
||||
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
|
||||
import com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ServerboundPackets1_17;
|
||||
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ChatDecorationResult;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.Protocol1_19_1To1_19;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ServerboundPackets1_19;
|
||||
import com.viaversion.viaversion.rewriter.CommandRewriter;
|
||||
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
|
||||
import com.viaversion.viaversion.rewriter.TagRewriter;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.UUID;
|
||||
|
||||
public final class Protocol1_18_2To1_19 extends BackwardsProtocol<ClientboundPackets1_19, ClientboundPackets1_18, ServerboundPackets1_19, ServerboundPackets1_17> {
|
||||
|
||||
public static final BackwardsMappings MAPPINGS = new BackwardsMappings();
|
||||
private static final UUID ZERO_UUID = new UUID(0, 0);
|
||||
private static final byte[] EMPTY_BYTES = new byte[0];
|
||||
private final EntityPackets1_19 entityRewriter = new EntityPackets1_19(this);
|
||||
private final BlockItemPackets1_19 blockItemPackets = new BlockItemPackets1_19(this);
|
||||
private final TranslatableRewriter translatableRewriter = new TranslatableRewriter(this);
|
||||
|
||||
public Protocol1_18_2To1_19() {
|
||||
super(ClientboundPackets1_19.class, ClientboundPackets1_18.class, ServerboundPackets1_19.class, ServerboundPackets1_17.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
executeAsyncAfterLoaded(Protocol1_19To1_18_2.class, () -> {
|
||||
MAPPINGS.load();
|
||||
entityRewriter.onMappingDataLoaded();
|
||||
});
|
||||
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_19.ACTIONBAR);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_19.TITLE_TEXT);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_19.TITLE_SUBTITLE);
|
||||
translatableRewriter.registerBossBar(ClientboundPackets1_19.BOSSBAR);
|
||||
translatableRewriter.registerDisconnect(ClientboundPackets1_19.DISCONNECT);
|
||||
translatableRewriter.registerTabList(ClientboundPackets1_19.TAB_LIST);
|
||||
translatableRewriter.registerOpenWindow(ClientboundPackets1_19.OPEN_WINDOW);
|
||||
translatableRewriter.registerCombatKill(ClientboundPackets1_19.COMBAT_KILL);
|
||||
translatableRewriter.registerPing();
|
||||
|
||||
blockItemPackets.register();
|
||||
entityRewriter.register();
|
||||
|
||||
final SoundRewriter soundRewriter = new SoundRewriter(this);
|
||||
soundRewriter.registerStopSound(ClientboundPackets1_19.STOP_SOUND);
|
||||
registerClientbound(ClientboundPackets1_19.SOUND, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Sound id
|
||||
map(Type.VAR_INT); // Source
|
||||
map(Type.INT); // X
|
||||
map(Type.INT); // Y
|
||||
map(Type.INT); // Z
|
||||
map(Type.FLOAT); // Volume
|
||||
map(Type.FLOAT); // Pitch
|
||||
read(Type.LONG); // Seed
|
||||
handler(soundRewriter.getSoundHandler());
|
||||
}
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_19.ENTITY_SOUND, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Sound id
|
||||
map(Type.VAR_INT); // Source
|
||||
map(Type.VAR_INT); // Entity id
|
||||
map(Type.FLOAT); // Volume
|
||||
map(Type.FLOAT); // Pitch
|
||||
read(Type.LONG); // Seed
|
||||
handler(soundRewriter.getSoundHandler());
|
||||
}
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_19.NAMED_SOUND, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Sound name
|
||||
map(Type.VAR_INT); // Source
|
||||
map(Type.INT); // X
|
||||
map(Type.INT); // Y
|
||||
map(Type.INT); // Z
|
||||
map(Type.FLOAT); // Volume
|
||||
map(Type.FLOAT); // Pitch
|
||||
read(Type.LONG); // Seed
|
||||
handler(soundRewriter.getNamedSoundHandler());
|
||||
}
|
||||
});
|
||||
|
||||
final TagRewriter tagRewriter = new TagRewriter(this);
|
||||
tagRewriter.removeTags("minecraft:banner_pattern");
|
||||
tagRewriter.removeTags("minecraft:instrument");
|
||||
tagRewriter.removeTags("minecraft:cat_variant");
|
||||
tagRewriter.removeTags("minecraft:painting_variant");
|
||||
tagRewriter.addEmptyTag(RegistryType.BLOCK, "minecraft:polar_bears_spawnable_on_in_frozen_ocean");
|
||||
tagRewriter.renameTag(RegistryType.BLOCK, "minecraft:wool_carpets", "minecraft:carpets");
|
||||
tagRewriter.renameTag(RegistryType.ITEM, "minecraft:wool_carpets", "minecraft:carpets");
|
||||
tagRewriter.addEmptyTag(RegistryType.ITEM, "minecraft:occludes_vibration_signals");
|
||||
tagRewriter.registerGeneric(ClientboundPackets1_19.TAGS);
|
||||
|
||||
new StatisticsRewriter(this).register(ClientboundPackets1_19.STATISTICS);
|
||||
|
||||
final CommandRewriter commandRewriter = new CommandRewriter1_19(this);
|
||||
registerClientbound(ClientboundPackets1_19.DECLARE_COMMANDS, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final int size = wrapper.passthrough(Type.VAR_INT);
|
||||
for (int i = 0; i < size; i++) {
|
||||
final byte flags = wrapper.passthrough(Type.BYTE);
|
||||
wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE); // Children indices
|
||||
if ((flags & 0x08) != 0) {
|
||||
wrapper.passthrough(Type.VAR_INT); // Redirect node index
|
||||
}
|
||||
|
||||
final int nodeType = flags & 0x03;
|
||||
if (nodeType == 1 || nodeType == 2) { // Literal/argument node
|
||||
wrapper.passthrough(Type.STRING); // Name
|
||||
}
|
||||
|
||||
if (nodeType == 2) { // Argument node
|
||||
final int argumentTypeId = wrapper.read(Type.VAR_INT);
|
||||
String argumentType = MAPPINGS.argumentType(argumentTypeId);
|
||||
if (argumentType == null) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("Unknown command argument type id: " + argumentTypeId);
|
||||
argumentType = "minecraft:no";
|
||||
}
|
||||
|
||||
wrapper.write(Type.STRING, commandRewriter.handleArgumentType(argumentType));
|
||||
commandRewriter.handleArgument(wrapper, argumentType);
|
||||
|
||||
if ((flags & 0x10) != 0) {
|
||||
wrapper.passthrough(Type.STRING); // Suggestion type
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wrapper.passthrough(Type.VAR_INT); // Root node index
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
cancelClientbound(ClientboundPackets1_19.SERVER_DATA);
|
||||
cancelClientbound(ClientboundPackets1_19.CHAT_PREVIEW);
|
||||
cancelClientbound(ClientboundPackets1_19.SET_DISPLAY_CHAT_PREVIEW);
|
||||
registerClientbound(ClientboundPackets1_19.PLAYER_CHAT, ClientboundPackets1_18.CHAT_MESSAGE, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final JsonElement signedContent = wrapper.read(Type.COMPONENT);
|
||||
final JsonElement unsignedContent = wrapper.read(Type.OPTIONAL_COMPONENT);
|
||||
final int chatTypeId = wrapper.read(Type.VAR_INT);
|
||||
final UUID sender = wrapper.read(Type.UUID);
|
||||
final JsonElement senderName = wrapper.read(Type.COMPONENT);
|
||||
final JsonElement teamName = wrapper.read(Type.OPTIONAL_COMPONENT);
|
||||
|
||||
final CompoundTag chatType = wrapper.user().get(DimensionRegistryStorage.class).chatType(chatTypeId);
|
||||
final ChatDecorationResult decorationResult = Protocol1_19_1To1_19.decorateChatMessage(chatType, chatTypeId, senderName, teamName, unsignedContent != null ? unsignedContent : signedContent);
|
||||
if (decorationResult == null) {
|
||||
wrapper.cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
translatableRewriter.processText(decorationResult.content());
|
||||
wrapper.write(Type.COMPONENT, decorationResult.content());
|
||||
wrapper.write(Type.BYTE, decorationResult.overlay() ? (byte) 2 : 1);
|
||||
wrapper.write(Type.UUID, sender);
|
||||
});
|
||||
read(Type.LONG); // Timestamp
|
||||
read(Type.LONG); // Salt
|
||||
read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(ClientboundPackets1_19.SYSTEM_CHAT, ClientboundPackets1_18.CHAT_MESSAGE, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final JsonElement content = wrapper.passthrough(Type.COMPONENT);
|
||||
translatableRewriter.processText(content);
|
||||
|
||||
// Screw everything that isn't a system or game info type (which would only happen on funny 1.19.0 servers)
|
||||
final int typeId = wrapper.read(Type.VAR_INT);
|
||||
wrapper.write(Type.BYTE, typeId == Protocol1_19To1_19_1.GAME_INFO_ID ? (byte) 2 : (byte) 0);
|
||||
});
|
||||
create(Type.UUID, ZERO_UUID); // Sender
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(ServerboundPackets1_17.CHAT_MESSAGE, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Message
|
||||
handler(wrapper -> wrapper.write(Type.LONG, Instant.now().toEpochMilli())); // Timestamp
|
||||
create(Type.LONG, 0L); // Salt
|
||||
handler(wrapper -> {
|
||||
final String message = wrapper.get(Type.STRING, 0);
|
||||
if (!message.isEmpty() && message.charAt(0) == '/') {
|
||||
wrapper.setPacketType(ServerboundPackets1_19.CHAT_COMMAND);
|
||||
wrapper.set(Type.STRING, 0, message.substring(1));
|
||||
wrapper.write(Type.VAR_INT, 0); // No signatures
|
||||
} else {
|
||||
wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, EMPTY_BYTES); // Signature
|
||||
}
|
||||
wrapper.write(Type.BOOLEAN, false); // No signed preview
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Login changes
|
||||
registerClientbound(State.LOGIN, ClientboundLoginPackets.GAME_PROFILE.getId(), ClientboundLoginPackets.GAME_PROFILE.getId(), new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.UUID); // UUID
|
||||
map(Type.STRING); // Name
|
||||
handler(wrapper -> {
|
||||
final int properties = wrapper.read(Type.VAR_INT);
|
||||
for (int i = 0; i < properties; i++) {
|
||||
wrapper.read(Type.STRING); // Name
|
||||
wrapper.read(Type.STRING); // Value
|
||||
if (wrapper.read(Type.BOOLEAN)) {
|
||||
wrapper.read(Type.STRING); // Signature
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(State.LOGIN, ServerboundLoginPackets.HELLO.getId(), ServerboundLoginPackets.HELLO.getId(), new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Name
|
||||
// Write empty profile key - requires the enforce-secure-profiles option to be disabled on the server
|
||||
create(Type.OPTIONAL_PROFILE_KEY, null);
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(State.LOGIN, ServerboundLoginPackets.ENCRYPTION_KEY.getId(), ServerboundLoginPackets.ENCRYPTION_KEY.getId(), new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.BYTE_ARRAY_PRIMITIVE); // Keys
|
||||
create(Type.BOOLEAN, true); // Is nonce
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final UserConnection user) {
|
||||
user.put(new DimensionRegistryStorage());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, Entity1_19Types.PLAYER, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public BackwardsMappings getMappingData() {
|
||||
return MAPPINGS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TranslatableRewriter getTranslatableRewriter() {
|
||||
return translatableRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityRewriter getEntityRewriter() {
|
||||
return entityRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemRewriter getItemRewriter() {
|
||||
return blockItemPackets;
|
||||
}
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.data;
|
||||
|
||||
import com.viaversion.viabackwards.api.data.VBMappingDataLoader;
|
||||
import com.viaversion.viaversion.api.minecraft.nbt.BinaryTagIO;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import com.viaversion.viaversion.libs.gson.JsonArray;
|
||||
import com.viaversion.viaversion.libs.gson.JsonElement;
|
||||
import com.viaversion.viaversion.libs.gson.JsonObject;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public final class BackwardsMappings extends com.viaversion.viabackwards.api.data.BackwardsMappings {
|
||||
|
||||
private String[] argumentTypes;
|
||||
private final Int2ObjectMap<CompoundTag> defaultChatTypes = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
public BackwardsMappings() {
|
||||
super("1.19", "1.18", Protocol1_19To1_18_2.class, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadVBExtras(final JsonObject oldMappings, final JsonObject newMappings) {
|
||||
int i = 0;
|
||||
final JsonArray types = oldMappings.getAsJsonArray("argumenttypes");
|
||||
this.argumentTypes = new String[types.size()];
|
||||
for (final JsonElement element : types) {
|
||||
final String id = element.getAsString();
|
||||
this.argumentTypes[i++] = id;
|
||||
}
|
||||
|
||||
try {
|
||||
final ListTag chatTypes = BinaryTagIO.readCompressedInputStream(VBMappingDataLoader.getResource("chat-types-1.19.1.nbt")).get("values");
|
||||
for (final Tag chatType : chatTypes) {
|
||||
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
|
||||
final NumberTag idTag = chatTypeCompound.get("id");
|
||||
defaultChatTypes.put(idTag.asInt(), chatTypeCompound);
|
||||
}
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public @Nullable String argumentType(final int argumentTypeId) {
|
||||
return argumentTypeId >= 0 && argumentTypeId < argumentTypes.length ? argumentTypes[argumentTypeId] : null;
|
||||
}
|
||||
|
||||
public @Nullable CompoundTag chatType(final int id) {
|
||||
return defaultChatTypes.get(id);
|
||||
}
|
||||
}
|
||||
+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));
|
||||
}
|
||||
}
|
||||
+216
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets;
|
||||
|
||||
import com.viaversion.viabackwards.api.rewriters.ItemRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2To1_19;
|
||||
import com.viaversion.viaversion.api.data.ParticleMappings;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.PaletteType;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.protocols.protocol1_16to1_15_2.data.RecipeRewriter1_16;
|
||||
import com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ServerboundPackets1_17;
|
||||
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.types.Chunk1_18Type;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
|
||||
import com.viaversion.viaversion.rewriter.BlockRewriter;
|
||||
import com.viaversion.viaversion.util.MathUtil;
|
||||
|
||||
public final class BlockItemPackets1_19 extends ItemRewriter<Protocol1_18_2To1_19> {
|
||||
|
||||
public BlockItemPackets1_19(final Protocol1_18_2To1_19 protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
final BlockRewriter blockRewriter = new BlockRewriter(protocol, Type.POSITION1_14);
|
||||
|
||||
new RecipeRewriter1_16(protocol).registerDefaultHandler(ClientboundPackets1_19.DECLARE_RECIPES);
|
||||
|
||||
registerSetCooldown(ClientboundPackets1_19.COOLDOWN);
|
||||
registerWindowItems1_17_1(ClientboundPackets1_19.WINDOW_ITEMS, Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT, Type.FLAT_VAR_INT_ITEM);
|
||||
registerSetSlot1_17_1(ClientboundPackets1_19.SET_SLOT, Type.FLAT_VAR_INT_ITEM);
|
||||
registerEntityEquipmentArray(ClientboundPackets1_19.ENTITY_EQUIPMENT, Type.FLAT_VAR_INT_ITEM);
|
||||
registerAdvancements(ClientboundPackets1_19.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
|
||||
registerClickWindow1_17_1(ServerboundPackets1_17.CLICK_WINDOW, Type.FLAT_VAR_INT_ITEM);
|
||||
|
||||
blockRewriter.registerBlockAction(ClientboundPackets1_19.BLOCK_ACTION);
|
||||
blockRewriter.registerBlockChange(ClientboundPackets1_19.BLOCK_CHANGE);
|
||||
blockRewriter.registerVarLongMultiBlockChange(ClientboundPackets1_19.MULTI_BLOCK_CHANGE);
|
||||
blockRewriter.registerEffect(ClientboundPackets1_19.EFFECT, 1010, 2001);
|
||||
|
||||
registerCreativeInvAction(ServerboundPackets1_17.CREATIVE_INVENTORY_ACTION, Type.FLAT_VAR_INT_ITEM);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.TRADE_LIST, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Container id
|
||||
handler(wrapper -> {
|
||||
final int size = wrapper.read(Type.VAR_INT);
|
||||
wrapper.write(Type.UNSIGNED_BYTE, (short) size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // First item
|
||||
handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // Result
|
||||
|
||||
final Item secondItem = wrapper.read(Type.FLAT_VAR_INT_ITEM);
|
||||
if (secondItem != null) {
|
||||
handleItemToClient(secondItem);
|
||||
wrapper.write(Type.BOOLEAN, true);
|
||||
wrapper.write(Type.FLAT_VAR_INT_ITEM, secondItem);
|
||||
} else {
|
||||
wrapper.write(Type.BOOLEAN, false);
|
||||
}
|
||||
|
||||
wrapper.passthrough(Type.BOOLEAN); // Out of stock
|
||||
wrapper.passthrough(Type.INT); // Uses
|
||||
wrapper.passthrough(Type.INT); // Max uses
|
||||
wrapper.passthrough(Type.INT); // Xp
|
||||
wrapper.passthrough(Type.INT); // Special price diff
|
||||
wrapper.passthrough(Type.FLOAT); // Price multiplier
|
||||
wrapper.passthrough(Type.INT); //Demand
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerWindowPropertyEnchantmentHandler(ClientboundPackets1_19.WINDOW_PROPERTY);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.BLOCK_CHANGED_ACK, null, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
read(Type.VAR_INT); // Sequence
|
||||
handler(PacketWrapper::cancel); // This is fine:tm:
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.SPAWN_PARTICLE, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT, Type.INT); // Particle id
|
||||
map(Type.BOOLEAN); // Override limiter
|
||||
map(Type.DOUBLE); // X
|
||||
map(Type.DOUBLE); // Y
|
||||
map(Type.DOUBLE); // Z
|
||||
map(Type.FLOAT); // Offset X
|
||||
map(Type.FLOAT); // Offset Y
|
||||
map(Type.FLOAT); // Offset Z
|
||||
map(Type.FLOAT); // Max speed
|
||||
map(Type.INT); // Particle Count
|
||||
handler(wrapper -> {
|
||||
final int id = wrapper.get(Type.INT, 0);
|
||||
final ParticleMappings particleMappings = protocol.getMappingData().getParticleMappings();
|
||||
if (id == particleMappings.id("sculk_charge")) {
|
||||
//TODO
|
||||
wrapper.set(Type.INT, 0, -1);
|
||||
wrapper.cancel();
|
||||
} else if (id == particleMappings.id("shriek")) {
|
||||
//TODO
|
||||
wrapper.set(Type.INT, 0, -1);
|
||||
wrapper.cancel();
|
||||
} else if (id == particleMappings.id("vibration")) {
|
||||
// Can't do without the position
|
||||
wrapper.set(Type.INT, 0, -1);
|
||||
wrapper.cancel();
|
||||
}
|
||||
});
|
||||
handler(getSpawnParticleHandler(Type.FLAT_VAR_INT_ITEM));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.CHUNK_DATA, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user());
|
||||
final Chunk1_18Type chunkType = new Chunk1_18Type(tracker.currentWorldSectionHeight(),
|
||||
MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().mappedSize()),
|
||||
MathUtil.ceilLog2(tracker.biomesSent()));
|
||||
final Chunk chunk = wrapper.passthrough(chunkType);
|
||||
for (final ChunkSection section : chunk.getSections()) {
|
||||
final DataPalette blockPalette = section.palette(PaletteType.BLOCKS);
|
||||
for (int i = 0; i < blockPalette.size(); i++) {
|
||||
final int id = blockPalette.idByIndex(i);
|
||||
blockPalette.setIdByIndex(i, protocol.getMappingData().getNewBlockStateId(id));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// The server does nothing but track the sequence, so we can just set it as 0
|
||||
protocol.registerServerbound(ServerboundPackets1_17.PLAYER_DIGGING, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Action
|
||||
map(Type.POSITION1_14); // Block position
|
||||
map(Type.UNSIGNED_BYTE); // Direction
|
||||
create(Type.VAR_INT, 0); // Sequence
|
||||
}
|
||||
});
|
||||
protocol.registerServerbound(ServerboundPackets1_17.PLAYER_BLOCK_PLACEMENT, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Hand
|
||||
map(Type.POSITION1_14); // Block position
|
||||
map(Type.VAR_INT); // Direction
|
||||
map(Type.FLOAT); // X
|
||||
map(Type.FLOAT); // Y
|
||||
map(Type.FLOAT); // Z
|
||||
map(Type.BOOLEAN); // Inside
|
||||
create(Type.VAR_INT, 0); // Sequence
|
||||
}
|
||||
});
|
||||
protocol.registerServerbound(ServerboundPackets1_17.USE_ITEM, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Hand
|
||||
create(Type.VAR_INT, 0); // Sequence
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerServerbound(ServerboundPackets1_17.SET_BEACON_EFFECT, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final int primaryEffect = wrapper.read(Type.VAR_INT);
|
||||
if (primaryEffect != -1) {
|
||||
wrapper.write(Type.BOOLEAN, true);
|
||||
wrapper.write(Type.VAR_INT, primaryEffect);
|
||||
} else {
|
||||
wrapper.write(Type.BOOLEAN, false);
|
||||
}
|
||||
|
||||
final int secondaryEffect = wrapper.read(Type.VAR_INT);
|
||||
if (secondaryEffect != -1) {
|
||||
wrapper.write(Type.BOOLEAN, true);
|
||||
wrapper.write(Type.VAR_INT, secondaryEffect);
|
||||
} else {
|
||||
wrapper.write(Type.BOOLEAN, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+336
@@ -0,0 +1,336 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.packets;
|
||||
|
||||
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2To1_19;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage.DimensionRegistryStorage;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage.StoredPainting;
|
||||
import com.viaversion.viaversion.api.data.ParticleMappings;
|
||||
import com.viaversion.viaversion.api.data.entity.StoredEntityData;
|
||||
import com.viaversion.viaversion.api.minecraft.Position;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.metadata.MetaType;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.api.type.types.Particle;
|
||||
import com.viaversion.viaversion.api.type.types.version.Types1_18;
|
||||
import com.viaversion.viaversion.api.type.types.version.Types1_19;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
|
||||
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
|
||||
|
||||
public final class EntityPackets1_19 extends EntityRewriter<Protocol1_18_2To1_19> {
|
||||
|
||||
public EntityPackets1_19(final Protocol1_18_2To1_19 protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
registerTracker(ClientboundPackets1_19.SPAWN_EXPERIENCE_ORB, Entity1_19Types.EXPERIENCE_ORB);
|
||||
registerTracker(ClientboundPackets1_19.SPAWN_PLAYER, Entity1_19Types.PLAYER);
|
||||
registerMetadataRewriter(ClientboundPackets1_19.ENTITY_METADATA, Types1_19.METADATA_LIST, Types1_18.METADATA_LIST);
|
||||
registerRemoveEntities(ClientboundPackets1_19.REMOVE_ENTITIES);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.SPAWN_ENTITY, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Entity id
|
||||
map(Type.UUID); // Entity UUID
|
||||
map(Type.VAR_INT); // Entity Type
|
||||
map(Type.DOUBLE); // X
|
||||
map(Type.DOUBLE); // Y
|
||||
map(Type.DOUBLE); // Z
|
||||
map(Type.BYTE); // Pitch
|
||||
map(Type.BYTE); // Yaw
|
||||
handler(wrapper -> {
|
||||
final byte headYaw = wrapper.read(Type.BYTE);
|
||||
int data = wrapper.read(Type.VAR_INT);
|
||||
final EntityType entityType = setOldEntityId(wrapper);
|
||||
if (entityType.isOrHasParent(Entity1_19Types.LIVINGENTITY)) {
|
||||
wrapper.write(Type.BYTE, headYaw);
|
||||
|
||||
// Switch pitch and yaw position
|
||||
final byte pitch = wrapper.get(Type.BYTE, 0);
|
||||
final byte yaw = wrapper.get(Type.BYTE, 1);
|
||||
wrapper.set(Type.BYTE, 0, yaw);
|
||||
wrapper.set(Type.BYTE, 1, pitch);
|
||||
|
||||
wrapper.setPacketType(ClientboundPackets1_18.SPAWN_MOB);
|
||||
return;
|
||||
} else if (entityType == Entity1_19Types.PAINTING) {
|
||||
wrapper.cancel();
|
||||
// The entity has been tracked, now we wait for the metadata packet
|
||||
final int entityId = wrapper.get(Type.VAR_INT, 0);
|
||||
final StoredEntityData entityData = tracker(wrapper.user()).entityData(entityId);
|
||||
final Position position = new Position(wrapper.get(Type.DOUBLE, 0).intValue(), wrapper.get(Type.DOUBLE, 1).intValue(), wrapper.get(Type.DOUBLE, 2).intValue());
|
||||
entityData.put(new StoredPainting(entityId, wrapper.get(Type.UUID, 0), position, data));
|
||||
return;
|
||||
}
|
||||
|
||||
if (entityType == Entity1_19Types.FALLING_BLOCK) {
|
||||
data = protocol.getMappingData().getNewBlockStateId(data);
|
||||
}
|
||||
wrapper.write(Type.INT, data);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.ENTITY_EFFECT, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT); // Entity id
|
||||
map(Type.VAR_INT); // Effect id
|
||||
map(Type.BYTE); // Amplifier
|
||||
map(Type.VAR_INT); // Duration
|
||||
map(Type.BYTE); // Flags
|
||||
handler(wrapper -> {
|
||||
// Remove factor data
|
||||
if (wrapper.read(Type.BOOLEAN)) {
|
||||
wrapper.read(Type.NBT);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.JOIN_GAME, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.INT); // Entity ID
|
||||
map(Type.BOOLEAN); // Hardcore
|
||||
map(Type.UNSIGNED_BYTE); // Gamemode
|
||||
map(Type.BYTE); // Previous Gamemode
|
||||
map(Type.STRING_ARRAY); // Worlds
|
||||
map(Type.NBT); // Dimension registry
|
||||
handler(wrapper -> {
|
||||
final DimensionRegistryStorage dimensionRegistryStorage = wrapper.user().get(DimensionRegistryStorage.class);
|
||||
dimensionRegistryStorage.clear();
|
||||
|
||||
// Cache dimensions and find current dimension
|
||||
final String dimensionKey = wrapper.read(Type.STRING);
|
||||
final CompoundTag registry = wrapper.get(Type.NBT, 0);
|
||||
final ListTag dimensions = ((CompoundTag) registry.get("minecraft:dimension_type")).get("value");
|
||||
boolean found = false;
|
||||
for (final Tag dimension : dimensions) {
|
||||
final CompoundTag dimensionCompound = (CompoundTag) dimension;
|
||||
final StringTag nameTag = dimensionCompound.get("name");
|
||||
final CompoundTag dimensionData = dimensionCompound.get("element");
|
||||
dimensionRegistryStorage.addDimension(nameTag.getValue(), dimensionData.clone());
|
||||
|
||||
if (!found && nameTag.getValue().equals(dimensionKey)) {
|
||||
wrapper.write(Type.NBT, dimensionData);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
throw new IllegalStateException("Could not find dimension " + dimensionKey + " in dimension registry");
|
||||
}
|
||||
|
||||
// Add biome category and track biomes
|
||||
final CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome");
|
||||
final ListTag biomes = biomeRegistry.get("value");
|
||||
for (final Tag biome : biomes.getValue()) {
|
||||
final CompoundTag biomeCompound = ((CompoundTag) biome).get("element");
|
||||
biomeCompound.put("category", new StringTag("none"));
|
||||
}
|
||||
tracker(wrapper.user()).setBiomesSent(biomes.size());
|
||||
|
||||
// Cache and remove chat types
|
||||
final ListTag chatTypes = ((CompoundTag) registry.remove("minecraft:chat_type")).get("value");
|
||||
for (final Tag chatType : chatTypes) {
|
||||
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
|
||||
final NumberTag idTag = chatTypeCompound.get("id");
|
||||
dimensionRegistryStorage.addChatType(idTag.asInt(), chatTypeCompound);
|
||||
}
|
||||
});
|
||||
map(Type.STRING); // World
|
||||
map(Type.LONG); // Seed
|
||||
map(Type.VAR_INT); // Max players
|
||||
map(Type.VAR_INT); // Chunk radius
|
||||
map(Type.VAR_INT); // Simulation distance
|
||||
map(Type.BOOLEAN); // Reduced debug info
|
||||
map(Type.BOOLEAN); // Show death screen
|
||||
map(Type.BOOLEAN); // Debug
|
||||
map(Type.BOOLEAN); // Flat
|
||||
read(Type.OPTIONAL_GLOBAL_POSITION); // Read last death location
|
||||
handler(worldDataTrackerHandler(1));
|
||||
handler(playerTrackerHandler());
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.RESPAWN, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final String dimensionKey = wrapper.read(Type.STRING);
|
||||
final CompoundTag dimension = wrapper.user().get(DimensionRegistryStorage.class).dimension(dimensionKey);
|
||||
if (dimension == null) {
|
||||
throw new IllegalArgumentException("Could not find dimension " + dimensionKey + " in dimension registry");
|
||||
}
|
||||
|
||||
wrapper.write(Type.NBT, dimension);
|
||||
});
|
||||
map(Type.STRING); // World
|
||||
map(Type.LONG); // Seed
|
||||
map(Type.UNSIGNED_BYTE); // Gamemode
|
||||
map(Type.BYTE); // Previous gamemode
|
||||
map(Type.BOOLEAN); // Debug
|
||||
map(Type.BOOLEAN); // Flat
|
||||
map(Type.BOOLEAN); // Keep player data
|
||||
read(Type.OPTIONAL_GLOBAL_POSITION); // Read last death location
|
||||
handler(worldDataTrackerHandler(0));
|
||||
}
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.PLAYER_INFO, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final int action = wrapper.passthrough(Type.VAR_INT);
|
||||
final int entries = wrapper.passthrough(Type.VAR_INT);
|
||||
for (int i = 0; i < entries; i++) {
|
||||
wrapper.passthrough(Type.UUID); // UUID
|
||||
if (action == 0) { // Add player
|
||||
wrapper.passthrough(Type.STRING); // Player Name
|
||||
|
||||
final int properties = wrapper.passthrough(Type.VAR_INT);
|
||||
for (int j = 0; j < properties; j++) {
|
||||
wrapper.passthrough(Type.STRING); // Name
|
||||
wrapper.passthrough(Type.STRING); // Value
|
||||
if (wrapper.passthrough(Type.BOOLEAN)) {
|
||||
wrapper.passthrough(Type.STRING); // Signature
|
||||
}
|
||||
}
|
||||
|
||||
wrapper.passthrough(Type.VAR_INT); // Gamemode
|
||||
wrapper.passthrough(Type.VAR_INT); // Ping
|
||||
if (wrapper.passthrough(Type.BOOLEAN)) {
|
||||
wrapper.passthrough(Type.COMPONENT); // Display name
|
||||
}
|
||||
|
||||
// Remove public profile signature
|
||||
wrapper.read(Type.OPTIONAL_PROFILE_KEY);
|
||||
} else if (action == 1 || action == 2) { // Update gamemode/update latency
|
||||
wrapper.passthrough(Type.VAR_INT);
|
||||
} else if (action == 3) { // Update display name
|
||||
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);
|
||||
}
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage;
|
||||
|
||||
import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2To1_19;
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public final class DimensionRegistryStorage implements StorableObject {
|
||||
|
||||
private final Map<String, CompoundTag> dimensions = new HashMap<>();
|
||||
private final Int2ObjectMap<CompoundTag> chatTypes = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
public @Nullable CompoundTag dimension(final String dimensionKey) {
|
||||
final CompoundTag compoundTag = dimensions.get(dimensionKey);
|
||||
return compoundTag != null ? compoundTag.clone() : null;
|
||||
}
|
||||
|
||||
public void addDimension(final String dimensionKey, final CompoundTag dimension) {
|
||||
dimensions.put(dimensionKey, dimension);
|
||||
}
|
||||
|
||||
public @Nullable CompoundTag chatType(final int id) {
|
||||
return chatTypes.isEmpty() ? Protocol1_18_2To1_19.MAPPINGS.chatType(id) : chatTypes.get(id);
|
||||
}
|
||||
|
||||
public void addChatType(final int id, final CompoundTag chatType) {
|
||||
chatTypes.put(id, chatType);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
dimensions.clear();
|
||||
chatTypes.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean clearOnServerSwitch() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+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";
|
||||
}
|
||||
|
||||
+433
@@ -0,0 +1,433 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.viaversion.viabackwards.ViaBackwards;
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.packets.EntityPackets1_19_1;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.ChatRegistryStorage;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.NonceStorage;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage.ReceivedMessagesStorage;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.PlayerMessageSignature;
|
||||
import com.viaversion.viaversion.api.minecraft.ProfileKey;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.packet.State;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper;
|
||||
import com.viaversion.viaversion.api.rewriter.EntityRewriter;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
|
||||
import com.viaversion.viaversion.libs.gson.JsonElement;
|
||||
import com.viaversion.viaversion.libs.kyori.adventure.text.Component;
|
||||
import com.viaversion.viaversion.libs.kyori.adventure.text.TranslatableComponent;
|
||||
import com.viaversion.viaversion.libs.kyori.adventure.text.format.NamedTextColor;
|
||||
import com.viaversion.viaversion.libs.kyori.adventure.text.format.Style;
|
||||
import com.viaversion.viaversion.libs.kyori.adventure.text.format.TextDecoration;
|
||||
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ByteTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
|
||||
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
|
||||
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ClientboundPackets1_19_1;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ServerboundPackets1_19_1;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ServerboundPackets1_19;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.packets.EntityPackets;
|
||||
import com.viaversion.viaversion.util.CipherUtil;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public final class Protocol1_19To1_19_1 extends BackwardsProtocol<ClientboundPackets1_19_1, ClientboundPackets1_19, ServerboundPackets1_19_1, ServerboundPackets1_19> {
|
||||
|
||||
public static final int SYSTEM_CHAT_ID = 1;
|
||||
public static final int GAME_INFO_ID = 2;
|
||||
private static final UUID ZERO_UUID = new UUID(0, 0);
|
||||
private static final byte[] EMPTY_BYTES = new byte[0];
|
||||
private final EntityPackets1_19_1 entityRewriter = new EntityPackets1_19_1(this);
|
||||
private final TranslatableRewriter translatableRewriter = new TranslatableRewriter(this);
|
||||
|
||||
public Protocol1_19To1_19_1() {
|
||||
super(ClientboundPackets1_19_1.class, ClientboundPackets1_19.class, ServerboundPackets1_19_1.class, ServerboundPackets1_19.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_1.ACTIONBAR);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_1.TITLE_TEXT);
|
||||
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_1.TITLE_SUBTITLE);
|
||||
translatableRewriter.registerBossBar(ClientboundPackets1_19_1.BOSSBAR);
|
||||
translatableRewriter.registerDisconnect(ClientboundPackets1_19_1.DISCONNECT);
|
||||
translatableRewriter.registerTabList(ClientboundPackets1_19_1.TAB_LIST);
|
||||
translatableRewriter.registerOpenWindow(ClientboundPackets1_19_1.OPEN_WINDOW);
|
||||
translatableRewriter.registerCombatKill(ClientboundPackets1_19_1.COMBAT_KILL);
|
||||
translatableRewriter.registerPing();
|
||||
|
||||
entityRewriter.register();
|
||||
|
||||
registerClientbound(ClientboundPackets1_19_1.JOIN_GAME, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.INT); // Entity ID
|
||||
map(Type.BOOLEAN); // Hardcore
|
||||
map(Type.UNSIGNED_BYTE); // Gamemode
|
||||
map(Type.BYTE); // Previous Gamemode
|
||||
map(Type.STRING_ARRAY); // World List
|
||||
map(Type.NBT); // Dimension registry
|
||||
map(Type.STRING); // Dimension key
|
||||
map(Type.STRING); // World
|
||||
handler(wrapper -> {
|
||||
final ChatRegistryStorage chatTypeStorage = wrapper.user().get(ChatRegistryStorage.class);
|
||||
chatTypeStorage.clear();
|
||||
|
||||
final CompoundTag registry = wrapper.get(Type.NBT, 0);
|
||||
final ListTag chatTypes = ((CompoundTag) registry.get("minecraft:chat_type")).get("value");
|
||||
for (final Tag chatType : chatTypes) {
|
||||
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
|
||||
final NumberTag idTag = chatTypeCompound.get("id");
|
||||
chatTypeStorage.addChatType(idTag.asInt(), chatTypeCompound);
|
||||
}
|
||||
|
||||
// Replace with 1.19 chat types
|
||||
// Ensures that the client has a chat type for system message, with and without overlay
|
||||
registry.put("minecraft:chat_type", EntityPackets.CHAT_REGISTRY.clone());
|
||||
});
|
||||
handler(entityRewriter.worldTrackerHandlerByKey());
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(ClientboundPackets1_19_1.PLAYER_CHAT, ClientboundPackets1_19.SYSTEM_CHAT, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
if (wrapper.read(Type.BOOLEAN)) {
|
||||
// Previous signature
|
||||
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE);
|
||||
}
|
||||
|
||||
final PlayerMessageSignature signature = wrapper.read(Type.PLAYER_MESSAGE_SIGNATURE);
|
||||
|
||||
// Store message signature for last seen
|
||||
if (!signature.uuid().equals(ZERO_UUID) && signature.signatureBytes().length != 0) {
|
||||
final ReceivedMessagesStorage messagesStorage = wrapper.user().get(ReceivedMessagesStorage.class);
|
||||
messagesStorage.add(signature);
|
||||
if (messagesStorage.tickUnacknowledged() > 64) {
|
||||
messagesStorage.resetUnacknowledgedCount();
|
||||
|
||||
// Send chat acknowledgement
|
||||
final PacketWrapper chatAckPacket = wrapper.create(ServerboundPackets1_19_1.CHAT_ACK);
|
||||
chatAckPacket.write(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY, messagesStorage.lastSignatures());
|
||||
chatAckPacket.write(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE, null);
|
||||
chatAckPacket.sendToServer(Protocol1_19To1_19_1.class);
|
||||
}
|
||||
}
|
||||
|
||||
// Send the unsigned message if present, otherwise the signed message
|
||||
final String plainMessage = wrapper.read(Type.STRING); // Plain message
|
||||
JsonElement message = null;
|
||||
JsonElement decoratedMessage = wrapper.read(Type.OPTIONAL_COMPONENT);
|
||||
if (decoratedMessage != null) {
|
||||
message = decoratedMessage;
|
||||
}
|
||||
|
||||
wrapper.read(Type.LONG); // Timestamp
|
||||
wrapper.read(Type.LONG); // Salt
|
||||
wrapper.read(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY); // Last seen
|
||||
|
||||
final JsonElement unsignedMessage = wrapper.read(Type.OPTIONAL_COMPONENT);
|
||||
if (unsignedMessage != null) {
|
||||
message = unsignedMessage;
|
||||
}
|
||||
if (message == null) {
|
||||
// If no decorated or unsigned message is given, use the plain one
|
||||
message = GsonComponentSerializer.gson().serializeToTree(Component.text(plainMessage));
|
||||
}
|
||||
|
||||
final int filterMaskType = wrapper.read(Type.VAR_INT);
|
||||
if (filterMaskType == 2) { // Partially filtered
|
||||
wrapper.read(Type.LONG_ARRAY_PRIMITIVE); // Mask
|
||||
}
|
||||
|
||||
final int chatTypeId = wrapper.read(Type.VAR_INT);
|
||||
final JsonElement senderName = wrapper.read(Type.COMPONENT);
|
||||
final JsonElement targetName = wrapper.read(Type.OPTIONAL_COMPONENT);
|
||||
decoratedMessage = decorateChatMessage(wrapper, chatTypeId, senderName, targetName, message);
|
||||
if (decoratedMessage == null) {
|
||||
wrapper.cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
translatableRewriter.processText(decoratedMessage);
|
||||
wrapper.write(Type.COMPONENT, decoratedMessage);
|
||||
wrapper.write(Type.VAR_INT, SYSTEM_CHAT_ID);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(ClientboundPackets1_19_1.SYSTEM_CHAT, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
final JsonElement content = wrapper.passthrough(Type.COMPONENT);
|
||||
translatableRewriter.processText(content);
|
||||
|
||||
final boolean overlay = wrapper.read(Type.BOOLEAN);
|
||||
wrapper.write(Type.VAR_INT, overlay ? GAME_INFO_ID : SYSTEM_CHAT_ID);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(ServerboundPackets1_19.CHAT_MESSAGE, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Message
|
||||
map(Type.LONG); // Timestamp
|
||||
map(Type.LONG); // Salt
|
||||
// Set empty signature
|
||||
read(Type.BYTE_ARRAY_PRIMITIVE);
|
||||
create(Type.BYTE_ARRAY_PRIMITIVE, EMPTY_BYTES);
|
||||
map(Type.BOOLEAN); // Signed preview
|
||||
handler(wrapper -> {
|
||||
final ReceivedMessagesStorage messagesStorage = wrapper.user().get(ReceivedMessagesStorage.class);
|
||||
messagesStorage.resetUnacknowledgedCount();
|
||||
wrapper.write(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY, messagesStorage.lastSignatures());
|
||||
wrapper.write(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE, null); // No last unacknowledged
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(ServerboundPackets1_19.CHAT_COMMAND, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Command
|
||||
map(Type.LONG); // Timestamp
|
||||
map(Type.LONG); // Salt
|
||||
handler(wrapper -> {
|
||||
final int signatures = wrapper.passthrough(Type.VAR_INT);
|
||||
for (int i = 0; i < signatures; i++) {
|
||||
wrapper.passthrough(Type.STRING); // Argument name
|
||||
|
||||
// Set empty signature
|
||||
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE);
|
||||
wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, EMPTY_BYTES);
|
||||
}
|
||||
|
||||
wrapper.passthrough(Type.BOOLEAN); // Signed preview
|
||||
|
||||
final ReceivedMessagesStorage messagesStorage = wrapper.user().get(ReceivedMessagesStorage.class);
|
||||
messagesStorage.resetUnacknowledgedCount();
|
||||
wrapper.write(Type.PLAYER_MESSAGE_SIGNATURE_ARRAY, messagesStorage.lastSignatures());
|
||||
wrapper.write(Type.OPTIONAL_PLAYER_MESSAGE_SIGNATURE, null); // No last unacknowledged
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(ClientboundPackets1_19_1.SERVER_DATA, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.OPTIONAL_COMPONENT); // Motd
|
||||
map(Type.OPTIONAL_STRING); // Encoded icon
|
||||
map(Type.BOOLEAN); // Previews chat
|
||||
read(Type.BOOLEAN); // Enforces secure chat
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(State.LOGIN, ServerboundLoginPackets.HELLO.getId(), ServerboundLoginPackets.HELLO.getId(), new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Name
|
||||
handler(wrapper -> {
|
||||
final ProfileKey profileKey = wrapper.read(Type.OPTIONAL_PROFILE_KEY);
|
||||
if (profileKey == null) {
|
||||
wrapper.user().put(new NonceStorage(null));
|
||||
}
|
||||
});
|
||||
// Write empty profile key and uuid (since keys are not compatible) - requires the enforce-secure-profiles option to be disabled on the server
|
||||
create(Type.OPTIONAL_PROFILE_KEY, null);
|
||||
create(Type.OPTIONAL_UUID, null);
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(State.LOGIN, ClientboundLoginPackets.HELLO.getId(), ClientboundLoginPackets.HELLO.getId(), new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.STRING); // Server id
|
||||
handler(wrapper -> {
|
||||
if (wrapper.user().get(NonceStorage.class) != null) {
|
||||
// Is already using the encrypted nonce
|
||||
return;
|
||||
}
|
||||
|
||||
final byte[] publicKey = wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
|
||||
final byte[] nonce = wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
|
||||
wrapper.user().put(new NonceStorage(CipherUtil.encryptNonce(publicKey, nonce)));
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(State.LOGIN, ServerboundLoginPackets.ENCRYPTION_KEY.getId(), ServerboundLoginPackets.ENCRYPTION_KEY.getId(), new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.BYTE_ARRAY_PRIMITIVE); // Key
|
||||
handler(wrapper -> {
|
||||
final NonceStorage nonceStorage = wrapper.user().remove(NonceStorage.class);
|
||||
final boolean isNonce = wrapper.read(Type.BOOLEAN);
|
||||
wrapper.write(Type.BOOLEAN, true);
|
||||
if (isNonce) {
|
||||
// Nonce, just pass it through
|
||||
wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nonceStorage == null || nonceStorage.nonce() == null) {
|
||||
throw new IllegalArgumentException("Server sent nonce is missing");
|
||||
}
|
||||
|
||||
wrapper.read(Type.LONG); // Salt
|
||||
wrapper.read(Type.BYTE_ARRAY_PRIMITIVE); // Signature
|
||||
wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, nonceStorage.nonce());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(State.LOGIN, ClientboundLoginPackets.CUSTOM_QUERY.getId(), ClientboundLoginPackets.CUSTOM_QUERY.getId(), new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
map(Type.VAR_INT);
|
||||
map(Type.STRING);
|
||||
handler(wrapper -> {
|
||||
final String identifier = wrapper.get(Type.STRING, 0);
|
||||
if (identifier.equals("velocity:player_info")) {
|
||||
byte[] data = wrapper.passthrough(Type.REMAINING_BYTES);
|
||||
// Velocity modern forwarding version above 1 includes the players public key.
|
||||
// This is an issue because the player does not have a public key.
|
||||
// Velocity itself does adjust the version accordingly: https://github.com/PaperMC/Velocity/blob/1a3fba4250553702d9dcd05731d04347bfc24c9f/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java#L176-L197
|
||||
// However this becomes an issue when an 1.19.0 client tries to join a 1.19.1 server.
|
||||
// (The protocol translation will go 1.19.1 -> 1.18.2 -> 1.19.0)
|
||||
// The player does have a public key, but an outdated one.
|
||||
// Velocity modern forwarding versions: https://github.com/PaperMC/Velocity/blob/1a3fba4250553702d9dcd05731d04347bfc24c9f/proxy/src/main/java/com/velocitypowered/proxy/connection/VelocityConstants.java#L27-L29
|
||||
// And the version can be specified with a single byte: https://github.com/PaperMC/Velocity/blob/1a3fba4250553702d9dcd05731d04347bfc24c9f/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java#L88
|
||||
if (data.length == 1 && data[0] > 1) {
|
||||
data[0] = 1;
|
||||
} else if (data.length == 0) { // Or the version is omitted (default version would be used)
|
||||
data = new byte[]{1};
|
||||
wrapper.set(Type.REMAINING_BYTES, 0, data);
|
||||
} else {
|
||||
ViaBackwards.getPlatform().getLogger().warning("Received unexpected data in velocity:player_info (length=" + data.length + ")");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
cancelClientbound(ClientboundPackets1_19_1.CUSTOM_CHAT_COMPLETIONS); // Can't do anything with them unless we add clutter clients with fake player profiles
|
||||
cancelClientbound(ClientboundPackets1_19_1.DELETE_CHAT_MESSAGE); // Can't do without the old "send 50 empty lines and then resend previous messages" trick
|
||||
cancelClientbound(ClientboundPackets1_19_1.PLAYER_CHAT_HEADER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final UserConnection user) {
|
||||
user.put(new ChatRegistryStorage());
|
||||
user.put(new ReceivedMessagesStorage());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, Entity1_19Types.PLAYER, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public TranslatableRewriter getTranslatableRewriter() {
|
||||
return translatableRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityRewriter getEntityRewriter() {
|
||||
return entityRewriter;
|
||||
}
|
||||
|
||||
private @Nullable JsonElement decorateChatMessage(final PacketWrapper wrapper, final int chatTypeId, final JsonElement senderName, @Nullable final JsonElement targetName, final JsonElement message) {
|
||||
CompoundTag chatType = wrapper.user().get(ChatRegistryStorage.class).chatType(chatTypeId);
|
||||
if (chatType == null) {
|
||||
ViaBackwards.getPlatform().getLogger().warning("Chat message has unknown chat type id " + chatTypeId + ". Message: " + message);
|
||||
return null;
|
||||
}
|
||||
|
||||
chatType = chatType.<CompoundTag>get("element").get("chat");
|
||||
if (chatType == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final String translationKey = (String) chatType.get("translation_key").getValue();
|
||||
final TranslatableComponent.Builder componentBuilder = Component.translatable().key(translationKey);
|
||||
|
||||
// Add the style
|
||||
final CompoundTag style = chatType.get("style");
|
||||
if (style != null) {
|
||||
final Style.Builder styleBuilder = Style.style();
|
||||
final StringTag color = style.get("color");
|
||||
if (color != null) {
|
||||
final NamedTextColor textColor = NamedTextColor.NAMES.value(color.getValue());
|
||||
if (textColor != null) {
|
||||
styleBuilder.color(NamedTextColor.NAMES.value(color.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
for (final String key : TextDecoration.NAMES.keys()) {
|
||||
if (style.contains(key)) {
|
||||
styleBuilder.decoration(TextDecoration.NAMES.value(key), style.<ByteTag>get(key).asByte() == 1);
|
||||
}
|
||||
}
|
||||
componentBuilder.style(styleBuilder.build());
|
||||
}
|
||||
|
||||
// Add the replacements
|
||||
final ListTag parameters = chatType.get("parameters");
|
||||
if (parameters != null) {
|
||||
final List<Component> arguments = new ArrayList<>();
|
||||
for (final Tag element : parameters) {
|
||||
JsonElement argument = null;
|
||||
switch ((String) element.getValue()) {
|
||||
case "sender":
|
||||
argument = senderName;
|
||||
break;
|
||||
case "content":
|
||||
argument = message;
|
||||
break;
|
||||
case "target":
|
||||
Preconditions.checkNotNull(targetName, "Target name is null");
|
||||
argument = targetName;
|
||||
break;
|
||||
default:
|
||||
ViaBackwards.getPlatform().getLogger().warning("Unknown parameter for chat decoration: " + element.getValue());
|
||||
}
|
||||
if (argument != null) {
|
||||
arguments.add(GsonComponentSerializer.gson().deserializeFromTree(argument));
|
||||
}
|
||||
}
|
||||
componentBuilder.args(arguments);
|
||||
}
|
||||
|
||||
return GsonComponentSerializer.gson().serializeToTree(componentBuilder.build());
|
||||
}
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.packets;
|
||||
|
||||
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.Protocol1_19To1_19_1;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.Entity1_19Types;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.type.types.version.Types1_19;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19_1to1_19.ClientboundPackets1_19_1;
|
||||
|
||||
public final class EntityPackets1_19_1 extends EntityRewriter<Protocol1_19To1_19_1> {
|
||||
|
||||
public EntityPackets1_19_1(final Protocol1_19To1_19_1 protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
registerMetadataRewriter(ClientboundPackets1_19_1.ENTITY_METADATA, Types1_19.METADATA_LIST);
|
||||
registerRemoveEntities(ClientboundPackets1_19_1.REMOVE_ENTITIES);
|
||||
registerSpawnTracker(ClientboundPackets1_19_1.SPAWN_ENTITY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerRewrites() {
|
||||
filter().type(Entity1_19Types.ALLAY).cancel(16); // Dancing
|
||||
filter().type(Entity1_19Types.ALLAY).cancel(17); // Can duplicate
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType typeFromId(final int typeId) {
|
||||
return Entity1_19Types.getTypeFromId(typeId);
|
||||
}
|
||||
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public final class ChatRegistryStorage implements StorableObject {
|
||||
|
||||
private final Int2ObjectMap<CompoundTag> chatTypes = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
public @Nullable CompoundTag chatType(final int id) {
|
||||
return chatTypes.isEmpty() ? Protocol1_19To1_18_2.MAPPINGS.chatType(id) : chatTypes.get(id);
|
||||
}
|
||||
|
||||
public void addChatType(final int id, final CompoundTag chatType) {
|
||||
chatTypes.put(id, chatType);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
chatTypes.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean clearOnServerSwitch() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public final class NonceStorage implements StorableObject {
|
||||
|
||||
private final byte[] nonce;
|
||||
|
||||
public NonceStorage(final byte @Nullable[] nonce) {
|
||||
this.nonce = nonce;
|
||||
}
|
||||
|
||||
public byte @Nullable [] nonce() {
|
||||
return nonce;
|
||||
}
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2022 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.minecraft.PlayerMessageSignature;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public final class ReceivedMessagesStorage implements StorableObject {
|
||||
private final PlayerMessageSignature[] signatures = new PlayerMessageSignature[5];
|
||||
private int size;
|
||||
private int unacknowledged;
|
||||
|
||||
public void add(final PlayerMessageSignature signature) {
|
||||
PlayerMessageSignature toPush = signature;
|
||||
for (int i = 0; i < this.size; ++i) {
|
||||
final PlayerMessageSignature entry = this.signatures[i];
|
||||
this.signatures[i] = toPush;
|
||||
toPush = entry;
|
||||
if (entry.uuid().equals(signature.uuid())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.size < this.signatures.length) {
|
||||
this.signatures[this.size++] = toPush;
|
||||
}
|
||||
}
|
||||
|
||||
public PlayerMessageSignature[] lastSignatures() {
|
||||
return Arrays.copyOf(this.signatures, size);
|
||||
}
|
||||
|
||||
public int tickUnacknowledged() {
|
||||
return unacknowledged++;
|
||||
}
|
||||
|
||||
public void resetUnacknowledgedCount() {
|
||||
unacknowledged = 0;
|
||||
}
|
||||
}
|
||||
@@ -19,4 +19,14 @@ fix-formatted-inventory-titles: true
|
||||
#
|
||||
# Sends inventory acknowledgement packets to act as a replacement for ping packets for sub 1.17 clients.
|
||||
# This only takes effect for ids in the short range. Useful for anticheat compatibility.
|
||||
handle-pings-as-inv-acknowledgements: false
|
||||
handle-pings-as-inv-acknowledgements: false
|
||||
#
|
||||
# 1.19.1 chat type formats.
|
||||
chat-types-1_19_1:
|
||||
"chat.type.text": "<%s> %s"
|
||||
"chat.type.announcement": "[%s] %s"
|
||||
"commands.message.display.incoming": "%s whispers to you: %s"
|
||||
"commands.message.display.outgoing": "You whisper to %s: %s"
|
||||
"chat.type.team.text": "%s <%s> %s"
|
||||
"chat.type.team.sent": "-> %s <%s> %s"
|
||||
"chat.type.emote": "* %s %s"
|
||||
@@ -22,5 +22,7 @@
|
||||
"minecraft:windswept_gravelly_hills": "gravelly_mountains",
|
||||
"minecraft:old_growth_birch_forest": "tall_birch_forest",
|
||||
"minecraft:old_growth_spruce_taiga": "giant_spruce_taiga",
|
||||
"minecraft:windswept_savanna": "shattered_savanna"
|
||||
"minecraft:windswept_savanna": "shattered_savanna",
|
||||
"minecraft:mangrove_swamp": "swamp",
|
||||
"minecraft:deep_dark": "mountains"
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,741 @@
|
||||
{
|
||||
"blockstates": {
|
||||
"minecraft:sculk": "minecraft:black_concrete_powder",
|
||||
"minecraft:sculk_vein": "minecraft:glow_lichen[",
|
||||
"minecraft:sculk_catalyst": "minecraft:end_stone",
|
||||
"minecraft:sculk_shrieker[can_summon=true,shrieking=true,waterlogged=true]": "minecraft:end_portal_frame[eye=true,facing=north]",
|
||||
"minecraft:sculk_shrieker[can_summon=true,shrieking=true,waterlogged=false]": "minecraft:end_portal_frame[eye=true,facing=north]",
|
||||
"minecraft:sculk_shrieker[can_summon=true,shrieking=false,waterlogged=true]": "minecraft:end_portal_frame[eye=false,facing=north]",
|
||||
"minecraft:sculk_shrieker[can_summon=true,shrieking=false,waterlogged=false]": "minecraft:end_portal_frame[eye=false,facing=north]",
|
||||
"minecraft:sculk_shrieker[can_summon=false,shrieking=true,waterlogged=true]": "minecraft:end_portal_frame[eye=true,facing=north]",
|
||||
"minecraft:sculk_shrieker[can_summon=false,shrieking=true,waterlogged=false]": "minecraft:end_portal_frame[eye=true,facing=north]",
|
||||
"minecraft:sculk_shrieker[can_summon=false,shrieking=false,waterlogged=true]": "minecraft:end_portal_frame[eye=false,facing=north]",
|
||||
"minecraft:sculk_shrieker[can_summon=false,shrieking=false,waterlogged=false]": "minecraft:end_portal_frame[eye=false,facing=north]",
|
||||
"minecraft:reinforced_deepslate": "minecraft:obsidian",
|
||||
"minecraft:mangrove_planks": "minecraft:acacia_planks",
|
||||
"minecraft:stripped_mangrove_log": "minecraft:stripped_acacia_log[",
|
||||
"minecraft:stripped_mangrove_wood": "minecraft:stripped_acacia_wood[",
|
||||
"minecraft:mangrove_wood": "minecraft:acacia_wood[",
|
||||
"minecraft:mangrove_log": "minecraft:acacia_log[",
|
||||
"minecraft:mangrove_sign": "minecraft:acacia_sign[",
|
||||
"minecraft:mangrove_wall_sign": "minecraft:acacia_wall_sign[",
|
||||
"minecraft:mangrove_pressure_plate": "minecraft:acacia_pressure_plate[",
|
||||
"minecraft:mangrove_trapdoor": "minecraft:acacia_trapdoor[",
|
||||
"minecraft:mangrove_button": "minecraft:acacia_button[",
|
||||
"minecraft:mangrove_stairs": "minecraft:acacia_stairs[",
|
||||
"minecraft:mangrove_slab": "minecraft:acacia_slab[",
|
||||
"minecraft:mangrove_fence_gate": "minecraft:acacia_fence_gate[",
|
||||
"minecraft:mangrove_fence": "minecraft:acacia_fence[",
|
||||
"minecraft:mangrove_door": "minecraft:acacia_door[",
|
||||
"minecraft:mud_bricks": "minecraft:bricks",
|
||||
"minecraft:packed_mud": "minecraft:bricks",
|
||||
"minecraft:mud_brick_stairs": "minecraft:brick_stairs[",
|
||||
"minecraft:mud_brick_slab": "minecraft:brick_slab[",
|
||||
"minecraft:mud_brick_wall": "minecraft:brick_wall[",
|
||||
"minecraft:muddy_mangrove_roots": "minecraft:coarse_dirt",
|
||||
"minecraft:mud": "minecraft:coarse_dirt",
|
||||
"minecraft:mangrove_propagule": "minecraft:fern",
|
||||
"minecraft:mangrove_roots": "minecraft:oak_wood[axis=y]",
|
||||
"minecraft:ochre_froglight": "minecraft:sea_lantern",
|
||||
"minecraft:verdant_froglight": "minecraft:sea_lantern",
|
||||
"minecraft:pearlescent_froglight": "minecraft:sea_lantern",
|
||||
"minecraft:potted_mangrove_propagule": "minecraft:potted_acacia_sapling",
|
||||
"minecraft:frogspawn": "minecraft:air",
|
||||
"minecraft:oak_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=1,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=1,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=1,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=1,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=2,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=2,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=2,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=2,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=3,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=3,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=3,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=3,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=4,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=4,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=4,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=4,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=5,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=5,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=5,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=5,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=6,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=6,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=6,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=6,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:oak_leaves[distance=7,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:oak_leaves[distance=7,persistent=true]",
|
||||
"minecraft:oak_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:oak_leaves[distance=7,persistent=false]",
|
||||
"minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:oak_leaves[distance=7,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=1,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=1,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=1,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=1,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=2,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=2,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=2,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=2,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=3,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=3,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=3,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=3,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=4,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=4,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=4,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=4,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=5,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=5,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=5,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=5,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=6,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=6,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=6,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=6,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:spruce_leaves[distance=7,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:spruce_leaves[distance=7,persistent=true]",
|
||||
"minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:spruce_leaves[distance=7,persistent=false]",
|
||||
"minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:spruce_leaves[distance=7,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=1,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=1,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=1,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=1,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=2,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=2,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=2,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=2,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=3,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=3,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=3,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=3,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=4,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=4,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=4,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=4,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=5,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=5,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=5,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=5,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=6,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=6,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=6,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=6,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:birch_leaves[distance=7,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:birch_leaves[distance=7,persistent=true]",
|
||||
"minecraft:birch_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:birch_leaves[distance=7,persistent=false]",
|
||||
"minecraft:birch_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:birch_leaves[distance=7,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=1,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=1,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=1,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=1,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=2,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=2,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=2,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=2,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=3,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=3,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=3,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=3,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=4,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=4,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=4,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=4,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=5,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=5,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=5,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=5,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=6,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=6,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=6,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=6,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:jungle_leaves[distance=7,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:jungle_leaves[distance=7,persistent=true]",
|
||||
"minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:jungle_leaves[distance=7,persistent=false]",
|
||||
"minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:jungle_leaves[distance=7,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=true]",
|
||||
"minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=false]",
|
||||
"minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=1,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=1,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=1,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=1,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=2,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=2,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=2,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=2,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=3,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=3,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=3,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=3,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=4,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=4,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=4,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=4,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=5,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=5,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=5,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=5,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=6,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=6,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=6,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=6,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:dark_oak_leaves[distance=7,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:dark_oak_leaves[distance=7,persistent=true]",
|
||||
"minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:dark_oak_leaves[distance=7,persistent=false]",
|
||||
"minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:dark_oak_leaves[distance=7,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=1,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=1,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=2,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=2,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=3,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=3,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=4,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=4,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=5,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=5,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=6,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=6,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=true]",
|
||||
"minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:acacia_leaves[distance=7,persistent=false]",
|
||||
"minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:acacia_leaves[distance=7,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=1,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=1,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=1,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=1,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=2,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=2,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=2,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=2,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=3,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=3,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=3,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=3,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=4,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=4,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=4,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=4,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=5,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=5,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=5,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=5,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=6,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=6,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=6,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=6,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:azalea_leaves[distance=7,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:azalea_leaves[distance=7,persistent=true]",
|
||||
"minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:azalea_leaves[distance=7,persistent=false]",
|
||||
"minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:azalea_leaves[distance=7,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=1,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=1,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=1,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=1,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=2,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=2,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=2,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=2,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=3,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=3,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=3,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=3,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=4,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=4,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=4,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=4,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=5,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=5,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=5,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=5,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=6,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=6,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=6,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=6,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=7,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=7,persistent=true]",
|
||||
"minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=true]": "minecraft:flowering_azalea_leaves[distance=7,persistent=false]",
|
||||
"minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=false]": "minecraft:flowering_azalea_leaves[distance=7,persistent=false]",
|
||||
"minecraft:chest[type=single,facing=north,waterlogged=true]": "minecraft:chest[facing=north,type=single,waterlogged=true]",
|
||||
"minecraft:chest[type=single,facing=north,waterlogged=false]": "minecraft:chest[facing=north,type=single,waterlogged=false]",
|
||||
"minecraft:chest[type=left,facing=north,waterlogged=true]": "minecraft:chest[facing=north,type=left,waterlogged=true]",
|
||||
"minecraft:chest[type=left,facing=north,waterlogged=false]": "minecraft:chest[facing=north,type=left,waterlogged=false]",
|
||||
"minecraft:chest[type=right,facing=north,waterlogged=true]": "minecraft:chest[facing=north,type=right,waterlogged=true]",
|
||||
"minecraft:chest[type=right,facing=north,waterlogged=false]": "minecraft:chest[facing=north,type=right,waterlogged=false]",
|
||||
"minecraft:chest[type=single,facing=south,waterlogged=true]": "minecraft:chest[facing=south,type=single,waterlogged=true]",
|
||||
"minecraft:chest[type=single,facing=south,waterlogged=false]": "minecraft:chest[facing=south,type=single,waterlogged=false]",
|
||||
"minecraft:chest[type=left,facing=south,waterlogged=true]": "minecraft:chest[facing=south,type=left,waterlogged=true]",
|
||||
"minecraft:chest[type=left,facing=south,waterlogged=false]": "minecraft:chest[facing=south,type=left,waterlogged=false]",
|
||||
"minecraft:chest[type=right,facing=south,waterlogged=true]": "minecraft:chest[facing=south,type=right,waterlogged=true]",
|
||||
"minecraft:chest[type=right,facing=south,waterlogged=false]": "minecraft:chest[facing=south,type=right,waterlogged=false]",
|
||||
"minecraft:chest[type=single,facing=west,waterlogged=true]": "minecraft:chest[facing=west,type=single,waterlogged=true]",
|
||||
"minecraft:chest[type=single,facing=west,waterlogged=false]": "minecraft:chest[facing=west,type=single,waterlogged=false]",
|
||||
"minecraft:chest[type=left,facing=west,waterlogged=true]": "minecraft:chest[facing=west,type=left,waterlogged=true]",
|
||||
"minecraft:chest[type=left,facing=west,waterlogged=false]": "minecraft:chest[facing=west,type=left,waterlogged=false]",
|
||||
"minecraft:chest[type=right,facing=west,waterlogged=true]": "minecraft:chest[facing=west,type=right,waterlogged=true]",
|
||||
"minecraft:chest[type=right,facing=west,waterlogged=false]": "minecraft:chest[facing=west,type=right,waterlogged=false]",
|
||||
"minecraft:chest[type=single,facing=east,waterlogged=true]": "minecraft:chest[facing=east,type=single,waterlogged=true]",
|
||||
"minecraft:chest[type=single,facing=east,waterlogged=false]": "minecraft:chest[facing=east,type=single,waterlogged=false]",
|
||||
"minecraft:chest[type=left,facing=east,waterlogged=true]": "minecraft:chest[facing=east,type=left,waterlogged=true]",
|
||||
"minecraft:chest[type=left,facing=east,waterlogged=false]": "minecraft:chest[facing=east,type=left,waterlogged=false]",
|
||||
"minecraft:chest[type=right,facing=east,waterlogged=true]": "minecraft:chest[facing=east,type=right,waterlogged=true]",
|
||||
"minecraft:chest[type=right,facing=east,waterlogged=false]": "minecraft:chest[facing=east,type=right,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=single,facing=north,waterlogged=true]": "minecraft:trapped_chest[facing=north,type=single,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=single,facing=north,waterlogged=false]": "minecraft:trapped_chest[facing=north,type=single,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=left,facing=north,waterlogged=true]": "minecraft:trapped_chest[facing=north,type=left,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=left,facing=north,waterlogged=false]": "minecraft:trapped_chest[facing=north,type=left,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=right,facing=north,waterlogged=true]": "minecraft:trapped_chest[facing=north,type=right,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=right,facing=north,waterlogged=false]": "minecraft:trapped_chest[facing=north,type=right,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=single,facing=south,waterlogged=true]": "minecraft:trapped_chest[facing=south,type=single,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=single,facing=south,waterlogged=false]": "minecraft:trapped_chest[facing=south,type=single,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=left,facing=south,waterlogged=true]": "minecraft:trapped_chest[facing=south,type=left,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=left,facing=south,waterlogged=false]": "minecraft:trapped_chest[facing=south,type=left,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=right,facing=south,waterlogged=true]": "minecraft:trapped_chest[facing=south,type=right,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=right,facing=south,waterlogged=false]": "minecraft:trapped_chest[facing=south,type=right,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=single,facing=west,waterlogged=true]": "minecraft:trapped_chest[facing=west,type=single,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=single,facing=west,waterlogged=false]": "minecraft:trapped_chest[facing=west,type=single,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=left,facing=west,waterlogged=true]": "minecraft:trapped_chest[facing=west,type=left,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=left,facing=west,waterlogged=false]": "minecraft:trapped_chest[facing=west,type=left,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=right,facing=west,waterlogged=true]": "minecraft:trapped_chest[facing=west,type=right,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=right,facing=west,waterlogged=false]": "minecraft:trapped_chest[facing=west,type=right,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=single,facing=east,waterlogged=true]": "minecraft:trapped_chest[facing=east,type=single,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=single,facing=east,waterlogged=false]": "minecraft:trapped_chest[facing=east,type=single,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=left,facing=east,waterlogged=true]": "minecraft:trapped_chest[facing=east,type=left,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=left,facing=east,waterlogged=false]": "minecraft:trapped_chest[facing=east,type=left,waterlogged=false]",
|
||||
"minecraft:trapped_chest[type=right,facing=east,waterlogged=true]": "minecraft:trapped_chest[facing=east,type=right,waterlogged=true]",
|
||||
"minecraft:trapped_chest[type=right,facing=east,waterlogged=false]": "minecraft:trapped_chest[facing=east,type=right,waterlogged=false]",
|
||||
"minecraft:moving_piston[type=normal,facing=north]": "minecraft:moving_piston[facing=north,type=normal]",
|
||||
"minecraft:moving_piston[type=sticky,facing=north]": "minecraft:moving_piston[facing=north,type=sticky]",
|
||||
"minecraft:moving_piston[type=normal,facing=east]": "minecraft:moving_piston[facing=east,type=normal]",
|
||||
"minecraft:moving_piston[type=sticky,facing=east]": "minecraft:moving_piston[facing=east,type=sticky]",
|
||||
"minecraft:moving_piston[type=normal,facing=south]": "minecraft:moving_piston[facing=south,type=normal]",
|
||||
"minecraft:moving_piston[type=sticky,facing=south]": "minecraft:moving_piston[facing=south,type=sticky]",
|
||||
"minecraft:moving_piston[type=normal,facing=west]": "minecraft:moving_piston[facing=west,type=normal]",
|
||||
"minecraft:moving_piston[type=sticky,facing=west]": "minecraft:moving_piston[facing=west,type=sticky]",
|
||||
"minecraft:moving_piston[type=normal,facing=up]": "minecraft:moving_piston[facing=up,type=normal]",
|
||||
"minecraft:moving_piston[type=sticky,facing=up]": "minecraft:moving_piston[facing=up,type=sticky]",
|
||||
"minecraft:moving_piston[type=normal,facing=down]": "minecraft:moving_piston[facing=down,type=normal]",
|
||||
"minecraft:moving_piston[type=sticky,facing=down]": "minecraft:moving_piston[facing=down,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=north,short=true]": "minecraft:piston_head[facing=north,short=true,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=north,short=true]": "minecraft:piston_head[facing=north,short=true,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=north,short=false]": "minecraft:piston_head[facing=north,short=false,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=north,short=false]": "minecraft:piston_head[facing=north,short=false,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=east,short=true]": "minecraft:piston_head[facing=east,short=true,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=east,short=true]": "minecraft:piston_head[facing=east,short=true,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=east,short=false]": "minecraft:piston_head[facing=east,short=false,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=east,short=false]": "minecraft:piston_head[facing=east,short=false,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=south,short=true]": "minecraft:piston_head[facing=south,short=true,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=south,short=true]": "minecraft:piston_head[facing=south,short=true,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=south,short=false]": "minecraft:piston_head[facing=south,short=false,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=south,short=false]": "minecraft:piston_head[facing=south,short=false,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=west,short=true]": "minecraft:piston_head[facing=west,short=true,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=west,short=true]": "minecraft:piston_head[facing=west,short=true,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=west,short=false]": "minecraft:piston_head[facing=west,short=false,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=west,short=false]": "minecraft:piston_head[facing=west,short=false,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=up,short=true]": "minecraft:piston_head[facing=up,short=true,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=up,short=true]": "minecraft:piston_head[facing=up,short=true,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=up,short=false]": "minecraft:piston_head[facing=up,short=false,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=up,short=false]": "minecraft:piston_head[facing=up,short=false,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=down,short=true]": "minecraft:piston_head[facing=down,short=true,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=down,short=true]": "minecraft:piston_head[facing=down,short=true,type=sticky]",
|
||||
"minecraft:piston_head[type=normal,facing=down,short=false]": "minecraft:piston_head[facing=down,short=false,type=normal]",
|
||||
"minecraft:piston_head[type=sticky,facing=down,short=false]": "minecraft:piston_head[facing=down,short=false,type=sticky]"
|
||||
},
|
||||
"sounds": {
|
||||
"music.overworld.deep_dark": "music.end",
|
||||
"block.sculk_vein.break": "block.sculk_sensor.break",
|
||||
"block.sculk_vein.fall": "block.sculk_sensor.fall",
|
||||
"block.sculk_vein.hit": "block.sculk_sensor.hit",
|
||||
"block.sculk_vein.place": "block.sculk_sensor.place",
|
||||
"block.sculk_vein.step": "block.sculk_sensor.step",
|
||||
"block.sculk_catalyst.bloom": "particle.soul_escape",
|
||||
"block.sculk_catalyst.break": "block.sculk_sensor.break",
|
||||
"block.sculk_catalyst.fall": "block.sculk_sensor.fall",
|
||||
"block.sculk_catalyst.hit": "block.sculk_sensor.hit",
|
||||
"block.sculk_catalyst.place": "block.sculk_sensor.place",
|
||||
"block.sculk_catalyst.step": "block.sculk_sensor.step",
|
||||
"block.sculk.spread": "item.ink_sac.use",
|
||||
"block.sculk.charge": "block.bubble_column.bubble_pop",
|
||||
"block.sculk.break": "block.sculk_sensor.break",
|
||||
"block.sculk.fall": "block.sculk_sensor.fall",
|
||||
"block.sculk.hit": "block.sculk_sensor.hit",
|
||||
"block.sculk.place": "block.sculk_sensor.place",
|
||||
"block.sculk.step": "block.sculk_sensor.step",
|
||||
"block.sculk_shrieker.break": "block.sculk_sensor.break",
|
||||
"block.sculk_shrieker.fall": "block.sculk_sensor.fall",
|
||||
"block.sculk_shrieker.hit": "block.sculk_sensor.hit",
|
||||
"block.sculk_shrieker.place": "block.sculk_sensor.place",
|
||||
"block.sculk_shrieker.step": "block.sculk_sensor.step",
|
||||
"block.sculk_shrieker.shriek": "entity.player.breath",
|
||||
"entity.warden.ambient": "entity.ravager.ambient",
|
||||
"entity.warden.listening": "entity.ravager.stunned",
|
||||
"entity.warden.listening_angry": "entity.ravager.celebrate",
|
||||
"entity.warden.angry": "entity.ravager.ambient",
|
||||
"entity.warden.hurt": "entity.ravager.hurt",
|
||||
"entity.warden.death": "entity.ravager.death",
|
||||
"entity.warden.step": "entity.ravager.step",
|
||||
"entity.warden.tendril_clicks": "block.sculk_sensor.clicking",
|
||||
"entity.warden.heartbeat": "block.note_block.basedrum",
|
||||
"entity.warden.agitated": "entity.ravager.roar",
|
||||
"entity.warden.attack_impact": "entity.ravager.attack",
|
||||
"entity.warden.roar": "entity.ravager.roar",
|
||||
"entity.warden.sniff": "entity.piglin.admiring_item",
|
||||
"entity.warden.emerge": "item.trident.thunder",
|
||||
"entity.warden.dig": "block.beacon.deactivate",
|
||||
"entity.warden.nearby_closest": "block.sculk_sensor.clicking",
|
||||
"entity.warden.nearby_closer": "block.sculk_sensor.clicking",
|
||||
"entity.warden.nearby_close": "block.sculk_sensor.clicking",
|
||||
"item.bucket.empty_tadpole": "item.bucket.empty_fish",
|
||||
"item.bucket.fill_tadpole": "item.bucket.fill_fish",
|
||||
"block.froglight.break": "block.slime_block.break",
|
||||
"block.froglight.fall": "block.slime_block.fall",
|
||||
"block.froglight.hit": "block.slime_block.hit",
|
||||
"block.froglight.place": "block.slime_block.place",
|
||||
"block.froglight.step": "block.slime_block.step",
|
||||
"block.frogspawn.step": "block.slime_block.step",
|
||||
"block.frogspawn.break": "block.slime_block.break",
|
||||
"block.frogspawn.fall": "block.slime_block.fall",
|
||||
"block.frogspawn.hatch": "entity.turtle.egg_hatch",
|
||||
"block.frogspawn.hit": "block.slime_block.hit",
|
||||
"block.frogspawn.place": "block.slime_block.place",
|
||||
"entity.frog.ambient": "entity.villager.ambient",
|
||||
"entity.frog.death": "entity.villager.death",
|
||||
"entity.frog.eat": "entity.player.burp",
|
||||
"entity.frog.hurt": "entity.villager.hurt",
|
||||
"entity.frog.lay_spawn": "entity.turtle.lay_egg",
|
||||
"entity.frog.long_jump": "entity.salmon.flop",
|
||||
"entity.frog.step": "entity.salmon.flop",
|
||||
"entity.frog.tongue": "entity.salmon.flop",
|
||||
"block.mangrove_roots.break": "block.vine.break",
|
||||
"block.mangrove_roots.fall": "block.vine.fall",
|
||||
"block.mangrove_roots.hit": "block.vine.hit",
|
||||
"block.mangrove_roots.place": "block.vine.place",
|
||||
"block.mangrove_roots.step": "block.vine.step",
|
||||
"block.mud.break": "block.wet_grass.break",
|
||||
"block.mud.fall": "block.wet_grass.fall",
|
||||
"block.mud.hit": "block.wet_grass.hit",
|
||||
"block.mud.place": "block.wet_grass.place",
|
||||
"block.mud.step": "block.wet_grass.step",
|
||||
"block.mud_bricks.break": "block.stone.break",
|
||||
"block.mud_bricks.fall": "block.stone.fall",
|
||||
"block.mud_bricks.hit": "block.stone.hit",
|
||||
"block.mud_bricks.place": "block.stone.place",
|
||||
"block.mud_bricks.step": "block.stone.step",
|
||||
"block.muddy_mangrove_roots.break": "block.wet_grass.break",
|
||||
"block.muddy_mangrove_roots.fall": "block.wet_grass.fall",
|
||||
"block.muddy_mangrove_roots.hit": "block.wet_grass.hit",
|
||||
"block.muddy_mangrove_roots.place": "block.wet_grass.place",
|
||||
"block.muddy_mangrove_roots.step": "block.wet_grass.step",
|
||||
"block.packed_mud.break": "block.stone.break",
|
||||
"block.packed_mud.fall": "block.stone.fall",
|
||||
"block.packed_mud.hit": "block.stone.hit",
|
||||
"block.packed_mud.place": "block.stone.place",
|
||||
"block.packed_mud.step": "block.stone.step",
|
||||
"entity.tadpole.death": "entity.salmon.death",
|
||||
"entity.tadpole.eat": "entity.salmon.flop",
|
||||
"entity.tadpole.flop": "entity.salmon.flop",
|
||||
"entity.tadpole.grow_up": "entity.villager.ambient",
|
||||
"entity.tadpole.hurt": "entity.salmon.hurt",
|
||||
"entity.tadpole.step": "entity.salmon.flop",
|
||||
"entity.allay.ambient_with_item": "block.amethyst_block.chime",
|
||||
"entity.allay.ambient_without_item": "block.amethyst_block.chime",
|
||||
"entity.allay.death": "entity.vex.death",
|
||||
"entity.allay.flap": "block.amethyst_block.chime",
|
||||
"entity.allay.hurt": "entity.vex.hurt",
|
||||
"entity.allay.item_given": "entity.item.pickup",
|
||||
"entity.allay.item_taken": "entity.item.pickup",
|
||||
"entity.parrot.imitate.warden": "entity.parrot.imitate.ravager",
|
||||
"entity.warden.sonic_boom": "entity.generic.explode",
|
||||
"entity.warden.sonic_charge": "entity.tnt.primed",
|
||||
"entity.allay.item_thrown": "entity.item.pickup",
|
||||
"music_disc.5": "music_disc.11",
|
||||
"music.overworld.swamp": "music.game",
|
||||
"music.overworld.jungle_and_forest": "music.game",
|
||||
"music.overworld.old_growth_taiga": "music.game",
|
||||
"entity.goat.horn_break": "entity.zombie.break_wooden_door",
|
||||
"item.goat_horn.play": "block.note_block.banjo",
|
||||
"entity.goat.screaming.horn_break": "entity.zombie.break_wooden_door",
|
||||
"item.goat_horn.sound.0": "block.note_block.bass",
|
||||
"item.goat_horn.sound.1": "block.note_block.snare",
|
||||
"item.goat_horn.sound.2": "block.note_block.xylophone",
|
||||
"item.goat_horn.sound.3": "block.note_block.bit",
|
||||
"item.goat_horn.sound.4": "block.note_block.harp",
|
||||
"item.goat_horn.sound.5": "block.note_block.pling",
|
||||
"item.goat_horn.sound.6": "block.note_block.didgeridoo",
|
||||
"item.goat_horn.sound.7": "block.note_block.guitar"
|
||||
},
|
||||
"items": {
|
||||
"minecraft:warden_spawn_egg": {
|
||||
"id": "minecraft:glow_squid_spawn_egg",
|
||||
"name": "1.19 Warden Spawn Egg"
|
||||
},
|
||||
"minecraft:sculk_vein": {
|
||||
"id": "minecraft:glow_lichen",
|
||||
"name": "1.19 Sculk Vein"
|
||||
},
|
||||
"minecraft:sculk_catalyst": {
|
||||
"id": "minecraft:end_stone",
|
||||
"name": "1.19 Sculk Catalyst"
|
||||
},
|
||||
"minecraft:sculk": {
|
||||
"id": "minecraft:black_concrete_powder",
|
||||
"name": "1.19 Sculk"
|
||||
},
|
||||
"minecraft:sculk_shrieker": {
|
||||
"id": "minecraft:end_portal_frame",
|
||||
"name": "1.19 Sculk Shrieker"
|
||||
},
|
||||
"minecraft:mud": {
|
||||
"id": "minecraft:coarse_dirt",
|
||||
"name": "1.19 Mud"
|
||||
},
|
||||
"minecraft:mangrove_planks": {
|
||||
"id": "minecraft:acacia_planks",
|
||||
"name": "1.19 Mangrove Planks"
|
||||
},
|
||||
"minecraft:mangrove_propagule": {
|
||||
"id": "minecraft:fern",
|
||||
"name": "1.19 Mangrove Propagule"
|
||||
},
|
||||
"minecraft:mangrove_log": {
|
||||
"id": "minecraft:acacia_log",
|
||||
"name": "1.19 Mangrove Log"
|
||||
},
|
||||
"minecraft:mangrove_roots": {
|
||||
"id": "minecraft:oak_wood",
|
||||
"name": "1.19 Mangrove Roots"
|
||||
},
|
||||
"minecraft:muddy_mangrove_roots": {
|
||||
"id": "minecraft:coarse_dirt",
|
||||
"name": "1.19 Muddy Mangrove Roots"
|
||||
},
|
||||
"minecraft:stripped_mangrove_log": {
|
||||
"id": "minecraft:stripped_acacia_log",
|
||||
"name": "1.19 Stripped Mangrove Log"
|
||||
},
|
||||
"minecraft:stripped_mangrove_wood": {
|
||||
"id": "minecraft:stripped_acacia_wood",
|
||||
"name": "1.19 Stripped Mangrove Wood"
|
||||
},
|
||||
"minecraft:mangrove_wood": {
|
||||
"id": "minecraft:acacia_wood",
|
||||
"name": "1.19 Mangrove Wood"
|
||||
},
|
||||
"minecraft:mangrove_leaves": {
|
||||
"id": "minecraft:acacia_leaves",
|
||||
"name": "1.19 Mangrove Leaves"
|
||||
},
|
||||
"minecraft:mangrove_slab": {
|
||||
"id": "minecraft:acacia_slab",
|
||||
"name": "1.19 Mangrove Slab"
|
||||
},
|
||||
"minecraft:mud_brick_slab": {
|
||||
"id": "minecraft:brick_slab",
|
||||
"name": "1.19 Mud Brick Slab"
|
||||
},
|
||||
"minecraft:mangrove_fence": {
|
||||
"id": "minecraft:acacia_fence",
|
||||
"name": "1.19 Mangrove Fence"
|
||||
},
|
||||
"minecraft:packed_mud": {
|
||||
"id": "minecraft:bricks",
|
||||
"name": "1.19 Packed Mud"
|
||||
},
|
||||
"minecraft:mud_bricks": {
|
||||
"id": "minecraft:bricks",
|
||||
"name": "1.19 Mud Bricks"
|
||||
},
|
||||
"minecraft:mud_brick_stairs": {
|
||||
"id": "minecraft:brick_stairs",
|
||||
"name": "1.19 Mud Brick Stairs"
|
||||
},
|
||||
"minecraft:mud_brick_wall": {
|
||||
"id": "minecraft:brick_wall",
|
||||
"name": "1.19 Mud Brick Wall"
|
||||
},
|
||||
"minecraft:mangrove_stairs": {
|
||||
"id": "minecraft:acacia_stairs",
|
||||
"name": "1.19 Mangrove Stairs"
|
||||
},
|
||||
"minecraft:mangrove_button": {
|
||||
"id": "minecraft:acacia_button",
|
||||
"name": "1.19 Mangrove Button"
|
||||
},
|
||||
"minecraft:mangrove_pressure_plate": {
|
||||
"id": "minecraft:acacia_pressure_plate",
|
||||
"name": "1.19 Mangrove Pressure Plate"
|
||||
},
|
||||
"minecraft:mangrove_door": {
|
||||
"id": "minecraft:acacia_door",
|
||||
"name": "1.19 Mangrove Door"
|
||||
},
|
||||
"minecraft:mangrove_trapdoor": {
|
||||
"id": "minecraft:acacia_trapdoor",
|
||||
"name": "1.19 Mangrove Trapdoor"
|
||||
},
|
||||
"minecraft:mangrove_fence_gate": {
|
||||
"id": "minecraft:acacia_fence_gate",
|
||||
"name": "1.19 Mangrove Fence Gate"
|
||||
},
|
||||
"minecraft:mangrove_boat": {
|
||||
"id": "minecraft:acacia_boat",
|
||||
"name": "1.19 Mangrove Boat"
|
||||
},
|
||||
"minecraft:mangrove_sign": {
|
||||
"id": "minecraft:acacia_sign",
|
||||
"name": "1.19 Mangrove Sign"
|
||||
},
|
||||
"minecraft:tadpole_bucket": {
|
||||
"id": "minecraft:pufferfish_bucket",
|
||||
"name": "1.19 Tadpole Bucket"
|
||||
},
|
||||
"minecraft:frog_spawn_egg": {
|
||||
"id": "minecraft:tropical_fish_spawn_egg",
|
||||
"name": "1.19 Frog Spawn Egg"
|
||||
},
|
||||
"minecraft:tadpole_spawn_egg": {
|
||||
"id": "minecraft:donkey_spawn_egg",
|
||||
"name": "1.19 Tadpole Spawn Egg"
|
||||
},
|
||||
"minecraft:ochre_froglight": {
|
||||
"id": "minecraft:sea_lantern",
|
||||
"name": "1.19 Ochre Froglight"
|
||||
},
|
||||
"minecraft:verdant_froglight": {
|
||||
"id": "minecraft:sea_lantern",
|
||||
"name": "1.19 Verdant Froglight"
|
||||
},
|
||||
"minecraft:pearlescent_froglight": {
|
||||
"id": "minecraft:sea_lantern",
|
||||
"name": "1.19 Pearlescent Froglight"
|
||||
},
|
||||
"minecraft:frogspawn": {
|
||||
"id": "minecraft:glow_lichen",
|
||||
"name": "1.19 Frogspawn"
|
||||
},
|
||||
"minecraft:acacia_chest_boat": {
|
||||
"id": "minecraft:acacia_boat",
|
||||
"name": "1.19 Acacia Chest Boat"
|
||||
},
|
||||
"minecraft:dark_oak_chest_boat": {
|
||||
"id": "minecraft:dark_oak_boat",
|
||||
"name": "1.19 Dark Oak Chest Boat"
|
||||
},
|
||||
"minecraft:mangrove_chest_boat": {
|
||||
"id": "minecraft:acacia_boat",
|
||||
"name": "1.19 Mangrove Chest Boat"
|
||||
},
|
||||
"minecraft:jungle_chest_boat": {
|
||||
"id": "minecraft:jungle_boat",
|
||||
"name": "1.19 Jungle Chest Boat"
|
||||
},
|
||||
"minecraft:spruce_chest_boat": {
|
||||
"id": "minecraft:spruce_boat",
|
||||
"name": "1.19 Spruce Chest Boat"
|
||||
},
|
||||
"minecraft:oak_chest_boat": {
|
||||
"id": "minecraft:oak_boat",
|
||||
"name": "1.19 Oak Chest Boat"
|
||||
},
|
||||
"minecraft:birch_chest_boat": {
|
||||
"id": "minecraft:birch_boat",
|
||||
"name": "1.19 Birch Chest Boat"
|
||||
},
|
||||
"minecraft:allay_spawn_egg": {
|
||||
"id": "minecraft:zombie_spawn_egg",
|
||||
"name": "1.19 Allay Spawn Egg"
|
||||
},
|
||||
"minecraft:reinforced_deepslate": {
|
||||
"id": "minecraft:obsidian",
|
||||
"name": "1.19 Reinforced Deepslate"
|
||||
},
|
||||
"minecraft:echo_shard": {
|
||||
"id": "minecraft:prismarine_shard",
|
||||
"name": "1.19 Echo Shard"
|
||||
},
|
||||
"minecraft:recovery_compass": {
|
||||
"id": "minecraft:compass",
|
||||
"name": "1.19 Recovery Compass"
|
||||
},
|
||||
"minecraft:music_disc_5": {
|
||||
"id": "minecraft:music_disc_13",
|
||||
"name": "1.19 Music Disc 5"
|
||||
},
|
||||
"minecraft:disc_fragment_5": {
|
||||
"id": "minecraft:music_disc_13",
|
||||
"name": "1.19 Disc Fragment"
|
||||
},
|
||||
"minecraft:goat_horn": {
|
||||
"id": "minecraft:dead_horn_coral",
|
||||
"name": "1.19 Goat Horn"
|
||||
}
|
||||
},
|
||||
"particles": {
|
||||
"sculk_soul": "soul",
|
||||
"sculk_charge": "",
|
||||
"sculk_charge_pop": "bubble_pop",
|
||||
"shriek": "",
|
||||
"allay_dust": "wax_off",
|
||||
"sonic_boom": "enchanted_hit"
|
||||
},
|
||||
"blockentities": {
|
||||
"sculk_catalyst": "",
|
||||
"sculk_shrieker": ""
|
||||
},
|
||||
"enchantments": {
|
||||
"minecraft:swift_sneak": "minecraft:soul_speed"
|
||||
},
|
||||
"paintings": {
|
||||
"minecraft:earth": "minecraft:void",
|
||||
"minecraft:fire": "minecraft:void",
|
||||
"minecraft:water": "minecraft:void",
|
||||
"minecraft:wind": "minecraft:void"
|
||||
},
|
||||
"argumenttypes": {
|
||||
"minecraft:template_mirror": "brigadier:string",
|
||||
"minecraft:template_rotation": "brigadier:string"
|
||||
},
|
||||
"entitynames": {
|
||||
"warden": "Warden",
|
||||
"frog": "Frog",
|
||||
"tadpole": "Tadpole",
|
||||
"allay": "Allay"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,306 @@
|
||||
{
|
||||
"1.19.1": {
|
||||
"gui.acknowledge": "Acknowledge",
|
||||
"gui.socialInteractions.report": "Report",
|
||||
"gui.socialInteractions.tooltip.report": "Report player",
|
||||
"gui.socialInteractions.tooltip.report.disabled": "The reporting service is unavailable",
|
||||
"gui.socialInteractions.tooltip.report.no_messages": "No reportable messages from player %s",
|
||||
"gui.socialInteractions.tooltip.report.not_reportable": "This player can't be reported, because their chat messages can't be verified on this server",
|
||||
"gui.socialInteractions.narration.hide": "Hide messages from %s",
|
||||
"gui.socialInteractions.narration.show": "Show messages from %s",
|
||||
"gui.socialInteractions.narration.report": "Report player %s",
|
||||
"gui.chatReport.title": "Report Player",
|
||||
"gui.chatReport.send": "Send Report",
|
||||
"gui.chatReport.send.comments_too_long": "Please shorten the comment",
|
||||
"gui.chatReport.send.no_reason": "Please select a report category",
|
||||
"gui.chatReport.send.no_reported_messages": "Please select at least one chat message to report",
|
||||
"gui.chatReport.send.too_many_messages": "Trying to include too many messages in the report",
|
||||
"gui.chatReport.observed_what": "Why are you reporting this?",
|
||||
"gui.chatReport.select_reason": "Select Report Category",
|
||||
"gui.chatReport.more_comments": "Please describe what happened:",
|
||||
"gui.chatReport.describe": "Sharing details will help us make a well-informed decision.",
|
||||
"gui.chatReport.comments": "Comments edit box",
|
||||
"gui.chatReport.read_info": "Learn About Reporting",
|
||||
"gui.chatReport.select_chat": "Select Chat Messages to Report",
|
||||
"gui.chatReport.selected_chat": "%s Chat Message(s) Selected to Report",
|
||||
"gui.chatReport.report_sent_msg": "We�ve successfully received your report. Thank you!\n\nOur team will review it as soon as possible.",
|
||||
"gui.chatReport.discard.title": "Discard report and comments?",
|
||||
"gui.chatReport.discard.content": "If you leave, you'll lose this report and your comments.\nAre you sure you want to leave?",
|
||||
"gui.chatReport.discard.discard": "Leave and Discard Report",
|
||||
"gui.chatReport.discard.return": "Continue Editing",
|
||||
"gui.abuseReport.reason.title": "Select Report Category",
|
||||
"gui.abuseReport.reason.description": "Description:",
|
||||
"gui.abuseReport.reason.narration": "%s: %s",
|
||||
"gui.abuseReport.reason.false_reporting": "False Reporting",
|
||||
"gui.abuseReport.reason.child_sexual_exploitation_or_abuse": "Child sexual exploitation or abuse",
|
||||
"gui.abuseReport.reason.child_sexual_exploitation_or_abuse.description": "Someone is talking about or otherwise promoting indecent behavior involving children.",
|
||||
"gui.abuseReport.reason.terrorism_or_violent_extremism": "Terrorism or violent extremism",
|
||||
"gui.abuseReport.reason.terrorism_or_violent_extremism.description": "Someone is talking about, promoting, or threatening to commit acts of terrorism or violent extremism for political, religious, ideological, or other reasons.",
|
||||
"gui.abuseReport.reason.hate_speech": "Hate speech",
|
||||
"gui.abuseReport.reason.hate_speech.description": "Someone is attacking you or another player based on characteristics of their identity, like religion, race, or sexuality.",
|
||||
"gui.abuseReport.reason.harassment_or_bullying": "Harassment or bullying",
|
||||
"gui.abuseReport.reason.harassment_or_bullying.description": "Someone is shaming, attacking, or bullying you or someone else. This includes when someone is repeatedly trying to contact you or someone else without consent or posting private personal information about you or someone else without consent (\"doxing\").",
|
||||
"gui.abuseReport.reason.imminent_harm": "Imminent harm - Threat to harm others",
|
||||
"gui.abuseReport.reason.imminent_harm.description": "Someone is threatening to harm you or someone else in real life.",
|
||||
"gui.abuseReport.reason.defamation_impersonation_false_information": "Defamation, impersonation, or false information",
|
||||
"gui.abuseReport.reason.defamation_impersonation_false_information.description": "Someone is damaging someone else's reputation, pretending to be someone they're not, or sharing false information with the aim to exploit or mislead others.",
|
||||
"gui.abuseReport.reason.self_harm_or_suicide": "Imminent harm - Self-harm or suicide",
|
||||
"gui.abuseReport.reason.self_harm_or_suicide.description": "Someone is threatening to harm themselves in real life or talking about harming themselves in real life.",
|
||||
"gui.abuseReport.reason.alcohol_tobacco_drugs": "Drugs or alcohol",
|
||||
"gui.abuseReport.reason.alcohol_tobacco_drugs.description": "Someone is encouraging others to partake in illegal drug related activities or encouraging underage drinking.",
|
||||
"gui.abuseReport.reason.non_consensual_intimate_imagery": "Non-consensual intimate imagery",
|
||||
"gui.abuseReport.reason.non_consensual_intimate_imagery.description": "Someone is talking about, sharing, or otherwise promoting private and intimate images.",
|
||||
"gui.abuseReport.sending.title": "Sending your report...",
|
||||
"gui.abuseReport.sent.title": "Report sent",
|
||||
"gui.abuseReport.error.title": "Problem sending your report",
|
||||
"gui.abuseReport.send.generic_error": "Encountered an unexpected error while sending your report.",
|
||||
"gui.abuseReport.send.error_message": "An error was returned while sending your report:\n'%s'",
|
||||
"gui.abuseReport.send.service_unavailable": "Unable to reach the Abuse Reporting service. Please make sure you are connected to the internet and try again.",
|
||||
"gui.abuseReport.send.http_error": "An unexpected HTTP error occurred while sending your report.",
|
||||
"gui.abuseReport.send.json_error": "Encountered malformed payload while sending your report.",
|
||||
"gui.chatSelection.title": "Select Chat Messages to Report",
|
||||
"gui.chatSelection.context": "Messages surrounding this selection will be included to provide additional context",
|
||||
"gui.chatSelection.selected": "%s/%s message(s) selected",
|
||||
"gui.chatSelection.heading": "%s %s",
|
||||
"gui.chatSelection.message.narrate": "%s said: %s at %s",
|
||||
"gui.chatSelection.fold": "%s unrelated messages hidden",
|
||||
"gui.multiLineEditBox.character_limit": "%s/%s",
|
||||
"gui.banned.title.temporary": "Account temporarily suspended",
|
||||
"gui.banned.title.permanent": "Account permanently banned",
|
||||
"gui.banned.description": "%s\n\n%s\n\nLearn more at the following link: %s",
|
||||
"gui.banned.description.reason": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified it as %s, which goes against the Minecraft Community Standards.",
|
||||
"gui.banned.description.reason_id": "Code: %s",
|
||||
"gui.banned.description.reason_id_message": "Code: %s - %s",
|
||||
"gui.banned.description.unknownreason": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified that it goes against the Minecraft Community Standards.",
|
||||
"gui.banned.description.temporary.duration": "Your account is temporarily suspended and will be reactivated in %s.",
|
||||
"gui.banned.description.temporary": "%s Until then, you can�t play online or join Realms.",
|
||||
"gui.banned.description.permanent": "Your account is permanently banned, which means you can�t play online or join Realms.",
|
||||
"menu.playerReporting": "Player Reporting",
|
||||
"multiplayer.disconnect.unsigned_chat": "Received chat packet with missing or invalid signature.",
|
||||
"multiplayer.disconnect.too_many_pending_chats": "Too many unacknowledged chat messages",
|
||||
"multiplayer.disconnect.chat_validation_failed": "Chat message validation failure",
|
||||
"multiplayer.unsecureserver.toast.title": "Chat messages can't be verified",
|
||||
"multiplayer.unsecureserver.toast": "Messages sent on this server may be modified and might not reflect the original message",
|
||||
"chat.previewInput": "Press [%s] to preview",
|
||||
"chat.tag.not_secure": "This message is not secure, which means that it might have been modified by the server",
|
||||
"chat.tag.modified": "This message has been modified by the server.",
|
||||
"chat.tag.modified.original": "Original text: %s",
|
||||
"chat.tag.filtered": "This message has been filtered by the server.",
|
||||
"chat.filtered_full": "The server has hidden your message for some players.",
|
||||
"disconnect.loginFailedInfo.userBanned": "You are banned from playing online",
|
||||
"options.chatPreview.live": "While Typing",
|
||||
"options.chatPreview.confirm": "When Sending",
|
||||
"options.chatPreview.tooltip.off": "Any modifications applied to your chat messages by a server will not be previewed and will be treated as insecure.",
|
||||
"options.chatPreview.tooltip.live": "If a server uses Chat Previews: Any modifications applied to your chat messages by a server will be dynamically sent for previewing as the chat message is typed.",
|
||||
"options.chatPreview.tooltip.confirm": "If a server uses Chat Previews: A chat preview is only generated when attempting to send a message that does not have a preview or is waiting for a preview.\nSending the message requires confirmation.",
|
||||
"title.multiplayer.disabled.banned.temporary": "Your account is temporarily suspended from online play",
|
||||
"title.multiplayer.disabled.banned.permanent": "Your account is permanently suspended from online play",
|
||||
"gui.minutes": "%s minute(s)",
|
||||
"gui.hours": "%s hour(s)",
|
||||
"gui.days": "%s day(s)"
|
||||
},
|
||||
"1.19": {
|
||||
"selectWorld.loading_list": "Loading world list",
|
||||
"flat_world_preset.unknown": "???",
|
||||
"flat_world_preset.minecraft.classic_flat": "Classic Flat",
|
||||
"flat_world_preset.minecraft.tunnelers_dream": "Tunnelers' Dream",
|
||||
"flat_world_preset.minecraft.water_world": "Water World",
|
||||
"flat_world_preset.minecraft.overworld": "Overworld",
|
||||
"flat_world_preset.minecraft.snowy_kingdom": "Snowy Kingdom",
|
||||
"flat_world_preset.minecraft.bottomless_pit": "Bottomless Pit",
|
||||
"flat_world_preset.minecraft.desert": "Desert",
|
||||
"flat_world_preset.minecraft.redstone_ready": "Redstone Ready",
|
||||
"flat_world_preset.minecraft.the_void": "The Void",
|
||||
"generator.minecraft.normal": "Default",
|
||||
"generator.minecraft.flat": "Superflat",
|
||||
"generator.minecraft.large_biomes": "Large Biomes",
|
||||
"generator.minecraft.amplified": "AMPLIFIED",
|
||||
"generator.minecraft.amplified.info": "Notice: Just for fun! Requires a beefy computer.",
|
||||
"generator.minecraft.debug_all_block_states": "Debug Mode",
|
||||
"generator.minecraft.single_biome_surface": "Single Biome",
|
||||
"multiplayer.disconnect.missing_public_key": "Missing profile public key.\nThis server requires secure profiles.",
|
||||
"multiplayer.disconnect.invalid_public_key_signature": "Invalid signature for profile public key.\nTry restarting your game.",
|
||||
"multiplayer.disconnect.invalid_public_key": "Unable to parse profile public key.",
|
||||
"multiplayer.disconnect.out_of_order_chat": "Out-of-order chat packet received. Did your system time change?",
|
||||
"chatPreview.warning.title": "This server uses Chat Preview",
|
||||
"chatPreview.warning.content": "Chat Preview allows the server to see your messages in real time as you type them, even before they�re sent. This is often used to preview your message with styling applied.\n\nChat Preview is on by default, but can be turned off in Chat Settings.",
|
||||
"chatPreview.warning.check": "Do not notify again for this server",
|
||||
"chatPreview.warning.toast.title": "Chat Preview is enabled",
|
||||
"chatPreview.warning.toast": "This server uses Chat Preview and can see your messages as you type them, even before they're sent. You can turn this off in Chat Settings.",
|
||||
"chat.disabled.profile.moreInfo": "Chat not allowed by account settings. Cannot send or view messages.",
|
||||
"chat.preview": "Type to preview",
|
||||
"options.darknessEffectScale": "Darkness Pulsing",
|
||||
"options.darknessEffectScale.tooltip": "Controls how much the Darkness effect pulses when a Warden or Sculk Shrieker gives it to you.",
|
||||
"options.chatPreview": "Chat Preview",
|
||||
"options.chatPreview.tooltip": "Chat Preview allows servers to see your messages as you type, which allows them to style your message. You can still chat if you turn this off.",
|
||||
"options.onlyShowSecureChat": "Only Show Secure Chat",
|
||||
"options.onlyShowSecureChat.tooltip": "Only display messages from other players that can be verified to have been sent by that player, and have not been modified.",
|
||||
"options.directionalAudio": "Directional Audio",
|
||||
"options.directionalAudio.on.tooltip": "Uses HRTF-based directional audio to improve the simulation of 3D sound. Requires HRTF compatible audio hardware, and is best experienced with headphones.",
|
||||
"options.directionalAudio.off.tooltip": "Classic Stereo sound",
|
||||
"block.minecraft.mangrove_planks": "Mangrove Planks",
|
||||
"block.minecraft.mangrove_propagule": "Mangrove Propagule",
|
||||
"block.minecraft.mangrove_door": "Mangrove Door",
|
||||
"block.minecraft.mangrove_wood": "Mangrove Wood",
|
||||
"block.minecraft.mangrove_log": "Mangrove Log",
|
||||
"block.minecraft.mangrove_roots": "Mangrove Roots",
|
||||
"block.minecraft.muddy_mangrove_roots": "Muddy Mangrove Roots",
|
||||
"block.minecraft.stripped_mangrove_log": "Stripped Mangrove Log",
|
||||
"block.minecraft.stripped_mangrove_wood": "Stripped Mangrove Wood",
|
||||
"block.minecraft.mangrove_leaves": "Mangrove Leaves",
|
||||
"block.minecraft.mud_brick_slab": "Mud Brick Slab",
|
||||
"block.minecraft.mangrove_slab": "Mangrove Slab",
|
||||
"block.minecraft.mangrove_stairs": "Mangrove Stairs",
|
||||
"block.minecraft.mangrove_sign": "Mangrove Sign",
|
||||
"block.minecraft.mangrove_wall_sign": "Mangrove Wall Sign",
|
||||
"block.minecraft.mangrove_pressure_plate": "Mangrove Pressure Plate",
|
||||
"block.minecraft.mangrove_button": "Mangrove Button",
|
||||
"block.minecraft.mangrove_fence": "Mangrove Fence",
|
||||
"block.minecraft.mangrove_fence_gate": "Mangrove Fence Gate",
|
||||
"block.minecraft.mangrove_trapdoor": "Mangrove Trapdoor",
|
||||
"block.minecraft.packed_mud": "Packed Mud",
|
||||
"block.minecraft.mud_bricks": "Mud Bricks",
|
||||
"block.minecraft.mud_brick_stairs": "Mud Brick Stairs",
|
||||
"block.minecraft.potted_mangrove_propagule": "Potted Mangrove Propagule",
|
||||
"block.minecraft.mud_brick_wall": "Mud Brick Wall",
|
||||
"block.minecraft.mud": "Mud",
|
||||
"block.minecraft.sculk": "Sculk",
|
||||
"block.minecraft.sculk_catalyst": "Sculk Catalyst",
|
||||
"block.minecraft.sculk_shrieker": "Sculk Shrieker",
|
||||
"block.minecraft.sculk_vein": "Sculk Vein",
|
||||
"block.minecraft.ochre_froglight": "Ochre Froglight",
|
||||
"block.minecraft.verdant_froglight": "Verdant Froglight",
|
||||
"block.minecraft.pearlescent_froglight": "Pearlescent Froglight",
|
||||
"block.minecraft.frogspawn": "Frogspawn",
|
||||
"block.minecraft.reinforced_deepslate": "Reinforced Deepslate",
|
||||
"item.minecraft.tadpole_bucket": "Bucket of Tadpole",
|
||||
"item.minecraft.oak_chest_boat": "Oak Boat with Chest",
|
||||
"item.minecraft.spruce_chest_boat": "Spruce Boat with Chest",
|
||||
"item.minecraft.birch_chest_boat": "Birch Boat with Chest",
|
||||
"item.minecraft.jungle_chest_boat": "Jungle Boat with Chest",
|
||||
"item.minecraft.acacia_chest_boat": "Acacia Boat with Chest",
|
||||
"item.minecraft.dark_oak_chest_boat": "Dark Oak Boat with Chest",
|
||||
"item.minecraft.mangrove_boat": "Mangrove Boat",
|
||||
"item.minecraft.mangrove_chest_boat": "Mangrove Boat with Chest",
|
||||
"item.minecraft.recovery_compass": "Recovery Compass",
|
||||
"item.minecraft.music_disc_5": "Music Disc",
|
||||
"item.minecraft.music_disc_5.desc": "Samuel �berg - 5",
|
||||
"item.minecraft.disc_fragment_5": "Disc Fragment",
|
||||
"item.minecraft.disc_fragment_5.desc": "Music Disc - 5",
|
||||
"item.minecraft.allay_spawn_egg": "Allay Spawn Egg",
|
||||
"item.minecraft.frog_spawn_egg": "Frog Spawn Egg",
|
||||
"item.minecraft.tadpole_spawn_egg": "Tadpole Spawn Egg",
|
||||
"item.minecraft.warden_spawn_egg": "Warden Spawn Egg",
|
||||
"item.minecraft.echo_shard": "Echo Shard",
|
||||
"item.minecraft.goat_horn": "Goat Horn",
|
||||
"instrument.minecraft.ponder_goat_horn": "Ponder",
|
||||
"instrument.minecraft.sing_goat_horn": "Sing",
|
||||
"instrument.minecraft.seek_goat_horn": "Seek",
|
||||
"instrument.minecraft.feel_goat_horn": "Feel",
|
||||
"instrument.minecraft.admire_goat_horn": "Admire",
|
||||
"instrument.minecraft.call_goat_horn": "Call",
|
||||
"instrument.minecraft.yearn_goat_horn": "Yearn",
|
||||
"instrument.minecraft.dream_goat_horn": "Dream",
|
||||
"entity.minecraft.allay": "Allay",
|
||||
"entity.minecraft.chest_boat": "Boat with Chest",
|
||||
"entity.minecraft.frog": "Frog",
|
||||
"entity.minecraft.tadpole": "Tadpole",
|
||||
"entity.minecraft.warden": "Warden",
|
||||
"death.attack.onFire.item": "%1$s was burnt to a crisp whilst fighting %2$s wielding %3$s",
|
||||
"death.attack.witherSkull.item": "%1$s was shot by a skull from %2$s using %3$s",
|
||||
"death.attack.sonic_boom": "%1$s was obliterated by a sonically-charged shriek",
|
||||
"death.attack.sonic_boom.item": "%1$s was obliterated by a sonically-charged shriek whilst trying to escape %2$s wielding %3$s",
|
||||
"death.attack.sonic_boom.player": "%1$s was obliterated by a sonically-charged shriek whilst trying to escape %2$s",
|
||||
"death.attack.sting.item": "%1$s was stung to death by %2$s using %3$s",
|
||||
"effect.minecraft.darkness": "Darkness",
|
||||
"enchantment.minecraft.swift_sneak": "Swift Sneak",
|
||||
"subtitles.block.frogspawn.hatch": "Tadpole hatches",
|
||||
"subtitles.block.sculk.charge": "Sculk bubbles",
|
||||
"subtitles.block.sculk.spread": "Sculk spreads",
|
||||
"subtitles.block.sculk_catalyst.bloom": "Sculk Catalyst blooms",
|
||||
"subtitles.block.sculk_shrieker.shriek": "Sculk Shrieker shrieks",
|
||||
"subtitles.entity.allay.death": "Allay dies",
|
||||
"subtitles.entity.allay.hurt": "Allay hurts",
|
||||
"subtitles.entity.allay.ambient_with_item": "Allay seeks",
|
||||
"subtitles.entity.allay.ambient_without_item": "Allay yearns",
|
||||
"subtitles.entity.allay.item_given": "Allay chortles",
|
||||
"subtitles.entity.allay.item_taken": "Allay allays",
|
||||
"subtitles.entity.allay.item_thrown": "Allay tosses",
|
||||
"subtitles.entity.frog.ambient": "Frog croaks",
|
||||
"subtitles.entity.frog.death": "Frog dies",
|
||||
"subtitles.entity.frog.eat": "Frog eats",
|
||||
"subtitles.entity.frog.hurt": "Frog hurts",
|
||||
"subtitles.entity.frog.lay_spawn": "Frog lays spawn",
|
||||
"subtitles.entity.frog.long_jump": "Frog jumps",
|
||||
"subtitles.entity.goat.horn_break": "Goat Horn breaks off",
|
||||
"subtitles.entity.parrot.imitate.warden": "Parrot whines",
|
||||
"subtitles.entity.tadpole.death": "Tadpole dies",
|
||||
"subtitles.entity.tadpole.flop": "Tadpole flops",
|
||||
"subtitles.entity.tadpole.hurt": "Tadpole hurts",
|
||||
"subtitles.entity.warden.roar": "Warden roars",
|
||||
"subtitles.entity.warden.sniff": "Warden sniffs",
|
||||
"subtitles.entity.warden.emerge": "Warden emerges",
|
||||
"subtitles.entity.warden.dig": "Warden digs",
|
||||
"subtitles.entity.warden.hurt": "Warden hurts",
|
||||
"subtitles.entity.warden.death": "Warden dies",
|
||||
"subtitles.entity.warden.step": "Warden steps",
|
||||
"subtitles.entity.warden.listening": "Warden takes notice",
|
||||
"subtitles.entity.warden.listening_angry": "Warden takes notice angrily",
|
||||
"subtitles.entity.warden.heartbeat": "Warden's heart beats",
|
||||
"subtitles.entity.warden.attack_impact": "Warden lands hit",
|
||||
"subtitles.entity.warden.tendril_clicks": "Warden's tendrils click",
|
||||
"subtitles.entity.warden.angry": "Warden rages",
|
||||
"subtitles.entity.warden.agitated": "Warden groans angrily",
|
||||
"subtitles.entity.warden.ambient": "Warden whines",
|
||||
"subtitles.entity.warden.nearby_close": "Warden approaches",
|
||||
"subtitles.entity.warden.nearby_closer": "Warden advances",
|
||||
"subtitles.entity.warden.nearby_closest": "Warden draws close",
|
||||
"subtitles.entity.warden.sonic_charge": "Warden charges",
|
||||
"subtitles.entity.warden.sonic_boom": "Warden booms",
|
||||
"subtitles.item.bucket.fill_tadpole": "Tadpole captured",
|
||||
"subtitles.item.goat_horn.play": "Goat Horn plays",
|
||||
"advancements.adventure.avoid_vibration.title": "Sneak 100",
|
||||
"advancements.adventure.avoid_vibration.description": "Sneak near a Sculk Sensor or Warden to prevent it from detecting you",
|
||||
"advancements.adventure.kill_mob_near_sculk_catalyst.title": "It Spreads",
|
||||
"advancements.adventure.kill_mob_near_sculk_catalyst.description": "Kill a mob near a Sculk Catalyst",
|
||||
"advancements.husbandry.froglights.title": "With Our Powers Combined!",
|
||||
"advancements.husbandry.froglights.description": "Have all Froglights in your inventory",
|
||||
"advancements.husbandry.tadpole_in_a_bucket.title": "Bukkit Bukkit",
|
||||
"advancements.husbandry.tadpole_in_a_bucket.description": "Catch a Tadpole in a Bucket",
|
||||
"advancements.husbandry.leash_all_frog_variants.title": "When the Squad Hops into Town",
|
||||
"advancements.husbandry.leash_all_frog_variants.description": "Get each Frog variant on a Lead",
|
||||
"advancements.husbandry.allay_deliver_item_to_player.title": "You've Got a Friend in Me",
|
||||
"advancements.husbandry.allay_deliver_item_to_player.description": "Have an Allay deliver items to you",
|
||||
"advancements.husbandry.allay_deliver_cake_to_note_block.title": "Birthday Song",
|
||||
"advancements.husbandry.allay_deliver_cake_to_note_block.description": "Have an Allay drop a Cake at a Note Block",
|
||||
"argument.enum.invalid": "Invalid value \"%s\"",
|
||||
"commands.locate.structure.success": "The nearest %s is at %s (%s blocks away)",
|
||||
"commands.locate.structure.not_found": "Could not find a structure of type \"%s\" nearby",
|
||||
"commands.locate.structure.invalid": "There is no structure with type \"%s\"",
|
||||
"commands.locate.biome.success": "The nearest %s is at %s (%s blocks away)",
|
||||
"commands.locate.biome.not_found": "Could not find a biome of type \"%s\" within reasonable distance",
|
||||
"commands.locate.biome.invalid": "There is no biome with type \"%s\"",
|
||||
"commands.locate.poi.success": "The nearest %s is at %s (%s blocks away)",
|
||||
"commands.locate.poi.not_found": "Could not find a point of interest of type \"%s\" within reasonable distance",
|
||||
"commands.locate.poi.invalid": "There is no point of interest with type \"%s\"",
|
||||
"commands.place.feature.failed": "Failed to place feature",
|
||||
"commands.place.feature.invalid": "There is no feature with type \"%s\"",
|
||||
"commands.place.feature.success": "Placed \"%s\" at %s, %s, %s",
|
||||
"commands.place.jigsaw.failed": "Failed to generate jigsaw",
|
||||
"commands.place.jigsaw.invalid": "There is no template pool with type \"%s\"",
|
||||
"commands.place.jigsaw.success": "Generated jigsaw at %s, %s, %s",
|
||||
"commands.place.structure.failed": "Failed to place structure",
|
||||
"commands.place.structure.invalid": "There is no structure with type \"%s\"",
|
||||
"commands.place.structure.success": "Generated structure \"%s\" at %s, %s, %s",
|
||||
"commands.place.template.failed": "Failed to place template",
|
||||
"commands.place.template.invalid": "There is no template with id \"%s\"",
|
||||
"commands.place.template.success": "Loaded template \"%s\" at %s, %s, %s",
|
||||
"biome.minecraft.deep_dark": "Deep Dark",
|
||||
"biome.minecraft.mangrove_swamp": "Mangrove Swamp",
|
||||
"gamerule.doWardenSpawning": "Spawn Wardens",
|
||||
"outOfMemory.title": "Out of memory!",
|
||||
"outOfMemory.message": "Minecraft has run out of memory.\n\nThis could be caused by a bug in the game or by the Java Virtual Machine not being allocated enough memory.\n\nTo prevent level corruption, the current game has quit. We've tried to free up enough memory to let you go back to the main menu and back to playing, but this may not have worked.\n\nPlease restart the game if you see this message again."
|
||||
},
|
||||
"1.18": {
|
||||
"selectWorld.conversion.tooltip": "This world must be opened in an older version (like 1.6.4) to be safely converted",
|
||||
"selectWorld.incompatible_series": "Created by an incompatible version",
|
||||
|
||||
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
|
||||
[versions]
|
||||
|
||||
# ViaVersion
|
||||
viaver = "4.2.1"
|
||||
viaver = "4.4.2"
|
||||
|
||||
# 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.4.1-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:
|
||||
#
|
||||
|
||||
Reference in new issue
Block a user