Compare commits

..
19 Commits
Author SHA1 Message Date
Nassim Jahnke 4c316de042 5.4.2 Release 2025-07-23 23:03:10 +02:00
EnZaXD 8ee5d7e680 Add missing biome name translations in 1.17.1->1.18 (#4597) 2025-07-22 20:50:33 +02:00
Nassim Jahnke 64c128d414 Fix 1.8/1.9 thrown potion entity data handling
Fixes #4596
2025-07-21 23:55:03 +02:00
Nassim Jahnke 77d11fc593 Update attribute modifier types in show item hovers
Fixes #4593
2025-07-18 20:50:46 +02:00
Nassim Jahnke 2c72a09809 Strip namespace from custom attribute id when getting names 2025-07-18 11:01:52 +02:00
Nassim Jahnke 3dbd81da76 [ci skip] Split up publishing steps
Putting them into the same step meant if one publish action failed, the second one wouldn't run. Before this change, Modrinth would often block Hangar from publishing
2025-07-17 16:10:15 +02:00
Nassim Jahnke a0116c7ea7 Add 1.21.8 version string to 1.21.7 2025-07-17 14:33:58 +02:00
Nassim Jahnke fd5dadbe01 [ci skip] Clean up imports 2025-07-14 12:36:56 +02:00
Kai df87a02c38 Update ViaNBT (#4585) 2025-07-14 12:25:59 +02:00
EnZaXD bb293b3e5d Add cancel-swing-in-inventory option for 1.15.2->1.16 inventory swing fix (#4587) 2025-07-14 12:24:53 +02:00
EnZaXDanddewgs ff03892b25 Fix some directions not being included in chunk-border-fix; Reduce packets sent by checking for needed chunks (#4586)
Co-authored-by: dewgs <23721849+dewgs@users.noreply.github.com>
2025-07-14 12:21:28 +02:00
EnZaXD eb51306d82 Fix ItemFactory#getSpawnEgg NoSuchMethodError on older Paper builds (#4582) 2025-07-13 08:40:09 +02:00
EnZaXD 81eb3362f3 [ci skip] Add Java resolving plugin (#4577) 2025-07-12 10:31:23 +02:00
EnZaXD 7f06b03453 Remove StorableObject#clearOnServerSwitch (#4583) 2025-07-12 10:30:30 +02:00
RK_01 c16432de2a Fix anticheat flags when respawning with 1.21.2+ clients on older servers (#4573)
Fixes #4572
2025-07-07 21:40:01 +02:00
Nassim Jahnke b162dbdff0 Add missing null check to allowed_entities rewrite
Fixes #4568
2025-07-05 13:55:55 +02:00
Nassim Jahnke dfbe57e304 Rewrite Equippable allowed_entities
Fixes #4567
2025-07-04 17:17:05 +02:00
Nassim Jahnke 6f6dc2c641 Rewrite attribute modifiers automatically via interface
An id change in 1.21.5->1.21.6 was missed
2025-06-30 21:27:00 +02:00
Nassim Jahnke 06990ec0c9 Bump version to 5.4.2-SNAPSHOT 2025-06-30 21:26:14 +02:00
74 changed files with 458 additions and 247 deletions

No files matched your search

+9 -2
View File
@@ -23,8 +23,15 @@ jobs:
distribution: 'temurin'
java-version: 17
check-latest: true
- name: Publish
- name: Build
run: ./gradlew build
- name: Publish to Hangar
env:
HANGAR_TOKEN: ${{ secrets.HANGAR_TOKEN }}
run: ./gradlew publishAllPublicationsToHangar --stacktrace
continue-on-error: true
- name: Publish to Modrinth
env:
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
run: ./gradlew build modrinth publishAllPublicationsToHangar --stacktrace
run: ./gradlew modrinth --stacktrace
continue-on-error: true
@@ -478,4 +478,12 @@ public interface ViaVersionConfig extends Config {
* @return true if enabled
*/
boolean fix1_21PlacementRotation();
/**
* If enabled, cancel swing packets sent while having an inventory opened on 1.15.2 and below servers.
* This can cause false positives with anti-cheat plugins.
*
* @return true if enabled
*/
boolean cancelSwingInInventory();
}
@@ -30,15 +30,6 @@ package com.viaversion.viaversion.api.connection;
*/
public interface StorableObject {
/**
* Returns whether the object should be uncached on a server switch.
*
* @return whether the object should be uncached on a server switch
*/
default boolean clearOnServerSwitch() {
return true;
}
default void onRemove() {
}
}
@@ -139,17 +139,7 @@ public interface UserConnection {
/**
* Clear stored objects, entity trackers and client worlds.
*/
default void clearStoredObjects() {
clearStoredObjects(false);
}
/**
* Clear stored objects, entity trackers and client worlds.
* If cleared for a proxy server switch, some stored objects and tracker data will be retained.
*
* @param isServerSwitch whether the clear is due to a server switch
*/
void clearStoredObjects(boolean isServerSwitch);
void clearStoredObjects();
/**
* Sends a raw packet to the connection on the current thread.
@@ -33,7 +33,6 @@ public enum BlockFace {
TOP((byte) 0, (byte) 1, (byte) 0, EnumAxis.Y),
BOTTOM((byte) 0, (byte) -1, (byte) 0, EnumAxis.Y);
public static final BlockFace[] HORIZONTAL = {NORTH, SOUTH, EAST, WEST};
private static final Map<BlockFace, BlockFace> opposites = new EnumMap<>(BlockFace.class);
static {
@@ -213,7 +213,7 @@ public enum EntityTypes1_14 implements EntityType {
EntityTypes1_14(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_14(final EntityType parent, @Nullable final String identifier) {
@@ -214,7 +214,7 @@ public enum EntityTypes1_15 implements EntityType {
EntityTypes1_15(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_15(final EntityType parent, @Nullable final String identifier) {
@@ -218,7 +218,7 @@ public enum EntityTypes1_16 implements EntityType {
EntityTypes1_16(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_16(final EntityType parent, @Nullable final String identifier) {
@@ -221,7 +221,7 @@ public enum EntityTypes1_16_2 implements EntityType {
EntityTypes1_16_2(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_16_2(final EntityType parent, @Nullable final String identifier) {
@@ -227,7 +227,7 @@ public enum EntityTypes1_17 implements EntityType {
EntityTypes1_17(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_17(final EntityType parent, @Nullable final String identifier) {
@@ -232,7 +232,7 @@ public enum EntityTypes1_19 implements EntityType {
EntityTypes1_19(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_19(final EntityType parent, @Nullable final String identifier) {
@@ -233,7 +233,7 @@ public enum EntityTypes1_19_3 implements EntityType {
EntityTypes1_19_3(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_19_3(final EntityType parent, @Nullable final String identifier) {
@@ -240,7 +240,7 @@ public enum EntityTypes1_19_4 implements EntityType {
EntityTypes1_19_4(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_19_4(final EntityType parent, @Nullable final String identifier) {
@@ -242,7 +242,7 @@ public enum EntityTypes1_20_3 implements EntityType {
EntityTypes1_20_3(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_20_3(final EntityType parent, @Nullable final String identifier) {
@@ -248,7 +248,7 @@ public enum EntityTypes1_20_5 implements EntityType {
EntityTypes1_20_5(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_20_5(final EntityType parent, @Nullable final String identifier) {
@@ -272,7 +272,7 @@ public enum EntityTypes1_21_2 implements EntityType {
EntityTypes1_21_2(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_21_2(final EntityType parent, @Nullable final String identifier) {
@@ -271,7 +271,7 @@ public enum EntityTypes1_21_4 implements EntityType {
EntityTypes1_21_4(final EntityType parent) {
this.parent = parent;
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
}
EntityTypes1_21_4(final EntityType parent, @Nullable final String identifier) {
@@ -24,7 +24,6 @@ package com.viaversion.viaversion.api.minecraft.item;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
import com.viaversion.viaversion.util.Copyable;
import org.checkerframework.checker.nullness.qual.Nullable;
public interface Item extends ItemBase {
@@ -22,14 +22,21 @@
*/
package com.viaversion.viaversion.api.minecraft.item.data;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.FullMappings;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.ArrayType;
import com.viaversion.viaversion.util.Copyable;
import com.viaversion.viaversion.util.Rewritable;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public record AttributeModifiers1_20_5(AttributeModifier[] modifiers, boolean showInTooltip) implements Copyable {
public record AttributeModifiers1_20_5(AttributeModifier[] modifiers,
boolean showInTooltip) implements Copyable, Rewritable {
public static final Type<AttributeModifiers1_20_5> TYPE = new Type<>(AttributeModifiers1_20_5.class) {
@Override
@@ -51,6 +58,23 @@ public record AttributeModifiers1_20_5(AttributeModifier[] modifiers, boolean sh
return new AttributeModifiers1_20_5(Copyable.copy(modifiers), showInTooltip);
}
@Override
public AttributeModifiers1_20_5 rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
final FullMappings mappings = protocol.getMappingData().getAttributeMappings();
if (mappings == null) {
return this;
}
final List<AttributeModifier> modifiers = new ArrayList<>(this.modifiers.length);
for (final AttributeModifier modifier : this.modifiers) {
final int mappedId = clientbound ? mappings.getNewId(modifier.attribute()) : mappings.inverse().getNewId(modifier.attribute());
if (mappedId != -1) {
modifiers.add(new AttributeModifier(mappedId, modifier.modifier(), modifier.slotType()));
}
}
return new AttributeModifiers1_20_5(modifiers.toArray(AttributeModifier[]::new), this.showInTooltip);
}
public record AttributeModifier(int attribute, ModifierData modifier, int slotType) {
public static final Type<AttributeModifier> TYPE = new Type<>(AttributeModifier.class) {
@@ -23,16 +23,22 @@
package com.viaversion.viaversion.api.minecraft.item.data;
import com.viaversion.nbt.tag.Tag;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.FullMappings;
import com.viaversion.viaversion.api.minecraft.codec.Ops;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.ArrayType;
import com.viaversion.viaversion.util.Copyable;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.Rewritable;
import io.netty.buffer.ByteBuf;
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
import java.util.ArrayList;
import java.util.List;
public record AttributeModifiers1_21(AttributeModifier[] modifiers, boolean showInTooltip) implements Copyable {
public record AttributeModifiers1_21(AttributeModifier[] modifiers, boolean showInTooltip) implements Copyable, Rewritable {
public AttributeModifiers1_21(final AttributeModifier[] modifiers) {
this(modifiers, true);
@@ -101,6 +107,23 @@ public record AttributeModifiers1_21(AttributeModifier[] modifiers, boolean show
return new AttributeModifiers1_21(Copyable.copy(modifiers), showInTooltip);
}
@Override
public AttributeModifiers1_21 rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
final FullMappings mappings = protocol.getMappingData().getAttributeMappings();
if (mappings == null) {
return this;
}
final List<AttributeModifier> modifiers = new ArrayList<>(this.modifiers.length);
for (final AttributeModifier modifier : this.modifiers) {
final int mappedId = clientbound ? mappings.getNewId(modifier.attribute()) : mappings.inverse().getNewId(modifier.attribute());
if (mappedId != -1) {
modifiers.add(new AttributeModifier(mappedId, modifier.modifier(), modifier.slotType(), modifier.display()));
}
}
return new AttributeModifiers1_21(modifiers.toArray(AttributeModifier[]::new), this.showInTooltip);
}
public record AttributeModifier(int attribute, ModifierData modifier, int slotType, Display display) {
private static final String[] EQUIPMENT_SLOT_GROUPS = {"any", "mainhand", "offhand", "hand", "feet", "legs", "chest", "head", "armor", "body", "saddle"};
private static final String[] OPERATION = {"add_value", "add_multiplied_base", "add_multiplied_total"};
@@ -139,6 +139,8 @@ public record Equippable(int equipmentSlot, Holder<SoundEvent> soundEvent, @Null
public Equippable rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
final Holder<SoundEvent> soundEvent = SoundEvent.rewriteHolder(this.soundEvent, Rewritable.soundRewriteFunction(protocol, clientbound));
final Holder<SoundEvent> shearingSound = SoundEvent.rewriteHolder(this.shearingSound, Rewritable.soundRewriteFunction(protocol, clientbound));
return soundEvent == this.soundEvent && shearingSound == this.shearingSound ? this : new Equippable(equipmentSlot, soundEvent, model, cameraOverlay, allowedEntities, dispensable, swappable, damageOnHurt, equipOnInteract, canBeSheared, shearingSound);
final HolderSet allowedEntities = this.allowedEntities != null ? this.allowedEntities.rewrite(Rewritable.entityRewriteFunction(protocol, clientbound)) : null;
return soundEvent == this.soundEvent && shearingSound == this.shearingSound && allowedEntities == this.allowedEntities ? this
: new Equippable(equipmentSlot, soundEvent, model, cameraOverlay, allowedEntities, dispensable, swappable, damageOnHurt, equipOnInteract, canBeSheared, shearingSound);
}
}
@@ -90,7 +90,7 @@ public class ProtocolVersion implements Comparable<ProtocolVersion> {
public static final ProtocolVersion v1_21_4 = register(769, "1.21.4");
public static final ProtocolVersion v1_21_5 = register(770, "1.21.5");
public static final ProtocolVersion v1_21_6 = register(771, "1.21.6");
public static final ProtocolVersion v1_21_7 = register(772, "1.21.7");
public static final ProtocolVersion v1_21_7 = register(772, "1.21.7-1.21.8", new SubVersionRange("1.21", 7, 8));
public static final ProtocolVersion unknown = new ProtocolVersion(VersionType.SPECIAL, -1, -1, "UNKNOWN", null);
static {
@@ -25,7 +25,6 @@ package com.viaversion.viaversion.api.type.types.chunk;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSectionImpl;
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
import com.viaversion.viaversion.api.minecraft.chunks.PaletteType;
import com.viaversion.viaversion.api.type.Type;
import io.netty.buffer.ByteBuf;
@@ -24,7 +24,6 @@ package com.viaversion.viaversion.api.type.types.item;
import com.google.common.base.Preconditions;
import com.viaversion.viaversion.api.data.FullMappings;
import com.viaversion.viaversion.api.data.item.ItemHasher;
import com.viaversion.viaversion.api.minecraft.codec.Ops;
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
@@ -70,6 +70,11 @@ public interface Rewritable {
: (clientbound ? protocol.getMappingData().getSoundMappings()::getNewId : protocol.getMappingData()::getOldSoundId);
}
static Int2IntFunction entityRewriteFunction(final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
return protocol.getMappingData().getEntityMappings() == null ? Int2IntFunction.identity()
: (clientbound ? protocol.getMappingData().getEntityMappings()::getNewId : protocol.getMappingData().getEntityMappings().inverse()::getNewId);
}
static @Nullable String mappedIdentifier(final FullMappings mappings, final String identifier) {
// Check if the original exists before mapping
if (mappings.id(identifier) == -1) {
+1 -1
View File
@@ -8,5 +8,5 @@ repositories {
dependencies {
// version must be manually kept in sync with the one in root project settings.gradle.kts
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.6")
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.8")
}
@@ -18,13 +18,13 @@
package com.viaversion.viaversion.bukkit.util;
import com.viaversion.viaversion.api.Via;
import java.lang.reflect.Method;
import java.util.Random;
import java.util.logging.Level;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.inventory.ItemStack;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.lang.reflect.Method;
import java.util.Random;
import java.util.logging.Level;
public class LegacyBlockToItem {
private static final LegacyBlockToItem INSTANCE;
@@ -106,4 +106,12 @@ public final class PaperViaInjector {
return false;
}
}
public static boolean hasMethod(final Class<?> clazz, final Class<?> returnType, final String method, final Class<?>... params) {
try {
return clazz.getDeclaredMethod(method, params).getReturnType().equals(returnType);
} catch (final NoSuchMethodException e) {
return false;
}
}
}
@@ -25,6 +25,7 @@ import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import com.viaversion.viaversion.bukkit.platform.PaperViaInjector;
import com.viaversion.viaversion.bukkit.util.LegacyBlockToItem;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.provider.PickItemProvider;
import java.lang.reflect.Method;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
@@ -45,12 +46,26 @@ public class BukkitPickItemProvider extends PickItemProvider {
private static final GetStorageContents GET_STORAGE_CONTENT = GetStorageContents.build();
private static final SetInHand SET_IN_HAND = SetInHand.build();
private static final boolean HAS_SPAWN_EGG_METHOD = PaperViaInjector.hasMethod(ItemFactory.class, "getSpawnEgg", EntityType.class);
private static final boolean HAS_SPAWN_EGG_METHOD = PaperViaInjector.hasMethod(ItemFactory.class, Material.class, "getSpawnEgg", EntityType.class);
private static final Method GET_SPAWN_EGG_ITEMSTACK_METHOD;
private static final double BLOCK_RANGE = 4.5 + 1;
private static final double BLOCK_RANGE_SQUARED = BLOCK_RANGE * BLOCK_RANGE;
private static final double ENTITY_RANGE = 3 + 3;
private final ViaVersionPlugin plugin;
static {
if (PaperViaInjector.hasMethod(ItemFactory.class, ItemStack.class, "getSpawnEgg", EntityType.class)) {
try {
GET_SPAWN_EGG_ITEMSTACK_METHOD = ItemFactory.class.getDeclaredMethod("getSpawnEgg", EntityType.class);
} catch (final ReflectiveOperationException e) {
throw new RuntimeException(e);
}
} else {
GET_SPAWN_EGG_ITEMSTACK_METHOD = null;
}
}
public BukkitPickItemProvider(final ViaVersionPlugin plugin) {
this.plugin = plugin;
}
@@ -83,7 +98,7 @@ public class BukkitPickItemProvider extends PickItemProvider {
@Override
public void pickItemFromEntity(final UserConnection connection, final int entityId, final boolean includeData) {
if (!HAS_SPAWN_EGG_METHOD) {
if (!HAS_SPAWN_EGG_METHOD && GET_SPAWN_EGG_ITEMSTACK_METHOD == null) {
return;
}
@@ -102,9 +117,21 @@ public class BukkitPickItemProvider extends PickItemProvider {
return;
}
final Material spawnEggType = Bukkit.getItemFactory().getSpawnEgg(entity.getType());
if (spawnEggType != null) {
pickItem(player, new ItemStack(spawnEggType, 1));
if (GET_SPAWN_EGG_ITEMSTACK_METHOD == null) {
final Material spawnEggType = Bukkit.getItemFactory().getSpawnEgg(entity.getType());
if (spawnEggType != null) {
pickItem(player, new ItemStack(spawnEggType, 1));
}
return;
}
try {
final ItemStack spawnEggItem = (ItemStack) GET_SPAWN_EGG_ITEMSTACK_METHOD.invoke(Bukkit.getItemFactory(), entity.getType());
if (spawnEggItem != null) {
pickItem(player, spawnEggItem);
}
} catch (final ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}, player);
}
@@ -17,8 +17,8 @@
*/
package com.viaversion.viaversion.codec;
import com.viaversion.viaversion.api.minecraft.codec.Ops;
import com.viaversion.viaversion.api.minecraft.codec.CodecContext;
import com.viaversion.viaversion.api.minecraft.codec.Ops;
public abstract class OpsBase implements Ops {
@@ -74,8 +74,9 @@ public final class HashBuilder {
}
public HashBuilder writeString(final CharSequence sequence) {
this.ensureSize(sequence.length());
for (int i = 0; i < sequence.length(); i++) {
final int length = sequence.length();
this.ensureSize(length);
for (int i = 0; i < length; i++) {
this.writeChar(sequence.charAt(i));
}
return this;
@@ -29,8 +29,8 @@ import com.viaversion.viaversion.commands.defaultsubs.DontBugMeSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.DumpSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.ListSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.PPSSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.ReloadSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.PlayerSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.ReloadSubCmd;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -22,7 +22,6 @@ import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.api.command.ViaSubCommand;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -96,6 +96,7 @@ public abstract class AbstractViaConfig extends Config implements ViaVersionConf
private boolean cancelBlockSounds;
private boolean hideScoreboardNumbers;
private boolean fix1_21PlacementRotation;
private boolean cancelSwingInInventory;
protected AbstractViaConfig(final File configFile, final Logger logger) {
super(configFile, logger);
@@ -165,6 +166,7 @@ public abstract class AbstractViaConfig extends Config implements ViaVersionConf
cancelBlockSounds = getBoolean("cancel-block-sounds", true);
hideScoreboardNumbers = getBoolean("hide-scoreboard-numbers", false);
fix1_21PlacementRotation = getBoolean("fix-1_21-placement-rotation", true);
cancelSwingInInventory = getBoolean("cancel-swing-in-inventory", true);
}
private BlockedProtocolVersions loadBlockedProtocolVersions() {
@@ -556,4 +558,9 @@ public abstract class AbstractViaConfig extends Config implements ViaVersionConf
public boolean fix1_21PlacementRotation() {
return fix1_21PlacementRotation;
}
@Override
public boolean cancelSwingInInventory() {
return cancelSwingInInventory;
}
}
@@ -154,27 +154,14 @@ public class UserConnectionImpl implements UserConnection {
}
@Override
public void clearStoredObjects(boolean isServerSwitch) {
if (isServerSwitch) {
storedObjects.values().removeIf(storableObject -> {
if (storableObject.clearOnServerSwitch()) {
storableObject.onRemove();
return true;
}
return false;
});
for (EntityTracker tracker : entityTrackers.values()) {
tracker.clearEntities();
}
} else {
for (StorableObject object : storedObjects.values()) {
object.onRemove();
}
storedObjects.clear();
entityTrackers.clear();
itemHashers.clear();
clientWorlds.clear();
public void clearStoredObjects() {
for (StorableObject object : storedObjects.values()) {
object.onRemove();
}
storedObjects.clear();
entityTrackers.clear();
itemHashers.clear();
clientWorlds.clear();
}
@Override
@@ -32,7 +32,6 @@ import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
import com.viaversion.viaversion.protocols.base.packet.BaseClientboundPacket;
import com.viaversion.viaversion.protocols.base.packet.BasePacketTypesProvider;
import com.viaversion.viaversion.protocols.base.packet.BaseServerboundPacket;
import com.viaversion.viaversion.protocols.v1_8to1_9.Protocol1_8To1_9;
import com.viaversion.viaversion.util.ChatColorUtil;
import com.viaversion.viaversion.util.ComponentUtil;
import io.netty.channel.ChannelFuture;
@@ -38,7 +38,6 @@ import com.viaversion.viaversion.protocols.v1_10to1_11.storage.EntityTracker1_11
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.util.Pair;
public class Protocol1_10To1_11 extends AbstractProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> {
@@ -22,9 +22,9 @@ import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.BlockChangeRecord;
import com.viaversion.viaversion.api.minecraft.BlockPosition;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.BlockPosition;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
@@ -39,11 +39,11 @@ import com.viaversion.viaversion.protocols.v1_13_2to1_14.rewriter.PlayerPacketRe
import com.viaversion.viaversion.protocols.v1_13_2to1_14.rewriter.WorldPacketRewriter1_14;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.storage.EntityTracker1_14;
import com.viaversion.viaversion.rewriter.CommandRewriter;
import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter;
import org.checkerframework.checker.nullness.qual.Nullable;
public class Protocol1_13_2To1_14 extends AbstractProtocol<ClientboundPackets1_13, ClientboundPackets1_14, ServerboundPackets1_13, ServerboundPackets1_14> {
@@ -37,9 +37,9 @@ import com.viaversion.viaversion.protocols.v1_13_2to1_14.Protocol1_13_2To1_14;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ClientboundPackets1_14;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ServerboundPackets1_14;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.storage.EntityTracker1_14;
import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter;
import com.viaversion.viaversion.rewriter.ItemRewriter;
import com.viaversion.viaversion.rewriter.RecipeRewriter;
import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.Key;
import java.util.Set;
@@ -201,6 +201,10 @@ public class EntityPacketRewriter1_16 extends EntityRewriter<ClientboundPackets1
});
protocol.registerServerbound(ServerboundPackets1_16.SWING, wrapper -> {
if (!Via.getConfig().cancelSwingInInventory()) {
return;
}
InventoryTracker1_16 inventoryTracker = wrapper.user().get(InventoryTracker1_16.class);
// Don't send an arm swing if the player has an inventory opened.
if (inventoryTracker.isInventoryOpen()) {
@@ -19,7 +19,6 @@ package com.viaversion.viaversion.protocols.v1_16_3to1_16_4;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
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.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2;
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ServerboundPackets1_16_2;
@@ -21,19 +21,63 @@ import com.google.gson.JsonObject;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.protocols.v1_17to1_17_1.packet.ClientboundPackets1_17_1;
import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter;
import java.util.HashMap;
import java.util.Map;
public final class ComponentRewriter1_18 extends JsonNBTComponentRewriter<ClientboundPackets1_17_1> {
private final Map<String, String> mappings = new HashMap<>();
public ComponentRewriter1_18(final Protocol<ClientboundPackets1_17_1, ?, ?, ?> protocol) {
super(protocol, ReadType.JSON);
mappings.put("commands.scoreboard.objectives.add.longName", "Objective names cannot be longer than %s characters");
mappings.put("commands.team.add.longName", "Team names cannot be longer than %s characters");
mappings.put("biome.minecraft.snowy_mountains", "Snowy Mountains");
mappings.put("biome.minecraft.wooded_mountains", "Wooded Mountains");
mappings.put("biome.minecraft.jungle_edge", "Jungle Edge");
mappings.put("biome.minecraft.dark_forest_hills", "Dark Forest Hills");
mappings.put("biome.minecraft.modified_wooded_badlands_plateau", "Modified Wooded Badlands Plateau");
mappings.put("biome.minecraft.snowy_tundra", "Snowy Tundra");
mappings.put("biome.minecraft.mountain_edge", "Mountain Edge");
mappings.put("biome.minecraft.modified_badlands_plateau", "Modified Badlands Plateau");
mappings.put("biome.minecraft.mushroom_field_shore", "Mushroom Field Shore");
mappings.put("biome.minecraft.tall_birch_forest", "Tall Birch Forest");
mappings.put("biome.minecraft.wooded_hills", "Wooded Hills");
mappings.put("biome.minecraft.taiga_hills", "Taiga Hills");
mappings.put("biome.minecraft.snowy_taiga_mountains", "Snowy Taiga Mountains");
mappings.put("biome.minecraft.deep_warm_ocean", "Deep Warm Ocean");
mappings.put("biome.minecraft.swamp_hills", "Swamp Hills");
mappings.put("biome.minecraft.giant_tree_taiga_hills", "Giant Tree Taiga Hills");
mappings.put("biome.minecraft.tall_birch_hills", "Tall Birch Hills");
mappings.put("biome.minecraft.bamboo_jungle_hills", "Bamboo Jungle Hills");
mappings.put("biome.minecraft.jungle_hills", "Jungle Hills");
mappings.put("biome.minecraft.gravelly_mountains", "Gravelly Mountains");
mappings.put("biome.minecraft.wooded_badlands_plateau", "Wooded Badlands Plateau");
mappings.put("biome.minecraft.shattered_savanna", "Shattered Savanna");
mappings.put("biome.minecraft.desert_hills", "Desert Hills");
mappings.put("biome.minecraft.badlands_plateau", "Badlands Plateau");
mappings.put("biome.minecraft.modified_jungle_edge", "Modified Jungle Edge");
mappings.put("biome.minecraft.giant_spruce_taiga", "Giant Spruce Taiga");
mappings.put("biome.minecraft.stone_shore", "Stone Shore");
mappings.put("biome.minecraft.mountains", "Mountains");
mappings.put("biome.minecraft.giant_tree_taiga", "Giant Tree Taiga");
mappings.put("biome.minecraft.snowy_taiga_hills", "Snowy Taiga Hills");
mappings.put("biome.minecraft.modified_gravelly_mountains", "Gravelly Mountains+");
mappings.put("biome.minecraft.taiga_mountains", "Taiga Mountains");
mappings.put("biome.minecraft.desert_lakes", "Desert Lakes");
mappings.put("biome.minecraft.shattered_savanna_plateau", "Shattered Savanna Plateau");
mappings.put("biome.minecraft.modified_jungle", "Modified Jungle");
mappings.put("biome.minecraft.birch_forest_hills", "Birch Forest Hills");
mappings.put("biome.minecraft.giant_spruce_taiga_hills", "Giant Spruce Taiga Hills");
}
@Override
protected void handleTranslate(final JsonObject object, final String translate) {
if (translate.equals("commands.scoreboard.objectives.add.longName")) {
object.addProperty("translate", "Objective names cannot be longer than %s characters");
} else if (translate.equals("commands.team.add.longName")) {
object.addProperty("translate", "Team names cannot be longer than %s characters");
String mappedTranslation = mappings.get(translate);
if (mappedTranslation != null) {
object.addProperty("translate", mappedTranslation);
}
}
}
@@ -37,9 +37,4 @@ public final class DimensionRegistryStorage implements StorableObject {
public Map<CompoundTag, String> dimensions() {
return dimensions;
}
@Override
public boolean clearOnServerSwitch() {
return false;
}
}
@@ -17,11 +17,9 @@
*/
package com.viaversion.viaversion.protocols.v1_19_1to1_19_3.rewriter;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.rewriter.RecipeRewriter;
@@ -39,9 +39,4 @@ public final class ChatTypeStorage implements StorableObject {
public void clear() {
chatTypes.clear();
}
@Override
public boolean clearOnServerSwitch() {
return false;
}
}
@@ -27,11 +27,11 @@ 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_2;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.Protocol1_20_2To1_20_3;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundConfigurationPackets1_20_2;
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPacket1_20_2;
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPackets1_20_2;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.Protocol1_20_2To1_20_3;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.rewriter.EntityRewriter;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.Key;
@@ -26,7 +26,7 @@ import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.rewriter.RecipeRewrit
import java.util.ArrayList;
import java.util.List;
final class RecipeRewriter1_20_5 <C extends ClientboundPacketType> extends RecipeRewriter1_20_3<C> {
final class RecipeRewriter1_20_5<C extends ClientboundPacketType> extends RecipeRewriter1_20_3<C> {
public RecipeRewriter1_20_5(final Protocol<C, ?, ?, ?> protocol) {
super(protocol);
@@ -114,9 +114,4 @@ public final class AcknowledgedMessagesStorage implements StorableObject {
lastSeenMessages = new BitSet();
delayedAckCount = 0;
}
@Override
public boolean clearOnServerSwitch() {
return false;
}
}
@@ -38,9 +38,4 @@ public final class BannerPatternStorage implements StorableObject {
public @Nullable String pattern(final int id) {
return bannerPatterns.idToKey(id);
}
@Override
public boolean clearOnServerSwitch() {
return false;
}
}
@@ -92,7 +92,7 @@ public final class AttributeModifierMappings1_21 {
}
public static @Nullable String idToName(final String id) {
return ATTRIBUTE_MODIFIER_NAMES.inverse().get(id);
return ATTRIBUTE_MODIFIER_NAMES.inverse().get(Key.stripMinecraftNamespace(id));
}
private static void add(final long msb, final long lsb, final String id) {
@@ -43,7 +43,6 @@ import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.StructuredItemRewriter;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
public final class BlockItemPacketRewriter1_21 extends StructuredItemRewriter<ClientboundPacket1_20_5, ServerboundPacket1_20_5, Protocol1_20_5To1_21> {
@@ -183,10 +182,9 @@ public final class BlockItemPacketRewriter1_21 extends StructuredItemRewriter<Cl
dataContainer.replaceKey(StructuredDataKey.FOOD1_20_5, StructuredDataKey.FOOD1_21);
dataContainer.replace(StructuredDataKey.ATTRIBUTE_MODIFIERS1_20_5, StructuredDataKey.ATTRIBUTE_MODIFIERS1_21, attributeModifiers -> {
final AttributeModifiers1_21.AttributeModifier[] modifiers = Arrays.stream(attributeModifiers.modifiers()).map(modifier -> {
final int mappedAttributeId = Protocol1_20_5To1_21.MAPPINGS.getNewAttributeId(modifier.attribute());
final AttributeModifiers1_20_5.ModifierData modData = modifier.modifier();
final AttributeModifiers1_21.ModifierData updatedModData = new AttributeModifiers1_21.ModifierData(Protocol1_20_5To1_21.mapAttributeUUID(modData.uuid(), modData.name()), modData.amount(), modData.operation());
return new AttributeModifiers1_21.AttributeModifier(mappedAttributeId, updatedModData, modifier.slotType());
return new AttributeModifiers1_21.AttributeModifier(modifier.attribute(), updatedModData, modifier.slotType());
}).toArray(AttributeModifiers1_21.AttributeModifier[]::new);
return new AttributeModifiers1_21(modifiers, attributeModifiers.showInTooltip());
});
@@ -219,11 +217,6 @@ public final class BlockItemPacketRewriter1_21 extends StructuredItemRewriter<Cl
dataContainer.remove(StructuredDataKey.JUKEBOX_PLAYABLE1_21);
dataContainer.replace(StructuredDataKey.ATTRIBUTE_MODIFIERS1_21, StructuredDataKey.ATTRIBUTE_MODIFIERS1_20_5, attributeModifiers -> {
final AttributeModifiers1_20_5.AttributeModifier[] modifiers = Arrays.stream(attributeModifiers.modifiers()).map(modifier -> {
final int mappedAttributeId = Protocol1_20_5To1_21.MAPPINGS.getAttributeMappings().inverse().getNewId(modifier.attribute());
if (mappedAttributeId == -1) {
return null;
}
final AttributeModifiers1_21.ModifierData modData = modifier.modifier();
final String name = AttributeModifierMappings1_21.idToName(modData.id());
final AttributeModifiers1_20_5.ModifierData updatedModData = new AttributeModifiers1_20_5.ModifierData(
@@ -232,8 +225,8 @@ public final class BlockItemPacketRewriter1_21 extends StructuredItemRewriter<Cl
modData.amount(),
modData.operation()
);
return new AttributeModifiers1_20_5.AttributeModifier(mappedAttributeId, updatedModData, modifier.slotType());
}).filter(Objects::nonNull).toArray(AttributeModifiers1_20_5.AttributeModifier[]::new);
return new AttributeModifiers1_20_5.AttributeModifier(modifier.attribute(), updatedModData, modifier.slotType());
}).toArray(AttributeModifiers1_20_5.AttributeModifier[]::new);
return new AttributeModifiers1_20_5(modifiers, attributeModifiers.showInTooltip());
});
}
@@ -91,11 +91,6 @@ public class ConfigurationState implements StorableObject {
queuedJoinGame = true;
}
@Override
public boolean clearOnServerSwitch() {
return false;
}
@Override
public void onRemove() {
for (final QueuedPacket packet : packetQueue) {
@@ -24,8 +24,4 @@ import org.checkerframework.checker.nullness.qual.Nullable;
public record LastResourcePack(String url, String hash, boolean required,
@Nullable JsonElement prompt) implements StorableObject {
@Override
public boolean clearOnServerSwitch() {
return false;
}
}
@@ -19,10 +19,10 @@ package com.viaversion.viaversion.protocols.v1_21_4to1_21_5.storage;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.viaversion.viaversion.api.data.item.ItemHasher;
import com.viaversion.viaversion.api.minecraft.codec.CodecContext;
import com.viaversion.viaversion.api.minecraft.codec.CodecContext.RegistryAccess;
import com.viaversion.viaversion.api.minecraft.codec.hash.Hasher;
import com.viaversion.viaversion.api.data.item.ItemHasher;
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
import com.viaversion.viaversion.codec.CodecRegistryContext;
import com.viaversion.viaversion.codec.hash.HashFunction;
@@ -198,6 +198,11 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
final int teleportId = ThreadLocalRandom.current().nextInt();
wrapper.user().get(TeleportAckCancelStorage.class).cancelTeleportId(teleportId);
final PlayerPositionStorage positionStorage = wrapper.user().get(PlayerPositionStorage.class);
if (positionStorage != null) {
positionStorage.sendPing(wrapper.user(), ThreadLocalRandom.current().nextInt());
}
final PacketWrapper positionPacket = wrapper.create(ClientboundPackets1_21_2.PLAYER_POSITION);
positionPacket.write(Types.VAR_INT, teleportId); // Teleport id
positionPacket.write(Types.DOUBLE, 0D); // X
@@ -260,11 +265,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
bundleStart.send(Protocol1_21To1_21_2.class);
}
final int pingId = ThreadLocalRandom.current().nextInt();
positionStorage.addPendingPong(pingId);
final PacketWrapper ping = wrapper.create(ClientboundPackets1_21_2.PING);
ping.write(Types.INT, pingId); // id
ping.send(Protocol1_21To1_21_2.class);
positionStorage.sendPing(wrapper.user(), ThreadLocalRandom.current().nextInt());
wrapper.send(Protocol1_21To1_21_2.class);
wrapper.cancel();
@@ -396,6 +397,9 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
final boolean onGround = wrapper.get(Types.BOOLEAN, 0);
playerPositionStorage.setPlayerPosition(new PlayerPositionStorage.PlayerPosition(x, y, z, yaw, pitch, onGround));
wrapper.cancel();
} else if (wrapper.user().get(TeleportAckCancelStorage.class).checkShouldCancelPlayerPositionPacket()) {
// Cancel the position packet after a "fake" teleport
wrapper.cancel();
}
});
protocol.registerServerbound(ServerboundPackets1_21_2.MOVE_PLAYER_ROT, wrapper -> {
@@ -428,17 +432,22 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
}
});
protocol.registerServerbound(ServerboundPackets1_21_2.ACCEPT_TELEPORTATION, wrapper -> {
final TeleportAckCancelStorage teleportAckCancelStorage = wrapper.user().get(TeleportAckCancelStorage.class);
final PlayerPositionStorage playerPositionStorage = wrapper.user().get(PlayerPositionStorage.class);
final int teleportId = wrapper.passthrough(Types.VAR_INT); // Teleport id
if (teleportAckCancelStorage.checkShouldCancelTeleportAck(teleportId)) {
wrapper.cancel();
if (playerPositionStorage != null && playerPositionStorage.checkHasPlayerPosition()) {
playerPositionStorage.reset(); // No longer need to send the player position packet, because this was a "fake" teleport
teleportAckCancelStorage.checkShouldCancelPlayerPositionPacket(); // Clear the flag
}
return;
}
if (playerPositionStorage != null && playerPositionStorage.checkHasPlayerPosition()) {
// Send move player after accept teleportation
wrapper.sendToServer(Protocol1_21To1_21_2.class);
wrapper.cancel();
playerPositionStorage.sendMovePlayerPosRot(wrapper.user());
return;
}
final int teleportId = wrapper.passthrough(Types.VAR_INT); // Teleport id
if (wrapper.user().get(TeleportAckCancelStorage.class).checkShouldCancelTeleportAck(teleportId)) {
wrapper.cancel();
}
});
}
@@ -20,7 +20,7 @@ package com.viaversion.viaversion.protocols.v1_21to1_21_2.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
public final class ClientVehicleStorage implements StorableObject {
private final int vehicleId;
private float sidewaysMovement;
@@ -23,6 +23,7 @@ import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.Protocol1_21To1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
@@ -32,10 +33,13 @@ public class PlayerPositionStorage implements StorableObject {
private boolean captureNextPlayerPositionPacket;
private PlayerPosition playerPosition;
public void addPendingPong(final int id) {
public void sendPing(final UserConnection connection, final int id) {
if (!this.pendingPongs.add(id)) {
throw new IllegalStateException("Pong already pending for id " + id);
}
final PacketWrapper ping = PacketWrapper.create(ClientboundPackets1_21_2.PING, connection);
ping.write(Types.INT, id); // id
ping.send(Protocol1_21To1_21_2.class);
}
public boolean checkPong(final int id) {
@@ -83,7 +87,7 @@ public class PlayerPositionStorage implements StorableObject {
this.reset();
}
private void reset() {
public void reset() {
this.captureNextPlayerPositionPacket = false;
this.playerPosition = null;
}
@@ -24,9 +24,23 @@ import it.unimi.dsi.fastutil.ints.IntSet;
public class TeleportAckCancelStorage implements StorableObject {
private final IntSet cancelTeleportIds = new IntOpenHashSet();
private boolean cancelNextPlayerPositionPacket;
public boolean checkShouldCancelTeleportAck(final int teleportId) {
return this.cancelTeleportIds.remove(teleportId);
final boolean shouldCancel = this.cancelTeleportIds.remove(teleportId);
if (shouldCancel) {
this.cancelNextPlayerPositionPacket = true;
}
return shouldCancel;
}
public boolean checkShouldCancelPlayerPositionPacket() {
if (this.cancelNextPlayerPositionPacket) {
this.cancelNextPlayerPositionPacket = false;
return true;
} else {
return false;
}
}
public void cancelTeleportId(final int teleportId) {
@@ -19,7 +19,6 @@ package com.viaversion.viaversion.protocols.v1_8to1_9;
import com.google.gson.JsonElement;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.platform.providers.ViaProviders;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
@@ -298,7 +298,7 @@ public class EntityPacketRewriter1_9 extends EntityRewriter<ClientboundPackets1_
}
properties.put(key, new Pair<>(value, modifiers));
}
properties.put("generic.attackSpeed", new Pair<>(20.0, ImmutableList.of( // Neutralize modifiers
new Triple<>(UUID.fromString("FA233E1C-4180-4865-B01B-BCCE9785ACA3"), 0.0, (byte) 0), // Tool and weapon modifier
new Triple<>(UUID.fromString("AF8B6E3F-3328-4C0A-AA36-5BA2BB9DBEF3"), 0.0, (byte) 2), // Dig speed
@@ -110,8 +110,7 @@ public class SpawnPacketRewriter1_9 {
List<EntityData> entityData = new ArrayList<>();
Item item = new DataItem(373, (byte) 1, (short) data, null); // Potion
protocol.getItemRewriter().handleItemToClient(wrapper.user(), item); // Rewrite so that it gets the right nbt
// TEMP FIX FOR POTIONS UNTIL WE FIGURE OUT HOW TO TRANSFORM SENT PACKETS
EntityData potion = new EntityData(5, EntityDataTypes1_9.ITEM, item);
EntityData potion = new EntityData(6, EntityDataTypes1_9.ITEM, item); // Would be 5, except Vanilla uses the wrong entity class when registering
entityData.add(potion);
wrapper1.write(Types.ENTITY_DATA_LIST1_9, entityData);
});
@@ -20,7 +20,6 @@ package com.viaversion.viaversion.protocols.v1_8to1_9.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.minecraft.BlockFace;
import com.viaversion.viaversion.api.minecraft.BlockPosition;
import com.viaversion.viaversion.api.minecraft.ChunkPosition;
import com.viaversion.viaversion.api.minecraft.chunks.BaseChunk;
@@ -150,14 +149,20 @@ public class WorldPacketRewriter1_9 {
// Unload the empty chunks
if (Via.getConfig().isChunkBorderFix()) {
for (BlockFace face : BlockFace.HORIZONTAL) {
int chunkX = chunk.getX() + face.modX();
int chunkZ = chunk.getZ() + face.modZ();
if (!clientWorld.getLoadedChunks().contains(ChunkPosition.chunkKey(chunkX, chunkZ))) {
PacketWrapper unloadChunk = wrapper.create(ClientboundPackets1_9.FORGET_LEVEL_CHUNK);
unloadChunk.write(Types.INT, chunkX);
unloadChunk.write(Types.INT, chunkZ);
unloadChunk.send(Protocol1_8To1_9.class);
for (int modX = -1; modX <= 1; modX++) {
for (int modZ = -1; modZ <= 1; modZ++) {
if (modX == 0 && modZ == 0) {
continue; // Skip the center chunk
}
int chunkX = chunk.getX() + modX;
int chunkZ = chunk.getZ() + modZ;
if (!clientWorld.getLoadedChunks().contains(ChunkPosition.chunkKey(chunkX, chunkZ))) {
PacketWrapper unloadChunk = wrapper.create(ClientboundPackets1_9.FORGET_LEVEL_CHUNK);
unloadChunk.write(Types.INT, chunkX);
unloadChunk.write(Types.INT, chunkZ);
unloadChunk.send(Protocol1_8To1_9.class);
}
}
}
}
@@ -169,14 +174,20 @@ public class WorldPacketRewriter1_9 {
// Send empty chunks surrounding the loaded chunk to force 1.9+ clients to render the new chunk
if (Via.getConfig().isChunkBorderFix()) {
for (BlockFace face : BlockFace.HORIZONTAL) {
int chunkX = chunk.getX() + face.modX();
int chunkZ = chunk.getZ() + face.modZ();
if (!clientWorld.getLoadedChunks().contains(ChunkPosition.chunkKey(chunkX, chunkZ))) {
PacketWrapper emptyChunk = wrapper.create(ClientboundPackets1_9.LEVEL_CHUNK);
Chunk c = new BaseChunk(chunkX, chunkZ, true, false, 0, new ChunkSection[16], new int[256], new ArrayList<>());
emptyChunk.write(chunkType, c);
emptyChunk.send(Protocol1_8To1_9.class);
for (int modX = -1; modX <= 1; modX++) {
for (int modZ = -1; modZ <= 1; modZ++) {
if (modX == 0 && modZ == 0) {
continue; // Skip the center chunk
}
int chunkX = chunk.getX() + modX;
int chunkZ = chunk.getZ() + modZ;
if (!clientWorld.getLoadedChunks().contains(ChunkPosition.chunkKey(chunkX, chunkZ))) {
PacketWrapper emptyChunk = wrapper.create(ClientboundPackets1_9.LEVEL_CHUNK);
Chunk c = new BaseChunk(chunkX, chunkZ, true, false, 0, new ChunkSection[16], new int[256], new ArrayList<>());
emptyChunk.write(chunkType, c);
emptyChunk.send(Protocol1_8To1_9.class);
}
}
}
}
@@ -196,12 +207,23 @@ public class WorldPacketRewriter1_9 {
chunkData.send(Protocol1_8To1_9.class);
clientWorld.getLoadedChunks().add(ChunkPosition.chunkKey(chunk.getX(), chunk.getZ()));
}
// Send empty chunks surrounding the loaded chunk to force 1.9+ clients to render the new chunk
if (Via.getConfig().isChunkBorderFix()) {
for (BlockFace face : BlockFace.HORIZONTAL) {
int chunkX = chunk.getX() + face.modX();
int chunkZ = chunk.getZ() + face.modZ();
if (!Via.getConfig().isChunkBorderFix()) {
return;
}
// Send empty chunks surrounding the loaded chunk to force 1.9+ clients to render the new chunk
// We do this after the bulk to prevent packet spam, as the bulk might already send surrounding chunks
for (Chunk chunk : chunks) {
for (int modX = -1; modX <= 1; modX++) {
for (int modZ = -1; modZ <= 1; modZ++) {
if (modX == 0 && modZ == 0) {
continue; // Skip the center chunk
}
int chunkX = chunk.getX() + modX;
int chunkZ = chunk.getZ() + modZ;
if (!clientWorld.getLoadedChunks().contains(ChunkPosition.chunkKey(chunkX, chunkZ))) {
PacketWrapper emptyChunk = wrapper.create(ClientboundPackets1_9.LEVEL_CHUNK);
Chunk c = new BaseChunk(chunkX, chunkZ, true, false, 0, new ChunkSection[16], new int[256], new ArrayList<>());
@@ -300,7 +322,7 @@ public class WorldPacketRewriter1_9 {
Item item = Via.getManager().getProviders().get(HandItemProvider.class).getHandItem(wrapper.user());
// Blocking patch for 1.9-1.21.3 clients
if (Via.getConfig().isShieldBlocking() &&
wrapper.user().getProtocolInfo().protocolVersion().olderThan(ProtocolVersion.v1_21_4)) {
wrapper.user().getProtocolInfo().protocolVersion().olderThan(ProtocolVersion.v1_21_4)) {
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
// Check if the shield is already there or if we have to give it here
@@ -191,7 +191,7 @@ public class EntityTracker1_9 extends EntityTrackerBase {
byte data = (byte) entityData.getValue();
// If sword blocking is done through consumables (1.21.4+), don't add a shield.
if (entityId != getProvidedEntityId() && Via.getConfig().isShieldBlocking()
&& user().getProtocolInfo().protocolVersion().olderThan(ProtocolVersion.v1_21_4)) {
&& user().getProtocolInfo().protocolVersion().olderThan(ProtocolVersion.v1_21_4)) {
if ((data & 0x10) == 0x10) {
if (validBlocking.contains(entityId)) {
Item shield = new DataItem(442, (byte) 1, (short) 0, null);
@@ -22,8 +22,8 @@ import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.IntTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.minecraft.BlockPosition;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
@@ -23,18 +23,19 @@ import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
import com.viaversion.viaversion.api.minecraft.chunks.PaletteType;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_9;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.protocol.remapper.ValueTransformer;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_9_3;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_3to1_10.rewriter.EntityPacketRewriter1_10;
import com.viaversion.viaversion.protocols.v1_9_3to1_10.rewriter.ItemPacketRewriter1_10;
import com.viaversion.viaversion.protocols.v1_9_3to1_10.storage.ResourcePackTracker;
import java.util.List;
public class Protocol1_9_3To1_10 extends AbstractProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> {
@@ -44,17 +45,7 @@ public class Protocol1_9_3To1_10 extends AbstractProtocol<ClientboundPackets1_9_
return inputValue / 63.0F;
}
};
public static final ValueTransformer<List<EntityData>, List<EntityData>> TRANSFORM_ENTITY_DATA = new ValueTransformer<>(Types.ENTITY_DATA_LIST1_9) {
@Override
public List<EntityData> transform(PacketWrapper wrapper, List<EntityData> inputValue) {
for (EntityData data : inputValue) {
if (data.id() >= 5) {
data.setId(data.id() + 1);
}
}
return inputValue;
}
};
private final EntityPacketRewriter1_10 entityRewriter = new EntityPacketRewriter1_10(this);
private final ItemPacketRewriter1_10 itemRewriter = new ItemPacketRewriter1_10(this);
public Protocol1_9_3To1_10() {
@@ -63,7 +54,7 @@ public class Protocol1_9_3To1_10 extends AbstractProtocol<ClientboundPackets1_9_
@Override
protected void registerPackets() {
itemRewriter.register();
super.registerPackets();
// Named sound effect
registerClientbound(ClientboundPackets1_9_3.CUSTOM_SOUND, new PacketHandlers() {
@@ -98,50 +89,6 @@ public class Protocol1_9_3To1_10 extends AbstractProtocol<ClientboundPackets1_9_
}
});
// Entity data packet
registerClientbound(ClientboundPackets1_9_3.SET_ENTITY_DATA, new PacketHandlers() {
@Override
public void register() {
map(Types.VAR_INT); // 0 - Entity ID
map(Types.ENTITY_DATA_LIST1_9, TRANSFORM_ENTITY_DATA); // 1 - Entity data list
}
});
// Spawn Mob
registerClientbound(ClientboundPackets1_9_3.ADD_MOB, new PacketHandlers() {
@Override
public void register() {
map(Types.VAR_INT); // 0 - Entity id
map(Types.UUID); // 1 - UUID
map(Types.UNSIGNED_BYTE); // 2 - Entity Type
map(Types.DOUBLE); // 3 - X
map(Types.DOUBLE); // 4 - Y
map(Types.DOUBLE); // 5 - Z
map(Types.BYTE); // 6 - Yaw
map(Types.BYTE); // 7 - Pitch
map(Types.BYTE); // 8 - Head Pitch
map(Types.SHORT); // 9 - Velocity X
map(Types.SHORT); // 10 - Velocity Y
map(Types.SHORT); // 11 - Velocity Z
map(Types.ENTITY_DATA_LIST1_9, TRANSFORM_ENTITY_DATA); // 12 - Entity data
}
});
// Spawn Player
registerClientbound(ClientboundPackets1_9_3.ADD_PLAYER, new PacketHandlers() {
@Override
public void register() {
map(Types.VAR_INT); // 0 - Entity ID
map(Types.UUID); // 1 - Player UUID
map(Types.DOUBLE); // 2 - X
map(Types.DOUBLE); // 3 - Y
map(Types.DOUBLE); // 4 - Z
map(Types.BYTE); // 5 - Yaw
map(Types.BYTE); // 6 - Pitch
map(Types.ENTITY_DATA_LIST1_9, TRANSFORM_ENTITY_DATA); // 7 - Entity data list
}
});
// Join Game
registerClientbound(ClientboundPackets1_9_3.LOGIN, new PacketHandlers() {
@Override
@@ -232,6 +179,7 @@ public class Protocol1_9_3To1_10 extends AbstractProtocol<ClientboundPackets1_9_
@Override
public void init(UserConnection userConnection) {
addEntityTracker(userConnection, new EntityTrackerBase(userConnection, EntityTypes1_9.EntityType.PLAYER));
userConnection.addClientWorld(this.getClass(), new ClientWorld());
userConnection.put(new ResourcePackTracker());
@@ -241,4 +189,9 @@ public class Protocol1_9_3To1_10 extends AbstractProtocol<ClientboundPackets1_9_
public ItemPacketRewriter1_10 getItemRewriter() {
return itemRewriter;
}
@Override
public EntityPacketRewriter1_10 getEntityRewriter() {
return entityRewriter;
}
}
@@ -0,0 +1,97 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2025 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.viaversion.protocols.v1_9_3to1_10.rewriter;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_9;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_3to1_10.Protocol1_9_3To1_10;
import com.viaversion.viaversion.rewriter.EntityRewriter;
import java.util.List;
public class EntityPacketRewriter1_10 extends EntityRewriter<ClientboundPackets1_9_3, Protocol1_9_3To1_10> {
public EntityPacketRewriter1_10(Protocol1_9_3To1_10 protocol) {
super(protocol);
}
@Override
protected void registerPackets() {
protocol.registerClientbound(ClientboundPackets1_9_3.ADD_ENTITY, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Entity id
wrapper.passthrough(Types.UUID); // UUID
wrapper.passthrough(Types.BYTE); // Type
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
wrapper.passthrough(Types.BYTE); // Pitch
wrapper.passthrough(Types.BYTE); // Yaw
wrapper.passthrough(Types.INT); // Data
objectTrackerHandler().handle(wrapper);
});
protocol.registerClientbound(ClientboundPackets1_9_3.ADD_MOB, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT);
wrapper.passthrough(Types.UUID); // UUID
final short entityType = wrapper.passthrough(Types.UNSIGNED_BYTE);
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
wrapper.passthrough(Types.BYTE); // Yaw
wrapper.passthrough(Types.BYTE); // Pitch
wrapper.passthrough(Types.BYTE); // Head Pitch
wrapper.passthrough(Types.SHORT); // Velocity X
wrapper.passthrough(Types.SHORT); // Velocity Y
wrapper.passthrough(Types.SHORT); // Velocity Z
final List<EntityData> entityDataList = wrapper.passthrough(Types.ENTITY_DATA_LIST1_9);
trackAndRewrite(wrapper, entityType, entityId);
handleEntityData(entityId, entityDataList, wrapper.user());
});
protocol.registerClientbound(ClientboundPackets1_9_3.ADD_PLAYER, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT);
wrapper.passthrough(Types.UUID); // Player UUID
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
wrapper.passthrough(Types.BYTE); // Yaw
wrapper.passthrough(Types.BYTE); // Pitch
final List<EntityData> entityDataList = wrapper.passthrough(Types.ENTITY_DATA_LIST1_9);
tracker(wrapper.user()).addEntity(entityId, EntityTypes1_9.EntityType.PLAYER);
handleEntityData(entityId, entityDataList, wrapper.user());
});
registerSetEntityData(ClientboundPackets1_9_3.SET_ENTITY_DATA, Types.ENTITY_DATA_LIST1_9);
registerRemoveEntities(ClientboundPackets1_9_3.REMOVE_ENTITIES);
}
@Override
protected void registerRewrites() {
// The item data slot was created via the wrong entity type class, using an index of 6 instead of 5 for the item
filter().type(EntityTypes1_9.EntityType.POTION).removeIndex(5);
filter().addIndex(5); // No gravity
}
@Override
public EntityTypes1_9.EntityType typeFromId(int type) {
return EntityTypes1_9.EntityType.findById(type);
}
@Override
public EntityTypes1_9.EntityType objectTypeFromId(int type, int data) {
return EntityTypes1_9.ObjectType.getEntityType(type, data);
}
}
@@ -300,6 +300,7 @@ public abstract class ComponentRewriterBase<C extends ClientboundPacketType> imp
return;
}
handleAttributeModifiers(componentsTag);
handleWrittenBookContents(connection, componentsTag);
handleContainerContents(connection, componentsTag);
handleItemArrayContents(connection, componentsTag, "bundle_contents");
@@ -310,6 +311,31 @@ public abstract class ComponentRewriterBase<C extends ClientboundPacketType> imp
}
}
protected void handleAttributeModifiers(final CompoundTag tag) {
if (protocol.getMappingData().getAttributeMappings() == null) {
return;
}
final ListTag<CompoundTag> attributeModifiers = TagUtil.getNamespacedCompoundTagList(tag, "attribute_modifiers");
if (attributeModifiers == null) {
return;
}
attributeModifiers.getValue().removeIf(attributeTag -> {
final StringTag typeTag = attributeTag.getStringTag("type");
if (typeTag == null) {
return false;
}
final String mappedId = protocol.getMappingData().getAttributeMappings().mappedIdentifier(typeTag.getValue());
if (mappedId != null) {
typeTag.setValue(mappedId);
return false;
}
return true;
});
}
protected void handleContainerContents(final UserConnection connection, final CompoundTag tag) {
final ListTag<CompoundTag> container = TagUtil.getNamespacedCompoundTagList(tag, "container");
if (container == null) {
@@ -26,7 +26,6 @@ import com.viaversion.viaversion.api.minecraft.item.data.ChatType;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.util.TagUtil;
/**
* Rewrites nbt serialized components from 1.21.5 upwards. Can also handle json components outside of hover events.
@@ -170,6 +170,9 @@ hide-scoreboard-numbers: false
# Fixes 1.21+ clients on 1.20.5 servers placing water/lava buckets at the wrong location when moving fast, NOTE: This may cause issues with anti-cheat plugins.
fix-1_21-placement-rotation: true
#
# If enabled, cancel swing packets sent while having an inventory opened on 1.15.2 and below servers. This can cause false positives with anti-cheat plugins.
cancel-swing-in-inventory: true
#
#----------------------------------------------------------#
# 1.9+ CLIENTS ON 1.8 SERVERS OPTIONS #
#----------------------------------------------------------#
+4 -4
View File
@@ -1,9 +1,9 @@
# Project properties - we put these here so they can be modified without causing a recompile of the build scripts
projectVersion=5.4.1
projectVersion=5.4.2
# Smile emoji
mcVersions=1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 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.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9
mcVersionRange=1.8-1.21.6
# Smile emoji (note that modrinth may not have added the version on release yet)
mcVersions=1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 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.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9
mcVersionRange=1.8-1.21.8
velocityVersion=3.4
# Gradle properties
+6 -6
View File
@@ -2,9 +2,9 @@ metadata.format.version = "1.1"
[versions]
gson = "2.12.1"
gson = "2.13.1"
fastutil = "8.5.15"
vianbt = "5.1.0"
vianbt = "5.1.2"
mcstructs = "5-3.1.1-SNAPSHOT"
# Common provided
@@ -12,15 +12,15 @@ netty = "4.0.20.Final"
guava = "17.0"
snakeYaml = "2.2"
junit = "5.11.4"
platformLauncher = "1.12.2"
checkerQual = "3.49.1"
junit = "5.13.3"
platformLauncher = "1.13.3"
checkerQual = "3.49.5"
# Platforms
paper = "1.20.4-R0.1-SNAPSHOT"
legacyBukkit = "1.8.8-R0.1-SNAPSHOT"
velocity = "3.1.1"
viaProxy = "3.4.3-SNAPSHOT"
viaProxy = "3.4.4-SNAPSHOT"
[libraries]
+6 -2
View File
@@ -15,11 +15,15 @@ pluginManagement {
// default plugin versions
plugins {
id("net.kyori.blossom") version "2.1.0"
id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.10"
id("com.gradleup.shadow") version "8.3.6"
id("org.jetbrains.gradle.plugin.idea-ext") version "1.2"
id("com.gradleup.shadow") version "8.3.8"
}
}
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}
rootProject.name = "viaversion-parent"
includeBuild("build-logic")
+1 -1
View File
@@ -1,5 +1,5 @@
plugins {
id("io.papermc.hangar-publish-plugin") version "0.1.2"
id("io.papermc.hangar-publish-plugin") version "0.1.3"
id("com.modrinth.minotaur") version "2.+"
}