mirror of
https://github.com/ViaVersion/ViaVersion.git
synced 2026-11-04 17:00:06 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c316de042 | ||
|
|
8ee5d7e680 | ||
|
|
64c128d414 | ||
|
|
77d11fc593 | ||
|
|
2c72a09809 | ||
|
|
3dbd81da76 | ||
|
|
a0116c7ea7 | ||
|
|
fd5dadbe01 | ||
|
|
df87a02c38 | ||
|
|
bb293b3e5d | ||
|
|
ff03892b25 | ||
|
|
eb51306d82 | ||
|
|
81eb3362f3 | ||
|
|
7f06b03453 | ||
|
|
c16432de2a | ||
|
|
b162dbdff0 | ||
|
|
dfbe57e304 | ||
|
|
6f6dc2c641 | ||
|
|
06990ec0c9 |
No files matched your search
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+25
-1
@@ -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) {
|
||||
|
||||
+24
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
-1
@@ -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;
|
||||
|
||||
-1
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+32
-5
@@ -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
|
||||
|
||||
-1
@@ -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;
|
||||
|
||||
-1
@@ -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> {
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -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> {
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+4
@@ -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()) {
|
||||
|
||||
-1
@@ -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;
|
||||
|
||||
+48
-4
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
-5
@@ -37,9 +37,4 @@ public final class DimensionRegistryStorage implements StorableObject {
|
||||
public Map<CompoundTag, String> dimensions() {
|
||||
return dimensions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean clearOnServerSwitch() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
-2
@@ -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;
|
||||
|
||||
|
||||
-5
@@ -39,9 +39,4 @@ public final class ChatTypeStorage implements StorableObject {
|
||||
public void clear() {
|
||||
chatTypes.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean clearOnServerSwitch() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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;
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
-5
@@ -114,9 +114,4 @@ public final class AcknowledgedMessagesStorage implements StorableObject {
|
||||
lastSeenMessages = new BitSet();
|
||||
delayedAckCount = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean clearOnServerSwitch() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
-5
@@ -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;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+3
-10
@@ -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());
|
||||
});
|
||||
}
|
||||
|
||||
-5
@@ -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) {
|
||||
|
||||
-4
@@ -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;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+19
-10
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+6
-2
@@ -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;
|
||||
}
|
||||
|
||||
+15
-1
@@ -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) {
|
||||
|
||||
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-2
@@ -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);
|
||||
});
|
||||
|
||||
+45
-23
@@ -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
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+11
-58
@@ -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;
|
||||
}
|
||||
}
|
||||
+97
@@ -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);
|
||||
}
|
||||
}
|
||||
+26
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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,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.+"
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user