Compare commits

...
14 Commits
18 changed files with 220 additions and 108 deletions

No files matched your search

@@ -69,7 +69,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "5.0.0";
String MINIMUM_VV_VERSION = "5.0.1";
/**
* Initialize ViaBackwards.
@@ -67,14 +67,8 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
if (protocol.getComponentRewriter() != null) {
// Handle name and lore components
final StructuredData<Tag> customNameData = dataContainer.getNonEmpty(StructuredDataKey.CUSTOM_NAME);
if (customNameData != null) {
final Tag originalName = customNameData.value().copy();
protocol.getComponentRewriter().processTag(connection, customNameData.value());
if (!customNameData.value().equals(originalName)) {
saveTag(createCustomTag(item), originalName, "Name");
}
}
updateComponent(connection, item, StructuredDataKey.ITEM_NAME, "item_name");
updateComponent(connection, item, StructuredDataKey.CUSTOM_NAME, "custom_name");
final StructuredData<Tag[]> loreData = dataContainer.getNonEmpty(StructuredDataKey.LORE);
if (loreData != null) {
@@ -115,7 +109,7 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
// Set custom name - only done if there is no original one
if (!dataContainer.contains(StructuredDataKey.CUSTOM_NAME)) {
dataContainer.set(StructuredDataKey.CUSTOM_NAME, mappedItem.tagName());
tag.putBoolean(nbtTagName("customName"), true);
tag.putBoolean(nbtTagName("added_custom_name"), true);
}
updateItemComponents(connection, dataContainer, this::handleItemToClient, itemIdRewriter, blockIdRewriter);
@@ -30,7 +30,6 @@ import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.data.Enchantments;
import com.viaversion.viaversion.libs.fastutil.ints.Int2IntMap;
import com.viaversion.viaversion.libs.fastutil.ints.IntIntPair;
import com.viaversion.viaversion.libs.fastutil.objects.ObjectIterator;
import com.viaversion.viaversion.rewriter.IdRewriteFunction;
import com.viaversion.viaversion.util.ComponentUtil;
@@ -86,20 +85,20 @@ public class StructuredEnchantmentRewriter {
boolean changed = false;
final ObjectIterator<Int2IntMap.Entry> iterator = enchantments.enchantments().int2IntEntrySet().iterator();
final List<IntIntPair> updatedIds = new ArrayList<>();
final List<PendingIdChange> updatedIds = new ArrayList<>();
while (iterator.hasNext()) {
final Int2IntMap.Entry entry = iterator.next();
final int id = entry.getIntKey();
final int mappedId = rewriteFunction.rewrite(id);
final int level = entry.getIntValue();
if (mappedId != -1) {
if (rewriteIds) {
// Update the map after to iteration to preserve the current ids before possibly saving the original, avoid CME
updatedIds.add(IntIntPair.of(id, mappedId));
updatedIds.add(new PendingIdChange(id, mappedId, level));
}
continue;
}
final int level = entry.getIntValue();
final Tag description = descriptionSupplier.get(id, level);
if (description != null) {
if (!changed) {
@@ -113,9 +112,12 @@ public class StructuredEnchantmentRewriter {
}
}
for (final IntIntPair pair : updatedIds) {
final int level = enchantments.enchantments().remove(pair.firstInt());
enchantments.add(pair.secondInt(), level);
// Remove all first, then add the new ones
for (final PendingIdChange change : updatedIds) {
enchantments.remove(change.id());
}
for (final PendingIdChange change : updatedIds) {
enchantments.add(change.mappedId(), change.level());
}
if (loreToAdd.isEmpty()) {
@@ -198,4 +200,7 @@ public class StructuredEnchantmentRewriter {
Tag get(int id, int level);
}
private record PendingIdChange(int id, int mappedId, int level) {
}
}
@@ -17,6 +17,9 @@
*/
package com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.viabackwards.api.entities.storage.EntityReplacement;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.Protocol1_19_4To1_19_3;
@@ -30,9 +33,6 @@ import com.viaversion.viaversion.api.type.types.version.Types1_19_4;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.protocols.v1_19_1to1_19_3.packet.ClientboundPackets1_19_3;
import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.viaversion.util.TagUtil;
public final class EntityPacketRewriter1_19_4 extends EntityRewriter<ClientboundPackets1_19_4, Protocol1_19_4To1_19_3> {
@@ -127,6 +127,16 @@ public final class EntityPacketRewriter1_19_4 extends EntityRewriter<Clientbound
handler(worldDataTrackerHandlerByKey());
}
});
protocol.registerClientbound(ClientboundPackets1_19_4.UPDATE_MOB_EFFECT, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Entity id
wrapper.passthrough(Types.VAR_INT); // Effect id
wrapper.passthrough(Types.BYTE); // Amplifier
// Handle inifinite duration. Use a value the client still accepts without bugging out the display while still being practically infinite
final int duration = wrapper.read(Types.VAR_INT);
wrapper.write(Types.VAR_INT, duration == -1 ? 999999 : duration);
});
}
@Override
@@ -29,6 +29,7 @@ import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.storage.RegistryData
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.storage.SecureChatStorage;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.RegistryType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
import com.viaversion.viaversion.api.platform.providers.ViaProviders;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
@@ -77,6 +78,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
protected void registerPackets() {
super.registerPackets();
tagRewriter.addEmptyTag(RegistryType.ITEM, "minecraft:axolotl_tempt_items");
tagRewriter.registerGeneric(ClientboundPackets1_20_5.UPDATE_TAGS);
registerClientbound(ClientboundConfigurationPackets1_20_5.UPDATE_TAGS, wrapper -> {
// Send off registry data first, needed for tags
@@ -186,6 +186,23 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
}
});
protocol.registerClientbound(ClientboundPackets1_20_5.MAP_ITEM_DATA, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Map id
wrapper.passthrough(Types.BYTE); // Scale
wrapper.passthrough(Types.BOOLEAN); // Locked
if (wrapper.passthrough(Types.BOOLEAN)) {
final int icons = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < icons; i++) {
final int decorationType = wrapper.read(Types.VAR_INT);
wrapper.write(Types.VAR_INT, decorationType == 34 ? 32 : decorationType); // Trial champer to jungle temple
wrapper.passthrough(Types.BYTE); // X
wrapper.passthrough(Types.BYTE); // Y
wrapper.passthrough(Types.BYTE); // Rotation
wrapper.passthrough(Types.OPTIONAL_TAG); // Display name
}
}
});
final RecipeRewriter1_20_3<ClientboundPacket1_20_5> recipeRewriter = new RecipeRewriter1_20_3<>(protocol);
protocol.registerClientbound(ClientboundPackets1_20_5.UPDATE_RECIPES, wrapper -> {
final int size = wrapper.passthrough(Types.VAR_INT);
@@ -380,23 +380,32 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
filter().mapDataType(typeId -> {
filter().handler((event, data) -> {
final int typeId = data.dataType().typeId();
if (typeId == Types1_20_5.ENTITY_DATA_TYPES.particlesType.typeId()) {
// Handled with living entity
return Types1_20_5.ENTITY_DATA_TYPES.particlesType;
final Particle[] particles = data.value();
int color = 0;
for (final Particle particle : particles) {
if (particle.id() == protocol.getMappingData().getParticleMappings().id("entity_effect")) {
// Remove color argument, use one of them for the ambient particle color
color = particle.<Integer>removeArgument(0).getValue();
}
}
data.setTypeAndValue(Types1_20_3.ENTITY_DATA_TYPES.varIntType, removeAlpha(color));
return;
}
int id = typeId;
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.wolfVariantType.typeId()) {
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.armadilloState.typeId()) {
id--;
}
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.armadilloState.typeId()) {
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.wolfVariantType.typeId()) {
id--;
}
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.particlesType.typeId()) {
id--;
}
return Types1_20_3.ENTITY_DATA_TYPES.byId(id);
data.setDataType(Types1_20_3.ENTITY_DATA_TYPES.byId(id));
});
registerMetaTypeHandler1_20_3(
@@ -410,18 +419,6 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
);
registerBlockStateHandler(EntityTypes1_20_5.ABSTRACT_MINECART, 11);
filter().type(EntityTypes1_20_5.LIVING_ENTITY).index(10).handler((event, meta) -> {
final Particle[] particles = meta.value();
int color = 0;
for (final Particle particle : particles) {
if (particle.id() == protocol.getMappingData().getParticleMappings().id("entity_effect")) {
// Remove color argument, use one of them for the ambient particle color
color = particle.<Integer>removeArgument(0).getValue();
}
}
meta.setTypeAndValue(Types1_20_3.ENTITY_DATA_TYPES.varIntType, removeAlpha(color));
});
filter().type(EntityTypes1_20_5.AREA_EFFECT_CLOUD).addIndex(9); // Color
filter().type(EntityTypes1_20_5.AREA_EFFECT_CLOUD).index(11).handler((event, meta) -> {
final Particle particle = meta.value();
@@ -34,7 +34,7 @@ import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ServerboundPac
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import java.util.Arrays;
import com.viaversion.viaversion.util.ArrayUtil;
public final class Protocol1_20To1_19_4 extends BackwardsProtocol<ClientboundPackets1_19_4, ClientboundPackets1_19_4, ServerboundPackets1_19_4, ServerboundPackets1_19_4> {
@@ -62,7 +62,6 @@ public final class Protocol1_20To1_19_4 extends BackwardsProtocol<ClientboundPac
new StatisticsRewriter<>(this).register(ClientboundPackets1_19_4.AWARD_STATS);
//TODO open window
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_4.SET_ACTION_BAR_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_4.SET_TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_4.SET_SUBTITLE_TEXT);
@@ -75,10 +74,7 @@ public final class Protocol1_20To1_19_4 extends BackwardsProtocol<ClientboundPac
registerClientbound(ClientboundPackets1_19_4.UPDATE_ENABLED_FEATURES, wrapper -> {
String[] enabledFeatures = wrapper.read(Types.STRING_ARRAY);
final int length = enabledFeatures.length;
enabledFeatures = Arrays.copyOf(enabledFeatures, length + 1);
enabledFeatures[length] = "minecraft:update_1_20";
wrapper.write(Types.STRING_ARRAY, enabledFeatures);
wrapper.write(Types.STRING_ARRAY, ArrayUtil.add(enabledFeatures, "minecraft:update_1_20"));
});
registerClientbound(ClientboundPackets1_19_4.PLAYER_COMBAT_END, wrapper -> {
@@ -26,7 +26,6 @@ import com.viaversion.viaversion.api.minecraft.BlockPosition;
import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18;
import com.viaversion.nbt.tag.CompoundTag;
@@ -86,7 +85,13 @@ public final class BlockItemPacketRewriter1_20 extends BackwardsItemRewriter<Cli
}
});
registerOpenScreen(ClientboundPackets1_19_4.OPEN_SCREEN);
protocol.registerClientbound(ClientboundPackets1_19_4.OPEN_SCREEN, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Container id
handleMenuType(wrapper);
protocol.getComponentRewriter().passthroughAndProcess(wrapper);
});
registerCooldown(ClientboundPackets1_19_4.COOLDOWN);
registerSetContent1_17_1(ClientboundPackets1_19_4.CONTAINER_SET_CONTENT);
registerSetSlot1_17_1(ClientboundPackets1_19_4.CONTAINER_SET_SLOT);
@@ -25,6 +25,7 @@ import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.BlockItemPack
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.ComponentRewriter1_21;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.EntityPacketRewriter1_21;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.EnchantmentsPaintingsStorage;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.PlayerRotationStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
@@ -45,6 +46,7 @@ import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPacke
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.util.ArrayUtil;
import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
@@ -174,12 +176,18 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
wrapper.set(Types.VAR_INT, 1, newSize);
}
});
registerClientbound(ClientboundConfigurationPackets1_21.UPDATE_ENABLED_FEATURES, wrapper -> {
final String[] enabledFeatures = wrapper.read(Types.STRING_ARRAY);
wrapper.write(Types.STRING_ARRAY, ArrayUtil.add(enabledFeatures, "minecraft:update_1_21"));
});
}
@Override
public void init(final UserConnection user) {
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_20_5.PLAYER));
user.put(new EnchantmentsPaintingsStorage());
user.put(new PlayerRotationStorage());
}
@Override
@@ -26,6 +26,7 @@ import com.viaversion.viabackwards.api.rewriters.EnchantmentRewriter;
import com.viaversion.viabackwards.api.rewriters.StructuredEnchantmentRewriter;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.Protocol1_21To1_20_5;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.EnchantmentsPaintingsStorage;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.PlayerRotationStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
@@ -47,6 +48,7 @@ import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.IdRewriteFunction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.viaversion.viaversion.protocols.v1_20_5to1_21.rewriter.BlockItemPacketRewriter1_21.downgradeItemData;
import static com.viaversion.viaversion.protocols.v1_20_5to1_21.rewriter.BlockItemPacketRewriter1_21.updateItemData;
@@ -111,8 +113,10 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
protocol.registerServerbound(ServerboundPackets1_20_5.USE_ITEM, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Hand
wrapper.passthrough(Types.VAR_INT); // Sequence
wrapper.write(Types.FLOAT, 0f); // Y rotation
wrapper.write(Types.FLOAT, 0f); // X rotation
final PlayerRotationStorage rotation = wrapper.user().get(PlayerRotationStorage.class);
wrapper.write(Types.FLOAT, rotation.yaw());
wrapper.write(Types.FLOAT, rotation.pitch());
});
new RecipeRewriter1_20_3<>(protocol).register1_20_5(ClientboundPackets1_21.UPDATE_RECIPES);
@@ -183,7 +187,8 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
}
final Enchantments enchantments = enchantmentsData.value();
for (final Int2IntMap.Entry entry : new ArrayList<>(enchantments.enchantments().int2IntEntrySet())) {
final List<PendingIdChange> updatedIds = new ArrayList<>();
for (final Int2IntMap.Entry entry : enchantments.enchantments().int2IntEntrySet()) {
final int id = entry.getIntKey();
final String enchantmentKey = Enchantments1_20_5.idToKey(id);
if (enchantmentKey == null) {
@@ -192,9 +197,20 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
final int mappedId = storage.enchantments().keyToId(enchantmentKey);
if (id != mappedId) {
enchantments.enchantments().remove(id);
enchantments.enchantments().put(mappedId, entry.getIntValue());
final int level = entry.getIntValue();
updatedIds.add(new PendingIdChange(id, mappedId, level));
}
}
// Remove first, then add updated entries
for (final PendingIdChange change : updatedIds) {
enchantments.remove(change.id);
}
for (final PendingIdChange change : updatedIds) {
enchantments.add(change.mappedId, change.level);
}
}
private record PendingIdChange(int id, int mappedId, int level) {
}
}
@@ -22,6 +22,7 @@ import com.viaversion.nbt.tag.Tag;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.Protocol1_21To1_20_5;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.EnchantmentsPaintingsStorage;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.PlayerRotationStorage;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.PaintingVariant;
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
@@ -29,10 +30,12 @@ import com.viaversion.viaversion.api.minecraft.WolfVariant;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityDataType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.Types1_21;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.data.Paintings1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPacket1_21;
@@ -123,6 +126,23 @@ public final class EntityPacketRewriter1_21 extends EntityRewriter<ClientboundPa
final String world = wrapper.passthrough(Types.STRING);
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world); // Tracks world height and name for chunk data and entity (un)tracking
});
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_PLAYER_POS_ROT, wrapper -> {
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
storePlayerRotation(wrapper);
});
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_PLAYER_ROT, this::storePlayerRotation);
}
private void storePlayerRotation(final PacketWrapper wrapper) {
final float yaw = wrapper.passthrough(Types.FLOAT);
final float pitch = wrapper.passthrough(Types.FLOAT);
wrapper.user().get(PlayerRotationStorage.class).setRotation(yaw, pitch);
}
private int[] paintingMappingsForEntries(final RegistryEntry[] entries) {
@@ -0,0 +1,38 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2024 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.v1_21to1_20_5.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
public final class PlayerRotationStorage implements StorableObject {
private float yaw, pitch;
public void setRotation(final float yaw, final float pitch) {
this.yaw = yaw;
this.pitch = pitch;
}
public float yaw() {
return yaw;
}
public float pitch() {
return pitch;
}
}
@@ -11,41 +11,30 @@
"attribute.name.player.submerged_mining_speed": "Submerged Mining Speed",
"attribute.name.player.sweeping_damage_ratio": "Sweeping Damage Ratio",
"gamerule.entitiesWithPassengersCanUsePortals": "Entities with passengers can use portals",
"gamerule.entitiesWithPassengersCanUsePortals.description": "Allow entities with passengers to teleport through nether portals, end portals and end gateways.",
"gamerule.entitiesWithPassengersCanUsePortals.description": "Allow entities with passengers to teleport through Nether Portals, End Portals, and End Gateways.",
"gui.abuseReport.attestation": "By submitting this report, you confirm that the information you have provided is accurate and complete to the best of your knowledge.",
"gui.abuseReport.send.not_attested": "Please read the text above and tick the checkbox to be able to send the report",
"gui.fileDropFailure.detail": "Rejected %d files",
"gui.fileDropFailure.title": "Failed to add files",
"gui.open_report_dir": "Open Report Directory",
"gui.report_to_server": "Report To Server",
"item.minecraft.music_disc_creator": "Music Disc",
"item.minecraft.music_disc_creator_music_box": "Music Disc",
"item.minecraft.music_disc_creator_music_box.desc": "Lena Raine - Creator (Music Box)",
"item.minecraft.music_disc_creator.desc": "Lena Raine - Creator",
"item.minecraft.music_disc_precipice": "Music Disc",
"item.minecraft.music_disc_precipice.desc": "Aaron Cherof - Precipice",
"item.modifiers.any": "When equipped:",
"item.modifiers.armor": "When worn:",
"item.modifiers.hand": "When held:",
"jukebox_song.minecraft.5": "Samuel �berg - 5",
"jukebox_song.minecraft.11": "C418 - 11",
"jukebox_song.minecraft.13": "C418 - 13",
"jukebox_song.minecraft.blocks": "C418 - blocks",
"jukebox_song.minecraft.cat": "C418 - cat",
"jukebox_song.minecraft.chirp": "C418 - chirp",
"jukebox_song.minecraft.creator": "Lena Raine - Creator",
"jukebox_song.minecraft.creator_music_box": "Lena Raine - Creator (Music Box)",
"jukebox_song.minecraft.far": "C418 - far",
"jukebox_song.minecraft.mall": "C418 - mall",
"jukebox_song.minecraft.mellohi": "C418 - mellohi",
"jukebox_song.minecraft.otherside": "Lena Raine - otherside",
"jukebox_song.minecraft.pigstep": "Lena Raine - Pigstep",
"jukebox_song.minecraft.precipice": "Aaron Cherof - Precipice",
"jukebox_song.minecraft.relic": "Aaron Cherof - Relic",
"jukebox_song.minecraft.stal": "C418 - stal",
"jukebox_song.minecraft.strad": "C418 - strad",
"jukebox_song.minecraft.wait": "C418 - wait",
"jukebox_song.minecraft.ward": "C418 - ward",
"known_server_link.announcements": "Announcements",
"known_server_link.community": "Community",
"known_server_link.community_guidelines": "Community Guidelines",
"known_server_link.feedback": "Feedback",
"known_server_link.forums": "Forums",
"known_server_link.news": "News",
"known_server_link.report_bug": "Report Server Bug",
"mco.compatibility.incompatible.popup.title": "Incompatible version",
"known_server_link.support": "Support",
"known_server_link.website": "Website",
"mco.compatibility.incompatible.releaseType.popup.message": "The world you are trying to join is incompatible with the version you are on.",
"mco.compatibility.incompatible.series.popup.message": "This world was last played in version %s; you are on version %s.\n\nThese series are not compatible with each other. A new world is needed to play on this version.",
"mco.compatibility.upgrade.friend.description": "This world was last played in version %s; you are on version %s.\n\nA backup of the world will be saved under \"World Backups\".\n\nThe owner of the Realm can restore the world if needed.",
@@ -57,53 +46,38 @@
"menu.server_links": "Server Links...",
"menu.server_links.title": "Server Links",
"options.realmsNotifications.tooltip": "Fetches Realms news and invites in the title screen and displays their respective icon on the Realms button.",
"painting.minecraft.backyard.author": "Kristoffer Zetterstrand",
"painting.minecraft.backyard.title": "Backyard",
"painting.minecraft.baroque.author": "Sarah Boeving",
"painting.minecraft.baroque.title": "Baroque",
"painting.minecraft.bouquet.author": "Kristoffer Zetterstrand",
"painting.minecraft.bouquet.title": "Bouquet",
"painting.minecraft.cavebird.author": "Kristoffer Zetterstrand",
"painting.minecraft.cavebird.title": "Cavebird",
"painting.minecraft.changing.author": "Kristoffer Zetterstrand",
"painting.minecraft.changing.title": "Changing",
"painting.minecraft.cotan.author": "Kristoffer Zetterstrand",
"painting.minecraft.cotan.title": "Cot�n",
"painting.minecraft.endboss.author": "Kristoffer Zetterstrand",
"painting.minecraft.endboss.title": "Endboss",
"painting.minecraft.fern.author": "Kristoffer Zetterstrand",
"painting.minecraft.fern.title": "Fern",
"painting.minecraft.finding.author": "Kristoffer Zetterstrand",
"painting.minecraft.finding.title": "Finding",
"painting.minecraft.humble.author": "Sarah Boeving",
"painting.minecraft.humble.title": "Humble",
"painting.minecraft.lowmist.author": "Kristoffer Zetterstrand",
"painting.minecraft.lowmist.title": "Lowmist",
"painting.minecraft.meditative.author": "Sarah Boeving",
"painting.minecraft.meditative.title": "Meditative",
"painting.minecraft.orb.author": "Kristoffer Zetterstrand",
"painting.minecraft.orb.title": "Orb",
"painting.minecraft.owlemons.author": "Kristoffer Zetterstrand",
"painting.minecraft.owlemons.title": "Owlemons",
"painting.minecraft.passage.author": "Kristoffer Zetterstrand",
"painting.minecraft.passage.title": "Passage",
"painting.minecraft.pond.author": "Kristoffer Zetterstrand",
"painting.minecraft.pond.title": "Pond",
"painting.minecraft.prairie_ride.author": "Sarah Boeving",
"painting.minecraft.prairie_ride.title": "Prairie Ride",
"painting.minecraft.sunflowers.author": "Kristoffer Zetterstrand",
"painting.minecraft.sunflowers.title": "Sunflowers",
"painting.minecraft.tides.author": "Kristoffer Zetterstrand",
"painting.minecraft.tides.title": "Tides",
"painting.minecraft.unpacked.author": "Sarah Boeving",
"painting.minecraft.unpacked.title": "Unpacked",
"subtitles.block.trial_spawner.ambient_ominous": "Ominous crackling",
"subtitles.block.trial_spawner.ominous_activate": "Omen engulfs Trial Spawner",
"subtitles.block.vault.reject_rewarded_player": "Vault rejects already rewarded player"
"subtitles.block.vault.reject_rewarded_player": "Vault rejects player"
},
"1.20.5": {
"advancements.adventure.blowback.description": "Kill a Breeze with a deflected Breeze-shot Wind Charge",
"advancements.adventure.blowback.title": "Blowback",
"advancements.adventure.brush_armadillo.description": "Get Armadillo Scutes from an Armadillo using a Brush",
"advancements.adventure.brush_armadillo.title": "Isn't It Scute?",
"advancements.adventure.crafters_crafting_crafters.description": "Be near a Crafter when it crafts a Crafter",
"advancements.adventure.crafters_crafting_crafters.title": "Crafters Crafting Crafters",
"advancements.adventure.lighten_up.description": "Scrape a Copper Bulb with an Axe to make it brighter",
@@ -112,18 +86,28 @@
"advancements.adventure.minecraft_trials_edition.title": "Minecraft: Trial(s) Edition",
"advancements.adventure.overoverkill.description": "Deal 50 hearts of damage in a single hit using the Mace",
"advancements.adventure.overoverkill.title": "Over-Overkill",
"advancements.adventure.revaulting.description": "Unlock an Ominous Vault with an Ominous Trial Key",
"advancements.adventure.revaulting.title": "Revaulting",
"advancements.adventure.under_lock_and_key.description": "Unlock a Vault with a Trial Key",
"advancements.adventure.under_lock_and_key.title": "Under Lock and Key",
"advancements.adventure.who_needs_rockets.description": "Use a Wind Charge to launch yourself upward 8 blocks",
"advancements.adventure.who_needs_rockets.title": "Who Needs Rockets?",
"advancements.husbandry.remove_wolf_armor.description": "Remove Wolf Armor from a Wolf using Shears",
"advancements.husbandry.remove_wolf_armor.title": "Shear Brilliance",
"advancements.husbandry.repair_wolf_armor.description": "Repair a damaged Wolf Armor using Armadillo Scutes",
"advancements.husbandry.repair_wolf_armor.title": "Good as New",
"advancements.husbandry.whole_pack.description": "Tame one of each Wolf variant",
"advancements.husbandry.whole_pack.title": "The Whole Pack",
"argument.message.too_long": "Chat message was too long (%s > maximum %s characters)",
"argument.resource_or_id.failed_to_parse": "Failed to parse structure: %s",
"argument.resource_or_id.invalid": "Invalid id or tag",
"arguments.item.component.expected": "Expected item component",
"arguments.item.component.malformed": "Malformed '%s' component: '%s'",
"arguments.item.component.repeated": "Item component '%s' was repeated, but only one value can be specified",
"arguments.item.component.unknown": "Unknown item component '%s'",
"arguments.item.malformed": "Malformed item: '%s'",
"arguments.item.predicate.malformed": "Malformed '%s' predicate: '%s'",
"arguments.item.predicate.unknown": "Unknown item predicate '%s''",
"arguments.item.predicate.unknown": "Unknown item predicate '%s'",
"attribute.name.generic.block_interaction_range": "Block Interaction Range",
"attribute.name.generic.entity_interaction_range": "Entity Interaction Range",
"attribute.name.generic.fall_damage_multiplier": "Fall Damage Multiplier",
@@ -135,6 +119,38 @@
"attribute.name.player.block_break_speed": "Block Break Speed",
"attribute.name.player.block_interaction_range": "Block Interaction Range",
"attribute.name.player.entity_interaction_range": "Entity Interaction Range",
"block.minecraft.banner.flow.black": "Black Flow",
"block.minecraft.banner.flow.blue": "Blue Flow",
"block.minecraft.banner.flow.brown": "Brown Flow",
"block.minecraft.banner.flow.cyan": "Cyan Flow",
"block.minecraft.banner.flow.gray": "Gray Flow",
"block.minecraft.banner.flow.green": "Green Flow",
"block.minecraft.banner.flow.light_blue": "Light Blue Flow",
"block.minecraft.banner.flow.light_gray": "Light Gray Flow",
"block.minecraft.banner.flow.lime": "Lime Flow",
"block.minecraft.banner.flow.magenta": "Magenta Flow",
"block.minecraft.banner.flow.orange": "Orange Flow",
"block.minecraft.banner.flow.pink": "Pink Flow",
"block.minecraft.banner.flow.purple": "Purple Flow",
"block.minecraft.banner.flow.red": "Red Flow",
"block.minecraft.banner.flow.white": "White Flow",
"block.minecraft.banner.flow.yellow": "Yellow Flow",
"block.minecraft.banner.guster.black": "Black Guster",
"block.minecraft.banner.guster.blue": "Blue Guster",
"block.minecraft.banner.guster.brown": "Brown Guster",
"block.minecraft.banner.guster.cyan": "Cyan Guster",
"block.minecraft.banner.guster.gray": "Gray Guster",
"block.minecraft.banner.guster.green": "Green Guster",
"block.minecraft.banner.guster.light_blue": "Light Blue Guster",
"block.minecraft.banner.guster.light_gray": "Light Gray Guster",
"block.minecraft.banner.guster.lime": "Lime Guster",
"block.minecraft.banner.guster.magenta": "Magenta Guster",
"block.minecraft.banner.guster.orange": "Orange Guster",
"block.minecraft.banner.guster.pink": "Pink Guster",
"block.minecraft.banner.guster.purple": "Purple Guster",
"block.minecraft.banner.guster.red": "Red Guster",
"block.minecraft.banner.guster.white": "White Guster",
"block.minecraft.banner.guster.yellow": "Yellow Guster",
"block.minecraft.heavy_core": "Heavy Core",
"block.minecraft.vault": "Vault",
"chat.disabled.invalid_command_signature": "Command had unexpected or missing command argument signatures.",
@@ -152,6 +168,7 @@
"commands.transfer.success.single": "Transferring %s to %s:%s",
"connect.failed.transfer": "Connection failed while transferring to the server",
"connect.transferring": "Transferring to new server...",
"disconnect.packetError": "Network Protocol Error",
"disconnect.transfer": "Transferred to another server",
"effect.minecraft.infested": "Infested",
"effect.minecraft.oozing": "Oozing",
@@ -161,28 +178,21 @@
"effect.minecraft.wind_charged": "Wind Charged",
"enchantment.minecraft.breach": "Breach",
"enchantment.minecraft.density": "Density",
"enchantment.minecraft.sweeping_edge": "Sweeping Edge",
"enchantment.minecraft.wind_burst": "Wind Burst",
"entity.minecraft.armadillo": "Armadillo",
"entity.minecraft.bogged": "Bogged",
"entity.minecraft.breeze_wind_charge": "Wind Charge",
"entity.minecraft.ominous_item_spawner": "Ominous Item Spawner",
"filled_map.trial_chambers": "Trial Chambers Map",
"gamerule.spawnChunkRadius": "Spawn chunk radius",
"gamerule.spawnChunkRadius.description": "Amount of chunks that stay loaded around the overworld spawn position.",
"gamerule.spawnRadius.description": "Controls the size of the area around the spawn point that players can spawn in.",
"item.canUse.unknown": "Unknown",
"item.components": "%s component(s)",
"item.minecraft.armadillo_scute": "Armadillo Scute",
"item.minecraft.armadillo_spawn_egg": "Armadillo Spawn Egg",
"item.minecraft.bogged_spawn_egg": "Bogged Spawn Egg",
"item.minecraft.bolt_armor_trim_smithing_template": "Smithing Template",
"item.minecraft.breeze_rod": "Breeze Rod",
"item.minecraft.flow_armor_trim_smithing_template": "Smithing Template",
"item.minecraft.flow_banner_pattern": "Banner Pattern",
"item.minecraft.flow_banner_pattern.desc": "Flow",
"item.minecraft.flow_pottery_sherd": "Flow Pottery Sherd",
"item.minecraft.guster_banner_pattern": "Banner Pattern",
"item.minecraft.guster_banner_pattern.desc": "Guster",
"item.minecraft.guster_pottery_sherd": "Guster Pottery Sherd",
"item.minecraft.lingering_potion.effect.infested": "Lingering Potion of Infestation",
@@ -206,19 +216,16 @@
"item.minecraft.tipped_arrow.effect.weaving": "Arrow of Weaving",
"item.minecraft.tipped_arrow.effect.wind_charged": "Arrow of Wind Charging",
"item.minecraft.turtle_scute": "Turtle Scute",
"item.minecraft.wind_charge": "Wind Charge",
"item.minecraft.wolf_armor": "Wolf Armor",
"item.modifiers.body": "When equipped:",
"mco.backup.narration": "Backup from %s",
"mco.client.outdated.stable.version": "Your client version (%s) is not compatible with Realms.\n\nPlease use the most recent version of Minecraft.",
"mco.client.unsupported.snapshot.version": "Your client version (%s) is not compatible with Realms.\n\nRealms is not available for this snapshot version.",
"mco.invited.player.narration": "Invited player %s",
"mco.upload.entry.commands": "%1$s, %2$s",
"multiplayer.disconnect.transfers_disabled": "Server does not accept transfers",
"optimizeWorld.stage.finished.chunks": "Finishing up upgrading chunks...",
"optimizeWorld.stage.finished.entities": "Finishing up upgrading entities...",
"optimizeWorld.stage.finished.poi": "Finishing up upgrading points of interest...",
"optimizeWorld.stage.upgrading.chunks": "Upgrading all chunks...",
"optimizeWorld.stage.upgrading.entities": "Upgrading all entities...",
"optimizeWorld.stage.upgrading.poi": "Upgrading all points of interest...",
"options.accessibility.menu_background_blurriness": "Menu Background Blur",
@@ -228,6 +235,7 @@
"options.japaneseGlyphVariants": "Japanese Glyph Variants",
"options.japaneseGlyphVariants.tooltip": "Uses Japanese variants of CJK characters in the default font",
"options.telemetry.disabled": "Telemetry is disabled.",
"particle.invalidOptions": "Can't parse particle options: %s",
"selectWorld.allowCommands.new": "Allow Commands",
"selectWorld.commands": "Commands",
"selectWorld.warning.lowDiskSpace.description": "There is not much space left on your device.\nRunning out of disk space while in game can lead to your world being damaged.",
@@ -266,12 +274,9 @@
"subtitles.entity.breeze.charge": "Breeze charges",
"subtitles.entity.breeze.deflect": "Breeze deflects",
"subtitles.entity.breeze.whirl": "Breeze whirls",
"subtitles.entity.breeze.wind_burst": "Wind Charge bursts",
"subtitles.entity.donkey.jump": "Donkey jumps",
"subtitles.entity.mule.jump": "Mule jumps",
"subtitles.entity.parrot.imitate.bogged": "Parrot rattles",
"subtitles.entity.wind_charge.throw": "Wind Charge flies",
"subtitles.entity.wind_charge.wind_burst": "Wind Charge bursts",
"subtitles.event.mob_effect.bad_omen": "Omen takes hold",
"subtitles.event.mob_effect.raid_omen": "Raid looms nearby",
"subtitles.event.mob_effect.trial_omen": "Ominous trial looms nearby",
+1 -1
View File
@@ -1,4 +1,4 @@
projectVersion=5.0.0
projectVersion=5.0.1
# Smile emoji
mcVersions=1.21,1.20.6,1.20.5,1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10
+1 -1
View File
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
viaver = "5.0.0"
viaver = "5.0.1-SNAPSHOT"
# Common provided
netty = "4.0.20.Final"
-1
View File
@@ -4,7 +4,6 @@ rootProject.name = "viabackwards-parent"
dependencyResolutionManagement {
repositories {
mavenLocal()
maven("https://repo.viaversion.com")
maven("https://repo.papermc.io/repository/maven-public/")
mavenCentral()