mirror of
https://github.com/ViaVersion/ViaVersion.git
synced 2026-11-04 08:52:10 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c09fa331c6
|
||
|
|
0088f657e7
|
||
|
|
0f95f7cbaf | ||
|
|
e607988751 | ||
|
|
d05985fdb3 | ||
|
|
2bb90d32da | ||
|
|
e59c12cf62 | ||
|
|
1f6103aa9b | ||
|
|
00bb773c4a | ||
|
|
b4d8fe6ba1 | ||
|
|
cab919bfaf | ||
|
|
9d9fe03317 | ||
|
|
8fd09c8ba4 | ||
|
|
4802926441 | ||
|
|
5628bcbb83 | ||
|
|
33062af729 | ||
|
|
f32dca9b56 | ||
|
|
a09fa97f42 | ||
|
|
08100010c7 | ||
|
|
9a8a01b753 |
No files matched your search
@@ -0,0 +1 @@
|
||||
.gitea/CODEOWNERS linguist-detectable=false
|
||||
@@ -0,0 +1,3 @@
|
||||
# Pull requests request review from the eligible staff team(s).
|
||||
# One approval from either an Admin or Developer satisfies branch protection.
|
||||
* @trueog/Admins @trueog/Developers
|
||||
@@ -24,6 +24,7 @@ package com.viaversion.viaversion.api.data.entity;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.util.KeyMappings;
|
||||
import java.util.Map;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
@@ -210,4 +211,8 @@ public interface EntityTracker {
|
||||
@Nullable DimensionData dimensionData(int dimensionId);
|
||||
|
||||
void setDimensions(Map<String, DimensionData> dimensions);
|
||||
|
||||
@Nullable KeyMappings registryKeys(String registryKey);
|
||||
|
||||
void addRegistryKeys(String registryKey, KeyMappings mappings);
|
||||
}
|
||||
@@ -22,6 +22,7 @@
|
||||
*/
|
||||
package com.viaversion.viaversion.api.minecraft.codec;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.MappingData;
|
||||
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
|
||||
import com.viaversion.viaversion.api.protocol.Protocol;
|
||||
@@ -35,8 +36,12 @@ public interface CodecContext {
|
||||
|
||||
boolean isSupported(StructuredDataKey<?> key);
|
||||
|
||||
UserConnection connection();
|
||||
|
||||
interface RegistryAccess {
|
||||
|
||||
UserConnection connection();
|
||||
|
||||
Key item(int id);
|
||||
|
||||
Key attributeModifier(int id);
|
||||
@@ -67,8 +72,8 @@ public interface CodecContext {
|
||||
*/
|
||||
int id(MappingData.MappingType mappingType, String identifier);
|
||||
|
||||
static RegistryAccess of(final Protocol<?, ?, ?, ?> protocol) {
|
||||
return new RegistryAccessImpl(protocol);
|
||||
static RegistryAccess of(final Protocol<?, ?, ?, ?> protocol, final UserConnection connection) {
|
||||
return new RegistryAccessImpl(protocol, connection);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+19
-10
@@ -23,31 +23,40 @@
|
||||
package com.viaversion.viaversion.api.minecraft.codec;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.FullMappings;
|
||||
import com.viaversion.viaversion.api.data.MappingData;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.protocol.Protocol;
|
||||
import com.viaversion.viaversion.api.rewriter.RegistryDataRewriter;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
import com.viaversion.viaversion.util.KeyMappings;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
final class RegistryAccessImpl implements CodecContext.RegistryAccess {
|
||||
private final RegistryDataRewriter registryDataRewriter;
|
||||
private final EntityTracker entityTracker;
|
||||
private final MappingData mappingData;
|
||||
private final UserConnection connection;
|
||||
private final boolean mapped;
|
||||
|
||||
RegistryAccessImpl(final Protocol<?, ?, ?, ?> protocol) {
|
||||
this.mappingData = protocol.getMappingData();
|
||||
this.registryDataRewriter = protocol.getRegistryDataRewriter();
|
||||
RegistryAccessImpl(final Protocol<?, ?, ?, ?> protocol, final UserConnection connection) {
|
||||
this.mappingData = Preconditions.checkNotNull(protocol.getMappingData());
|
||||
this.entityTracker = Preconditions.checkNotNull(protocol.getEntityRewriter().tracker(connection));
|
||||
this.connection = connection;
|
||||
this.mapped = false;
|
||||
}
|
||||
|
||||
private RegistryAccessImpl(final MappingData mappingData, final RegistryDataRewriter registryDataRewriter, final boolean mapped) {
|
||||
private RegistryAccessImpl(final MappingData mappingData, final UserConnection connection, final EntityTracker entityTracker, final boolean mapped) {
|
||||
this.mappingData = mappingData;
|
||||
this.registryDataRewriter = registryDataRewriter;
|
||||
this.connection = connection;
|
||||
this.entityTracker = entityTracker;
|
||||
this.mapped = mapped;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserConnection connection() {
|
||||
return connection;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key item(final int id) {
|
||||
return key(mappingData.getFullItemMappings(), id);
|
||||
@@ -91,8 +100,8 @@ final class RegistryAccessImpl implements CodecContext.RegistryAccess {
|
||||
|
||||
@Override
|
||||
public Key registryKey(final String registry, final int id) {
|
||||
final KeyMappings mappings = registryDataRewriter.getMappings(registry);
|
||||
Preconditions.checkNotNull(mappings, "No registry mappings for registry: " + registry);
|
||||
final KeyMappings mappings = entityTracker.registryKeys(registry);
|
||||
Preconditions.checkNotNull(mappings, "No registry mappings for registry: %s", registry);
|
||||
final String identifier = id >= 0 && id < mappings.size() ? mappings.idToKey(id) : null;
|
||||
return key(identifier, id);
|
||||
}
|
||||
@@ -108,6 +117,6 @@ final class RegistryAccessImpl implements CodecContext.RegistryAccess {
|
||||
|
||||
@Override
|
||||
public CodecContext.RegistryAccess withMapped(final boolean mapped) {
|
||||
return this.mapped == mapped ? this : new RegistryAccessImpl(this.mappingData, this.registryDataRewriter, mapped);
|
||||
return this.mapped == mapped ? this : new RegistryAccessImpl(this.mappingData, this.connection, this.entityTracker, mapped);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -122,7 +122,7 @@ public record BlocksAttacks(
|
||||
.writeOptional("disable_cooldown_scale", Types.FLOAT, value.disableCooldownScale(), 1F)
|
||||
.writeOptional("damage_reductions", DamageReduction.ARRAY_TYPE, value.damageReductions(), defaultDamageReductions)
|
||||
.writeOptional("item_damage", ItemDamageFunction.TYPE, value.itemDamage(), defaultItemDamage)
|
||||
.writeOptional("bypassed_by", Types.HOLDER_SET, value.bypassedBy())
|
||||
.writeOptional("bypassed_by", new HolderSetType(RegistryKey.of("damage_type")), value.bypassedBy())
|
||||
.writeOptional("block_sound", Types.SOUND_EVENT, value.blockSound())
|
||||
.writeOptional("disabled_sound", Types.SOUND_EVENT, value.disableSound()));
|
||||
}
|
||||
|
||||
+5
@@ -74,6 +74,11 @@ public interface PacketTypesProvider<CU extends ClientboundPacketType, CM extend
|
||||
return map != null ? map.typeByName(typeName) : null;
|
||||
}
|
||||
|
||||
default @Nullable CM mappedClientboundType(final State state, final String typeName) {
|
||||
PacketTypeMap<CM> map = mappedClientboundPacketTypes().get(state);
|
||||
return map != null ? map.typeByName(typeName) : null;
|
||||
}
|
||||
|
||||
default @Nullable SU unmappedServerboundType(final State state, final String typeName) {
|
||||
PacketTypeMap<SU> map = unmappedServerboundPacketTypes().get(state);
|
||||
return map != null ? map.typeByName(typeName) : null;
|
||||
|
||||
@@ -25,19 +25,22 @@ package com.viaversion.viaversion.api.rewriter;
|
||||
import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.util.KeyMappings;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public interface RegistryDataRewriter {
|
||||
|
||||
void handle(PacketWrapper wrapper);
|
||||
|
||||
@Nullable
|
||||
KeyMappings getMappings(String registryKey);
|
||||
|
||||
boolean shouldRemoveRegistry(String registryKey);
|
||||
|
||||
boolean hasRegistriesToRemove();
|
||||
|
||||
void updateDialog(UserConnection connection, CompoundTag tag);
|
||||
|
||||
/**
|
||||
* Sends registries that had additional entries configured, but weren't sent by the server at all
|
||||
* by the time finish_configuration was sent to the client.
|
||||
*
|
||||
* @param connection the user connection
|
||||
*/
|
||||
void sendMissingRegistries(final UserConnection connection);
|
||||
}
|
||||
@@ -26,10 +26,10 @@ import com.viaversion.viaversion.api.minecraft.codec.Ops;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public abstract class OptionalType<T> extends Type<T> {
|
||||
public class OptionalType<T> extends Type<T> {
|
||||
private final Type<T> type;
|
||||
|
||||
protected OptionalType(final Type<T> type) {
|
||||
public OptionalType(final Type<T> type) {
|
||||
super(type.getOutputClass());
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
plugins {
|
||||
base
|
||||
eclipse
|
||||
id("via.build-logic")
|
||||
}
|
||||
|
||||
|
||||
@@ -267,8 +267,8 @@ public class ViaManagerImpl implements ViaManager {
|
||||
platform.getLogger().warning("ViaVersion no longer officially supports this version of Java, only offering unsupported compatibility builds.");
|
||||
platform.getLogger().warning("See https://github.com/ViaVersion/ViaVersion/releases/tag/5.0.0 for more information.");
|
||||
} else if (version < 21) {
|
||||
platform.getLogger().warning("Please update your Java runtime to at least Java 21 (your version is " + javaVersion + ").");
|
||||
platform.getLogger().warning("At some point in the future, ViaVersion will no longer be compatible with this version of Java.");
|
||||
// platform.getLogger().warning("Please update your Java runtime to at least Java 21 (your version is " + javaVersion + ").");
|
||||
// platform.getLogger().warning("At some point in the future, ViaVersion will no longer be compatible with this version of Java.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
package com.viaversion.viaversion.codec;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.codec.CodecContext;
|
||||
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
|
||||
import com.viaversion.viaversion.api.protocol.Protocol;
|
||||
@@ -48,4 +49,9 @@ public record CodecRegistryContext(Protocol<?, ?, ?, ?> protocol, RegistryAccess
|
||||
final VersionedTypesHolder types = mapped ? protocol.mappedTypes() : protocol.types();
|
||||
return (NOT_IMPLEMENTED.isEmpty() || !NOT_IMPLEMENTED.contains(key)) && types.structuredDataKeys().supportsOps(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserConnection connection() {
|
||||
return registryAccess.connection();
|
||||
}
|
||||
}
|
||||
@@ -27,14 +27,17 @@ import com.viaversion.viaversion.api.data.entity.StoredEntityData;
|
||||
import com.viaversion.viaversion.api.data.entity.TrackedEntity;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
import com.viaversion.viaversion.util.KeyMappings;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public class EntityTrackerBase implements EntityTracker, ClientEntityIdChangeListener {
|
||||
protected final Int2ObjectMap<TrackedEntity> entities = new Int2ObjectOpenHashMap<>();
|
||||
private final Map<String, KeyMappings> registryKeyMappings = new HashMap<>();
|
||||
private final UserConnection connection;
|
||||
private final EntityType playerType;
|
||||
private Integer clientEntityId;
|
||||
@@ -115,6 +118,7 @@ public class EntityTrackerBase implements EntityTracker, ClientEntityIdChangeLis
|
||||
}
|
||||
|
||||
clientEntityId = null;
|
||||
registryKeyMappings.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -222,4 +226,14 @@ public class EntityTrackerBase implements EntityTracker, ClientEntityIdChangeLis
|
||||
public void setDimensions(Map<String, DimensionData> dimensions) {
|
||||
this.dimensions = dimensions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable KeyMappings registryKeys(String registryKey) {
|
||||
return registryKeyMappings.get(Key.stripMinecraftNamespace(registryKey));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addRegistryKeys(String registryKey, KeyMappings mappings) {
|
||||
registryKeyMappings.put(Key.stripMinecraftNamespace(registryKey), mappings);
|
||||
}
|
||||
}
|
||||
@@ -47,7 +47,7 @@ public class ItemHasherBase implements ItemHasher {
|
||||
private final CodecContext mappedContext;
|
||||
|
||||
public ItemHasherBase(final Protocol<?, ?, ?, ?> protocol, final UserConnection connection) {
|
||||
final RegistryAccess registryAccess = RegistryAccess.of(protocol);
|
||||
final RegistryAccess registryAccess = RegistryAccess.of(protocol, connection);
|
||||
this.context = new CodecRegistryContext(protocol, registryAccess, false);
|
||||
this.mappedContext = new CodecRegistryContext(protocol, registryAccess, true);
|
||||
this.connection = connection;
|
||||
|
||||
+2
-2
@@ -109,7 +109,7 @@ public record RegistrationContext<CU extends ClientboundPacketType, SU extends S
|
||||
return false;
|
||||
}
|
||||
|
||||
private SU serverboundPacketType(final ServerboundPacketType genericPacketType) {
|
||||
public SU serverboundPacketType(final ServerboundPacketType genericPacketType) {
|
||||
final SU type = protocol.getPacketTypesProvider().unmappedServerboundType(genericPacketType.state(), genericPacketType.getName());
|
||||
if (type == null) {
|
||||
throw new IllegalArgumentException("Could not find serverbound packet type for " + genericPacketType.state() + " " + genericPacketType.getName());
|
||||
@@ -117,7 +117,7 @@ public record RegistrationContext<CU extends ClientboundPacketType, SU extends S
|
||||
return type;
|
||||
}
|
||||
|
||||
private CU clientboundPacketType(final ClientboundPacketType genericPacketType) {
|
||||
public CU clientboundPacketType(final ClientboundPacketType genericPacketType) {
|
||||
final CU type = protocol.getPacketTypesProvider().unmappedClientboundType(genericPacketType.state(), genericPacketType.getName());
|
||||
if (type == null) {
|
||||
throw new IllegalArgumentException("Could not find clientbound packet type for " + genericPacketType.state() + " " + genericPacketType.getName() + " in " + protocol.getClass().getSimpleName());
|
||||
|
||||
+2
-7
@@ -67,13 +67,11 @@ final class EntityRegistrations {
|
||||
|
||||
static <CU extends ClientboundPacketType> void registerEntityPackets1_21_4(final RegistrationContext<CU, ?> ctx, final EntityRewriter<CU, ?> er) {
|
||||
common1_20_5(ctx, er);
|
||||
registerGameModeTrackers1_21_4(ctx, er);
|
||||
ctx.clientbound(ClientboundPackets1_21_2.ADD_ENTITY, er::registerTrackerWithData1_19);
|
||||
}
|
||||
|
||||
static <CU extends ClientboundPacketType> void registerEntityPackets1_21_9(final RegistrationContext<CU, ?> ctx, final EntityRewriter<CU, ?> er) {
|
||||
common1_20_5(ctx, er);
|
||||
registerGameModeTrackers1_21_4(ctx, er);
|
||||
ctx.clientbound(ClientboundPackets1_21_9.ADD_ENTITY, er::registerTrackerWithData1_21_9);
|
||||
}
|
||||
|
||||
@@ -82,11 +80,8 @@ final class EntityRegistrations {
|
||||
ctx.clientbound(ClientboundPackets1_20_5.REMOVE_ENTITIES, er::registerRemoveEntities);
|
||||
ctx.clientbound(ClientboundPackets1_20_5.LOGIN, er::registerLogin1_20_5);
|
||||
ctx.clientbound(ClientboundPackets1_20_5.RESPAWN, er::registerRespawn1_20_5);
|
||||
}
|
||||
|
||||
private static <CU extends ClientboundPacketType> void registerGameModeTrackers1_21_4(final RegistrationContext<CU, ?> ctx, final EntityRewriter<CU, ?> er) {
|
||||
ctx.clientbound(ClientboundPackets1_21_2.GAME_EVENT, er::registerGameEvent);
|
||||
ctx.clientbound(ClientboundPackets1_21_2.PLAYER_ABILITIES, er::registerPlayerAbilities);
|
||||
ctx.clientbound(ClientboundPackets1_20_5.GAME_EVENT, er::registerGameEvent);
|
||||
ctx.clientbound(ClientboundPackets1_20_5.PLAYER_ABILITIES, er::registerPlayerAbilities);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -135,7 +135,7 @@ final class ItemRegistrations {
|
||||
ctx.clientbound(ClientboundPackets1_21.UPDATE_ADVANCEMENTS, ir::registerAdvancements1_20_3);
|
||||
ctx.clientbound(ClientboundPackets1_21.COOLDOWN, ir::registerCooldown);
|
||||
ctx.serverbound(ServerboundPackets1_20_5.CONTAINER_CLICK, ir::registerContainerClick1_17_1);
|
||||
ctx.serverbound(ServerboundPackets1_20_5.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot);
|
||||
ctx.serverbound(ServerboundPackets1_20_5.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot1_20_5);
|
||||
ctx.clientbound(ClientboundPackets1_21.SET_EQUIPMENT, ir::registerSetEquipment);
|
||||
ctx.clientbound(ClientboundPackets1_21.OPEN_SCREEN, ir::registerOpenScreen);
|
||||
ctx.clientbound(ClientboundPackets1_21.MERCHANT_OFFERS, ir::registerMerchantOffers1_20_5);
|
||||
@@ -147,7 +147,7 @@ final class ItemRegistrations {
|
||||
ctx.clientbound(ClientboundPackets1_21_2.UPDATE_ADVANCEMENTS, ir::registerAdvancements1_20_3);
|
||||
ctx.clientbound(ClientboundPackets1_21_2.COOLDOWN, ir::registerCooldown1_21_2);
|
||||
ctx.serverbound(ServerboundPackets1_21_2.CONTAINER_CLICK, ir::registerContainerClick1_21_2);
|
||||
ctx.serverbound(ServerboundPackets1_21_2.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot);
|
||||
ctx.serverbound(ServerboundPackets1_21_2.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot1_20_5);
|
||||
ctx.clientbound(ClientboundPackets1_21_2.SET_EQUIPMENT, ir::registerSetEquipment);
|
||||
ctx.clientbound(ClientboundPackets1_21_2.OPEN_SCREEN, ir::registerOpenScreen);
|
||||
ctx.clientbound(ClientboundPackets1_21_2.MERCHANT_OFFERS, ir::registerMerchantOffers1_20_5);
|
||||
|
||||
+8
-2
@@ -21,6 +21,7 @@ import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
|
||||
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
|
||||
import com.viaversion.viaversion.api.protocol.packet.State;
|
||||
import com.viaversion.viaversion.api.rewriter.RegistryDataRewriter;
|
||||
import com.viaversion.viaversion.protocol.shared_registration.PacketBound;
|
||||
import com.viaversion.viaversion.protocol.shared_registration.RegistrationContext;
|
||||
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundConfigurationPackets1_20_2;
|
||||
@@ -51,8 +52,13 @@ public final class ConfigurationRegistrations {
|
||||
PacketBound.ADDED_AT_MIN
|
||||
);
|
||||
|
||||
ctx.clientbound(ClientboundConfigurationPackets1_20_2.FINISH_CONFIGURATION,
|
||||
packetType -> ctx.protocol().registerClientbound(packetType, wrapper -> wrapper.user().getProtocolInfo().setServerState(State.PLAY)),
|
||||
ctx.clientbound(ClientboundConfigurationPackets1_20_2.FINISH_CONFIGURATION, packetType -> ctx.protocol().registerClientbound(packetType, wrapper -> {
|
||||
final RegistryDataRewriter registryDataRewriter = ctx.protocol().getRegistryDataRewriter();
|
||||
if (registryDataRewriter != null) {
|
||||
registryDataRewriter.sendMissingRegistries(wrapper.user());
|
||||
}
|
||||
wrapper.user().getProtocolInfo().setServerState(State.PLAY);
|
||||
}),
|
||||
PacketBound.ADDED_AT_MIN
|
||||
);
|
||||
}
|
||||
|
||||
+8
-1
@@ -87,7 +87,7 @@ public class ParticleIdMappings1_13 {
|
||||
add(16); // (43->16) endrod -> minecraft:end_rod
|
||||
add(7); // (44->7) damageindicator -> minecraft:damage_indicator
|
||||
add(40); // (45->40) sweepattack -> minecraft:sweep_attack
|
||||
add(20, blockHandler()); // (46->20) fallingdust -> minecraft:falling_dust
|
||||
add(20, blockHandler(160, 95)); // (46->20) fallingdust -> minecraft:falling_dust
|
||||
// BlockState VarInt The ID of the block state.
|
||||
add(41); // (47->41) totem -> minecraft:totem_of_undying
|
||||
add(38); // (48->38) spit -> minecraft:spit
|
||||
@@ -148,8 +148,15 @@ public class ParticleIdMappings1_13 {
|
||||
|
||||
// Handle (id+(data<<12)) encoded blocks
|
||||
private static ParticleDataHandler blockHandler() {
|
||||
return blockHandler(-1, -1);
|
||||
}
|
||||
|
||||
private static ParticleDataHandler blockHandler(int fromBlockId, int toBlockId) {
|
||||
return (particle, data) -> {
|
||||
int value = data[0];
|
||||
if ((value & 4095) == fromBlockId) {
|
||||
value = value & ~4095 | toBlockId;
|
||||
}
|
||||
int combined = (((value & 4095) << 4) | (value >> 12 & 15));
|
||||
int newId = WorldPacketRewriter1_13.toNewId(combined);
|
||||
|
||||
|
||||
+5
-5
@@ -41,15 +41,15 @@ public class SkullHandler implements BlockEntityProvider.BlockEntityHandler {
|
||||
|
||||
int id = storage.get(position).getOriginal();
|
||||
if (id >= SKULL_WALL_START && id <= SKULL_END) {
|
||||
NumberTag rot = tag.getNumberTag("Rot");
|
||||
if (rot != null) {
|
||||
id += rot.asInt() & 0xF;
|
||||
}
|
||||
|
||||
NumberTag skullType = tag.getNumberTag("SkullType");
|
||||
if (skullType != null) {
|
||||
id += skullType.asInt() * 20;
|
||||
}
|
||||
|
||||
NumberTag rot = tag.getNumberTag("Rot");
|
||||
if (rot != null) {
|
||||
id += rot.asInt();
|
||||
}
|
||||
} else {
|
||||
Protocol1_12_2To1_13.LOGGER.warning("Why does this block have the skull block entity? " + tag);
|
||||
return -1;
|
||||
|
||||
+2
@@ -38,6 +38,8 @@ public final class ComponentRewriter1_17 extends JsonNBTComponentRewriter<Client
|
||||
mappings.put("commands.replaceitem.block.success", "commands.item.block.set.success");
|
||||
mappings.put("commands.debug.reportSaved", "Created debug report in %s");
|
||||
mappings.put("commands.debug.reportFailed", "Failed to create debug report");
|
||||
mappings.put("commands.locate.success", "The nearest %s is at %s (%s blocks away)");
|
||||
mappings.put("commands.locatebiome.success", "The nearest %s is at %s (%s blocks away)");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+14
@@ -73,6 +73,20 @@ public final class Protocol1_19_3To1_19_4 extends AbstractProtocol<ClientboundPa
|
||||
};
|
||||
replaceClientbound(ClientboundPackets1_19_3.COMMANDS, commandRewriter::handle1_19);
|
||||
|
||||
registerClientbound(ClientboundPackets1_19_3.UPDATE_MOB_EFFECT, wrapper -> {
|
||||
wrapper.passthrough(Types.VAR_INT); // entity id
|
||||
wrapper.passthrough(Types.VAR_INT); // effect id
|
||||
wrapper.passthrough(Types.BYTE); // amplifier
|
||||
|
||||
int duration = wrapper.read(Types.VAR_INT);
|
||||
|
||||
if (duration >= Short.MAX_VALUE) { // Anything at or above this would display as infinite on 1.19.2 and below, and on 1.19.4+, infinite is -1
|
||||
wrapper.write(Types.VAR_INT, -1);
|
||||
} else {
|
||||
wrapper.write(Types.VAR_INT, duration);
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(ClientboundPackets1_19_3.SERVER_DATA, wrapper -> {
|
||||
JsonElement element = wrapper.read(Types.OPTIONAL_COMPONENT);
|
||||
if (element != null) {
|
||||
|
||||
+8
@@ -142,6 +142,14 @@ public final class EntityPacketRewriter1_20 extends EntityRewriter<ClientboundPa
|
||||
registerEntityDataTypeHandler(Types1_20.ENTITY_DATA_TYPES.itemType, Types1_20.ENTITY_DATA_TYPES.blockStateType, Types1_20.ENTITY_DATA_TYPES.optionalBlockStateType, Types1_20.ENTITY_DATA_TYPES.particleType, null);
|
||||
registerBlockStateHandler(EntityTypes1_19_4.ABSTRACT_MINECART, 11);
|
||||
|
||||
// Purpur's Rainglow patch adds a non-vanilla SQUID_COLOR (String) accessor on GlowSquid,
|
||||
// declared right after DATA_DARK_TICKS_REMAINING, so the server emits it at source index 17.
|
||||
// AGEABLE_WATER_CREATURE.addIndex(16) in v1_21To1_21_2 later shifts it to index 18, where
|
||||
// 1.21.11+ clients only allocate 18 slots (max valid index 17) and crash with
|
||||
// ArrayIndexOutOfBoundsException: Index 18 out of bounds for length 18. Drop at source.
|
||||
// Vanilla 1.19.4 GlowSquid has no slot 17, so this is safe for non-Purpur servers.
|
||||
filter().type(EntityTypes1_19_4.GLOW_SQUID).cancel(17);
|
||||
|
||||
// Rotate item display by 180 degrees around the Y axis
|
||||
filter().type(EntityTypes1_19_4.ITEM_DISPLAY).handler((event, data) -> {
|
||||
if (event.trackedEntity().hasSentEntityData() || event.hasExtraData()) {
|
||||
|
||||
+12
-3
@@ -344,6 +344,15 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
|
||||
recipeRewriter.handleRecipeType(wrapper, type);
|
||||
}
|
||||
});
|
||||
|
||||
protocol.replaceServerbound(ServerboundPackets1_20_5.SET_CREATIVE_MODE_SLOT, wrapper -> {
|
||||
if (!protocol.getEntityRewriter().tracker(wrapper.user()).canInstaBuild()) {
|
||||
wrapper.cancel();
|
||||
return;
|
||||
}
|
||||
wrapper.passthrough(Types.SHORT); // Slot
|
||||
wrapper.write(itemType(), handleItemToServer(wrapper.user(), wrapper.read(mappedItemType())));
|
||||
});
|
||||
}
|
||||
|
||||
public Item handleNonEmptyItemToClient(final UserConnection connection, @Nullable Item item) {
|
||||
@@ -1076,7 +1085,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
|
||||
}
|
||||
|
||||
private void updateEffects(final ListTag<CompoundTag> effects, final StructuredDataContainer data) {
|
||||
final SuspiciousStewEffect[] suspiciousStewEffects = new SuspiciousStewEffect[effects.size()];
|
||||
final List<SuspiciousStewEffect> suspiciousStewEffects = new ArrayList<>();
|
||||
for (int i = 0; i < effects.size(); i++) {
|
||||
final CompoundTag effect = effects.get(i);
|
||||
final String effectIdString = effect.getString("id", "luck");
|
||||
@@ -1087,10 +1096,10 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
|
||||
effectId,
|
||||
duration
|
||||
);
|
||||
suspiciousStewEffects[i] = stewEffect;
|
||||
suspiciousStewEffects.add(stewEffect);
|
||||
}
|
||||
}
|
||||
data.set(StructuredDataKey.SUSPICIOUS_STEW_EFFECTS, suspiciousStewEffects);
|
||||
data.set(StructuredDataKey.SUSPICIOUS_STEW_EFFECTS, suspiciousStewEffects.toArray(SuspiciousStewEffect[]::new));
|
||||
}
|
||||
|
||||
private void updateLodestoneTracker(final boolean tracked, final CompoundTag lodestonePosTag, final String lodestoneDimension, final StructuredDataContainer data) {
|
||||
|
||||
+14
-3
@@ -278,7 +278,9 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
|
||||
storage.clear();
|
||||
|
||||
final byte gamemode = wrapper.get(Types.BYTE, 0);
|
||||
sendRangeAttributes(wrapper.user(), gamemode == GameMode.CREATIVE.id());
|
||||
final boolean creativeMode = gamemode == GameMode.CREATIVE.id();
|
||||
sendRangeAttributes(wrapper.user(), creativeMode);
|
||||
tracker(wrapper.user()).setInstaBuild(creativeMode);
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -293,7 +295,9 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
|
||||
wrapper.passthrough(Types.LONG); // Seed
|
||||
|
||||
final byte gamemode = wrapper.passthrough(Types.BYTE);
|
||||
sendRangeAttributes(wrapper.user(), gamemode == GameMode.CREATIVE.id());
|
||||
final boolean creativeMode = gamemode == GameMode.CREATIVE.id();
|
||||
sendRangeAttributes(wrapper.user(), creativeMode);
|
||||
tracker(wrapper.user()).setInstaBuild(creativeMode);
|
||||
|
||||
wrapper.user().put(new ScoreboardTeamStorage());
|
||||
});
|
||||
@@ -338,7 +342,14 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
|
||||
|
||||
// Resend attributes either with their original list or with the creative range modifier added
|
||||
final int value = (int) Math.floor(wrapper.passthrough(Types.FLOAT) + 0.5F);
|
||||
sendRangeAttributes(wrapper.user(), value == GameMode.CREATIVE.id());
|
||||
final boolean creativeMode = value == GameMode.CREATIVE.id();
|
||||
sendRangeAttributes(wrapper.user(), creativeMode);
|
||||
tracker(wrapper.user()).setInstaBuild(creativeMode);
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_20_3.PLAYER_ABILITIES, wrapper -> {
|
||||
final byte flags = wrapper.passthrough(Types.BYTE);
|
||||
tracker(wrapper.user()).setInstaBuild((flags & 1 << 3) != 0);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+5
-1
@@ -34,6 +34,8 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public class ConfigurationState implements StorableObject {
|
||||
|
||||
private static final int MAX_SERVERBOUND_QUEUED_PACKETS = Integer.getInteger("viaversion.maxQueuedServerboundConfigPackets", 1000);
|
||||
private static final int MAX_SERVERBOUND_QUEUED_BYTES = Integer.getInteger("viaversion.maxQueuedServerboundConfigPacketBytes", 1048576);
|
||||
private static final QueuedPacket[] EMPTY_PACKET_ARRAY = new QueuedPacket[0];
|
||||
private final List<QueuedPacket> packetQueue = new ArrayList<>();
|
||||
private BridgePhase bridgePhase = BridgePhase.NONE;
|
||||
@@ -42,6 +44,7 @@ public class ConfigurationState implements StorableObject {
|
||||
private CompoundTag lastDimensionRegistry;
|
||||
private ClientInformation clientInformation;
|
||||
private int queuedServerboundBytes;
|
||||
private int queuedServerboundPackets;
|
||||
|
||||
public BridgePhase bridgePhase() {
|
||||
return bridgePhase;
|
||||
@@ -78,10 +81,11 @@ public class ConfigurationState implements StorableObject {
|
||||
public void addServerboundPacketToQueue(final PacketWrapper wrapper) {
|
||||
final QueuedPacket queued = toQueuedPacket(wrapper, false, false);
|
||||
final int bytes = queued.buf().readableBytes();
|
||||
if (packetQueue.size() > 5000 || queuedServerboundBytes + bytes > 2097152) {
|
||||
if (queuedServerboundPackets >= MAX_SERVERBOUND_QUEUED_PACKETS || queuedServerboundBytes + bytes > MAX_SERVERBOUND_QUEUED_BYTES) {
|
||||
wrapper.user().disconnect("Sent too many packets during config phase");
|
||||
return;
|
||||
}
|
||||
queuedServerboundPackets++;
|
||||
queuedServerboundBytes += bytes;
|
||||
packetQueue.add(queued);
|
||||
}
|
||||
|
||||
+9
-3
@@ -93,7 +93,10 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol<ClientboundPac
|
||||
appendClientbound(ClientboundConfigurationPackets1_21_9.FINISH_CONFIGURATION, wrapper -> {
|
||||
final PacketWrapper clocksPacket = wrapper.create(ClientboundConfigurationPackets1_21_9.REGISTRY_DATA);
|
||||
clocksPacket.write(Types.STRING, "world_clock");
|
||||
clocksPacket.write(Types.REGISTRY_ENTRY_ARRAY, new RegistryEntry[]{new RegistryEntry("minecraft:overworld", new CompoundTag())});
|
||||
clocksPacket.write(Types.REGISTRY_ENTRY_ARRAY, new RegistryEntry[]{
|
||||
new RegistryEntry("minecraft:overworld", new CompoundTag()),
|
||||
new RegistryEntry("minecraft:the_end", new CompoundTag())
|
||||
});
|
||||
clocksPacket.send(Protocol1_21_11To26_1.class);
|
||||
|
||||
sendSoundVariants(wrapper, "cat_sound_variant", MAPPINGS.catSoundVariants());
|
||||
@@ -198,6 +201,9 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol<ClientboundPac
|
||||
spearDamageType.putString("scaling", "when_caused_by_living_non_player");
|
||||
registryDataRewriter.addEntries("damage_type", new RegistryEntry("spear", spearDamageType));
|
||||
|
||||
final CompoundTag temperateChicken = new CompoundTag();
|
||||
temperateChicken.putString("asset_id", "entity/chicken/chicken_temperate");
|
||||
temperateChicken.putString("baby_asset_id", "entity/chicken/chicken_temperate_baby");
|
||||
final CompoundTag coldChicken = new CompoundTag();
|
||||
coldChicken.putString("asset_id", "entity/chicken/chicken_cold");
|
||||
coldChicken.putString("baby_asset_id", "entity/chicken/chicken_cold_baby");
|
||||
@@ -205,7 +211,7 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol<ClientboundPac
|
||||
final CompoundTag warmChicken = new CompoundTag();
|
||||
warmChicken.putString("asset_id", "entity/chicken/chicken_warm");
|
||||
warmChicken.putString("baby_asset_id", "entity/chicken/chicken_warm_baby");
|
||||
registryDataRewriter.addEntries("chicken_variant", new RegistryEntry("cold", coldChicken), new RegistryEntry("warm", warmChicken));
|
||||
registryDataRewriter.addEntries("chicken_variant", new RegistryEntry("temperate", temperateChicken), new RegistryEntry("cold", coldChicken), new RegistryEntry("warm", warmChicken));
|
||||
|
||||
final CompoundTag ponderGoatHornInstrument = new CompoundTag();
|
||||
final CompoundTag ponderGoatHornDescription = new CompoundTag();
|
||||
@@ -214,7 +220,7 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol<ClientboundPac
|
||||
ponderGoatHornInstrument.putString("sound_event", "item.goat_horn.sound.0");
|
||||
ponderGoatHornInstrument.putFloat("use_duration", 7F);
|
||||
ponderGoatHornInstrument.putFloat("range", 256F);
|
||||
registryDataRewriter.addEntries("instrument", new RegistryEntry("spear", ponderGoatHornInstrument));
|
||||
registryDataRewriter.addEntries("instrument", new RegistryEntry("ponder_goat_horn", ponderGoatHornInstrument));
|
||||
|
||||
addJukeboxPlayables("11", "13", "5", "blocks", "cat", "chirp", "far", "mall", "mellohi", "otherside", "pigstep", "relic", "stal", "strad", "wait", "ward", "creator", "creator_music_box", "lava_chicken", "tears", "precipice");
|
||||
addTrimMaterials("quartz", "iron", "netherite", "redstone", "copper", "gold", "emerald", "diamond", "lapis", "amethyst", "resin");
|
||||
|
||||
+14
-14
@@ -77,17 +77,17 @@ public final class BlockItemPacketRewriter26_1 extends StructuredItemRewriter<Cl
|
||||
|
||||
@Override
|
||||
protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer container) {
|
||||
upgradeData(protocol, protocol.types().structuredDataKeys(), container);
|
||||
upgradeData(protocol, connection, protocol.types().structuredDataKeys(), container);
|
||||
super.handleItemDataComponentsToClient(connection, item, container);
|
||||
}
|
||||
|
||||
public static void upgradeData(final Protocol<?, ?, ?, ?> protocol, final StructuredDataKeys1_21_11 dataKeys, final StructuredDataContainer container) {
|
||||
container.replace(StructuredDataKey.JUKEBOX_PLAYABLE1_21_5, StructuredDataKey.JUKEBOX_PLAYABLE26_1, jukeboxPlayable -> upgradeHolder(protocol, jukeboxPlayable.song(), "jukebox_song"));
|
||||
container.replace(StructuredDataKey.INSTRUMENT1_21_5, StructuredDataKey.INSTRUMENT26_1, instrument -> upgradeHolder(protocol, instrument, "instrument"));
|
||||
container.replace(StructuredDataKey.PROVIDES_TRIM_MATERIAL1_21_5, StructuredDataKey.PROVIDES_TRIM_MATERIAL26_1, providesTrimMaterial -> upgradeHolder(protocol, providesTrimMaterial.material(), "trim_material"));
|
||||
container.replace(StructuredDataKey.CHICKEN_VARIANT1_21_5, StructuredDataKey.CHICKEN_VARIANT26_1, chickenVariant -> upgradeEitherVariant(protocol, chickenVariant, "chicken_variant"));
|
||||
container.replace(StructuredDataKey.ZOMBIE_NAUTILUS_VARIANT1_21_11, StructuredDataKey.ZOMBIE_NAUTILUS_VARIANT26_1, nautilusVariant -> upgradeEitherVariant(protocol, nautilusVariant, "zombie_nautilus_variant"));
|
||||
container.replace(StructuredDataKey.DAMAGE_TYPE1_21_11, StructuredDataKey.DAMAGE_TYPE26_1, damageType -> upgradeEitherVariant(protocol, damageType.id(), "damage_type"));
|
||||
public static void upgradeData(final Protocol<?, ?, ?, ?> protocol, final UserConnection connection, final StructuredDataKeys1_21_11 dataKeys, final StructuredDataContainer container) {
|
||||
container.replace(StructuredDataKey.JUKEBOX_PLAYABLE1_21_5, StructuredDataKey.JUKEBOX_PLAYABLE26_1, jukeboxPlayable -> upgradeHolder(protocol, connection, jukeboxPlayable.song(), "jukebox_song"));
|
||||
container.replace(StructuredDataKey.INSTRUMENT1_21_5, StructuredDataKey.INSTRUMENT26_1, instrument -> upgradeHolder(protocol, connection, instrument, "instrument"));
|
||||
container.replace(StructuredDataKey.PROVIDES_TRIM_MATERIAL1_21_5, StructuredDataKey.PROVIDES_TRIM_MATERIAL26_1, providesTrimMaterial -> upgradeHolder(protocol, connection, providesTrimMaterial.material(), "trim_material"));
|
||||
container.replace(StructuredDataKey.CHICKEN_VARIANT1_21_5, StructuredDataKey.CHICKEN_VARIANT26_1, chickenVariant -> upgradeEitherVariant(protocol, connection, chickenVariant, "chicken_variant"));
|
||||
container.replace(StructuredDataKey.ZOMBIE_NAUTILUS_VARIANT1_21_11, StructuredDataKey.ZOMBIE_NAUTILUS_VARIANT26_1, nautilusVariant -> upgradeEitherVariant(protocol, connection, nautilusVariant, "zombie_nautilus_variant"));
|
||||
container.replace(StructuredDataKey.DAMAGE_TYPE1_21_11, StructuredDataKey.DAMAGE_TYPE26_1, damageType -> upgradeEitherVariant(protocol, connection, damageType.id(), "damage_type"));
|
||||
container.replace(StructuredDataKey.PROVIDES_BANNER_PATTERNS1_21_5, StructuredDataKey.PROVIDES_BANNER_PATTERNS26_1, key -> new ProvidesBannerPatterns(HolderSet.of(key.original())));
|
||||
container.replace(StructuredDataKey.DAMAGE_RESISTANT1_21_2, StructuredDataKey.DAMAGE_RESISTANT26_1, damageResistant -> new DamageResistant26_1(HolderSet.of(damageResistant.typesTagKey().original())));
|
||||
container.replaceKey(StructuredDataKey.BLOCKS_ATTACKS1_21_5, StructuredDataKey.BLOCKS_ATTACKS26_1);
|
||||
@@ -103,20 +103,20 @@ public final class BlockItemPacketRewriter26_1 extends StructuredItemRewriter<Cl
|
||||
}
|
||||
}
|
||||
|
||||
private static @Nullable Integer upgradeEitherVariant(final Protocol<?, ?, ?, ?> protocol, final Either<Integer, String> eitherHolder, final String registry) {
|
||||
return eitherHolder.isLeft() ? eitherHolder.left() : registryIdOrNull(protocol, registry, eitherHolder.right());
|
||||
private static @Nullable Integer upgradeEitherVariant(final Protocol<?, ?, ?, ?> protocol, final UserConnection connection, final Either<Integer, String> eitherHolder, final String registry) {
|
||||
return eitherHolder.isLeft() ? eitherHolder.left() : registryIdOrNull(protocol, connection, registry, eitherHolder.right());
|
||||
}
|
||||
|
||||
private static <T> @Nullable Holder<T> upgradeHolder(final Protocol<?, ?, ?, ?> protocol, final EitherHolder<T> eitherHolder, final String registry) {
|
||||
private static <T> @Nullable Holder<T> upgradeHolder(final Protocol<?, ?, ?, ?> protocol, final UserConnection connection, final EitherHolder<T> eitherHolder, final String registry) {
|
||||
if (eitherHolder.hasHolder()) {
|
||||
return eitherHolder.holder();
|
||||
}
|
||||
final Integer id = registryIdOrNull(protocol, registry, eitherHolder.key());
|
||||
final Integer id = registryIdOrNull(protocol, connection, registry, eitherHolder.key());
|
||||
return id != null ? Holder.of((int) id) : null;
|
||||
}
|
||||
|
||||
private static @Nullable Integer registryIdOrNull(final Protocol<?, ?, ?, ?> protocol, final String registry, final String key) {
|
||||
final int id = protocol.getRegistryDataRewriter().getMappings(registry).keyToId(key);
|
||||
private static @Nullable Integer registryIdOrNull(final Protocol<?, ?, ?, ?> protocol, final UserConnection connection, final String registry, final String key) {
|
||||
final int id = protocol.getEntityRewriter().tracker(connection).registryKeys(registry).keyToId(key);
|
||||
return id != -1 ? id : null;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -197,7 +197,7 @@ public final class Protocol1_21_4To1_21_5 extends AbstractProtocol<ClientboundPa
|
||||
@Override
|
||||
public void init(final UserConnection connection) {
|
||||
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_4.PLAYER));
|
||||
connection.addItemHasher(this.getClass(), new ItemHashStorage1_21_5(this));
|
||||
connection.addItemHasher(this.getClass(), new ItemHashStorage1_21_5(this, connection));
|
||||
connection.put(new MessageIndexStorage());
|
||||
}
|
||||
|
||||
|
||||
+13
@@ -88,6 +88,19 @@ public final class EntityPacketRewriter1_21_5 extends EntityRewriter<Clientbound
|
||||
wrapper.user().get(MessageIndexStorage.class).setIndex(0);
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.UPDATE_MOB_EFFECT, wrapper -> {
|
||||
// Add blending to nausea effect
|
||||
wrapper.passthrough(Types.VAR_INT); // Entity ID
|
||||
final int effectId = wrapper.passthrough(Types.VAR_INT); // Effect ID
|
||||
wrapper.passthrough(Types.VAR_INT); // Amplifier
|
||||
wrapper.passthrough(Types.VAR_INT); // Duration
|
||||
byte flags = wrapper.read(Types.BYTE); // Flags
|
||||
if (effectId == 8) { // Nausea
|
||||
flags |= 0x08; // blend
|
||||
}
|
||||
wrapper.write(Types.BYTE, flags);
|
||||
});
|
||||
|
||||
protocol.replaceClientbound(ClientboundPackets1_21_2.SET_PLAYER_TEAM, wrapper -> {
|
||||
wrapper.passthrough(Types.STRING); // Team Name
|
||||
final byte action = wrapper.passthrough(Types.BYTE); // Mode
|
||||
|
||||
+3
-2
@@ -19,6 +19,7 @@ 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.connection.UserConnection;
|
||||
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;
|
||||
@@ -37,8 +38,8 @@ public class ItemHashStorage1_21_5 implements ItemHasher {
|
||||
private boolean processingClientboundInventoryPacket;
|
||||
private final CodecContext context;
|
||||
|
||||
public ItemHashStorage1_21_5(final Protocol1_21_4To1_21_5 protocol) {
|
||||
final RegistryAccess registryAccess = RegistryAccess.of(protocol);
|
||||
public ItemHashStorage1_21_5(final Protocol1_21_4To1_21_5 protocol, final UserConnection connection) {
|
||||
final RegistryAccess registryAccess = RegistryAccess.of(protocol, connection);
|
||||
this.context = new CodecRegistryContext(protocol, registryAccess, true); // always using 1.21.5 items as input
|
||||
}
|
||||
|
||||
|
||||
@@ -256,6 +256,17 @@ public class ItemRewriter<C extends ClientboundPacketType, S extends Serverbound
|
||||
});
|
||||
}
|
||||
|
||||
public void registerSetCreativeModeSlot1_20_5(S packetType) {
|
||||
protocol.registerServerbound(packetType, wrapper -> {
|
||||
if (protocol.getEntityRewriter() != null && !protocol.getEntityRewriter().tracker(wrapper.user()).canInstaBuild()) {
|
||||
wrapper.cancel();
|
||||
return;
|
||||
}
|
||||
wrapper.passthrough(Types.SHORT); // Slot
|
||||
wrapper.write(itemType, handleItemToServer(wrapper.user(), wrapper.read(mappedItemType)));
|
||||
});
|
||||
}
|
||||
|
||||
public void registerContainerClick(S packetType) {
|
||||
protocol.registerServerbound(packetType, wrapper -> {
|
||||
wrapper.passthrough(Types.BYTE); // Container ID
|
||||
|
||||
@@ -26,9 +26,12 @@ import com.viaversion.viaversion.api.data.FullMappings;
|
||||
import com.viaversion.viaversion.api.data.MappingData;
|
||||
import com.viaversion.viaversion.api.data.Mappings;
|
||||
import com.viaversion.viaversion.api.data.entity.DimensionData;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
|
||||
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.protocol.packet.State;
|
||||
import com.viaversion.viaversion.api.rewriter.ComponentRewriter;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.data.entity.DimensionDataImpl;
|
||||
@@ -52,7 +55,6 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri
|
||||
private final Map<String, Consumer<CompoundTag>> enchantmentEffectHandlers = new Object2ObjectArrayMap<>(); // for nested enchantment data
|
||||
private final Map<String, List<RegistryEntry>> toAdd = new Object2ObjectArrayMap<>();
|
||||
private final Set<String> toRemove = new HashSet<>();
|
||||
protected final Map<String, KeyMappings> registryKeyMappings = new HashMap<>();
|
||||
protected final Protocol<?, ?, ?, ?> protocol;
|
||||
|
||||
public RegistryDataRewriter(final Protocol<?, ?, ?, ?> protocol) {
|
||||
@@ -78,7 +80,8 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri
|
||||
for (int i = 0; i < entries.length; i++) {
|
||||
keys[i] = Key.stripMinecraftNamespace(entries[i].key());
|
||||
}
|
||||
this.registryKeyMappings.put(key, new KeyMappings(keys));
|
||||
|
||||
protocol.getEntityRewriter().tracker(connection).addRegistryKeys(key, new KeyMappings(keys));
|
||||
|
||||
switch (key) {
|
||||
case "enchantment" -> updateEnchantments(connection, entries);
|
||||
@@ -141,6 +144,28 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri
|
||||
registryEntryHandlers.put(Key.stripMinecraftNamespace(registryKey), handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMissingRegistries(final UserConnection connection) {
|
||||
final EntityTracker entityTracker = protocol.getEntityRewriter().tracker(connection);
|
||||
for (final Map.Entry<String, List<RegistryEntry>> entry : this.toAdd.entrySet()) {
|
||||
if (entityTracker.registryKeys(entry.getKey()) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final List<RegistryEntry> toAdd = entry.getValue();
|
||||
final RegistryEntry[] entries = new RegistryEntry[toAdd.size()];
|
||||
for (int i = 0; i < toAdd.size(); i++) {
|
||||
entries[i] = toAdd.get(i).copy();
|
||||
}
|
||||
|
||||
final ClientboundPacketType packetType = protocol.getPacketTypesProvider().mappedClientboundType(State.CONFIGURATION, "REGISTRY_DATA");
|
||||
final PacketWrapper registryData = PacketWrapper.create(packetType, connection);
|
||||
registryData.write(Types.STRING, entry.getKey());
|
||||
registryData.write(Types.REGISTRY_ENTRY_ARRAY, entries);
|
||||
registryData.send(protocol.getClass());
|
||||
}
|
||||
}
|
||||
|
||||
public void addEnchantmentEffectRewriter(final String key, final Consumer<CompoundTag> rewriter) {
|
||||
enchantmentEffectHandlers.put(Key.stripMinecraftNamespace(key), rewriter);
|
||||
}
|
||||
@@ -495,15 +520,6 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri
|
||||
return entries;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable KeyMappings getMappings(final String registryKey) {
|
||||
return this.registryKeyMappings.get(Key.stripMinecraftNamespace(registryKey));
|
||||
}
|
||||
|
||||
public Map<String, KeyMappings> registryKeyMappings() {
|
||||
return registryKeyMappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldRemoveRegistry(final String registryKey) {
|
||||
return this.toRemove.contains(Key.stripMinecraftNamespace(registryKey));
|
||||
|
||||
@@ -9,240 +9,100 @@
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# Should ViaVersion check for updates?
|
||||
check-for-updates: true
|
||||
check-for-updates: false
|
||||
# Send the supported versions with the Status (Ping) response packet
|
||||
send-supported-versions: false
|
||||
send-supported-versions: true
|
||||
# Easier to configure alternative to 'block-protocols'. Uses readable version strings with possible '<' and '>' prefixes.
|
||||
# An example to block 1.16.4, everything below 1.16, as well as everything above 1.17.1 would be: ["<1.16", "1.16.4", ">1.17.1"]
|
||||
# You can use both this and the block-protocols option at the same time as well.
|
||||
block-versions: []
|
||||
block-versions: [">1.21.11"]
|
||||
# Block specific Minecraft protocol version numbers.
|
||||
# List of all Minecraft protocol versions: https://minecraft.wiki/w/Protocol_version, or use a generator: https://via.krusic22.com
|
||||
block-protocols: []
|
||||
# Change the blocked disconnect message
|
||||
block-disconnect-msg: "You are using an unsupported Minecraft version!"
|
||||
# If you use ProtocolLib, we can't reload without kicking the players.
|
||||
# (We don't suggest using reload either, use a plugin manager)
|
||||
# You can customize the message we kick people with if you use ProtocolLib here.
|
||||
reload-disconnect-msg: "Server reload, please rejoin!"
|
||||
# Settings for logging behavior. When debugging issues, we may ask you to change some of these.
|
||||
# Most of these are disabled by default to prevent log spam from bad user input.
|
||||
block-disconnect-msg: |
|
||||
§7[§a§lTrue§c§lOG §e§lNetwork§7] §l§cUnsupported client! §e:(
|
||||
§4♥ §6Please re-log using MCJE 1.8-1.21.11 §4♥
|
||||
reload-disconnect-msg: |
|
||||
§7[§a§lTrue§c§lOG §e§lNetwork§7] §l§6Server is restarting... §4♥
|
||||
logging:
|
||||
# Whether to log more info about kicks due to blocked protocol versions to the console.
|
||||
log-blocked-joins: false
|
||||
# Whether to log errors during entity data conversion.
|
||||
log-entity-data-errors: true
|
||||
# Whether to log errors during text component conversion.
|
||||
log-text-component-conversion-errors: false
|
||||
# Whether to warn for other issues when converting items, blocks, or other data between server and client.
|
||||
log-text-component-conversion-errors: true
|
||||
log-other-conversion-warnings: false
|
||||
# Maximum length of error messages in the console.
|
||||
max-error-length: 1500
|
||||
#
|
||||
# Used for auto updating config files. Do not touch.
|
||||
config-version: 1
|
||||
init-config-version: 1
|
||||
# Whether to update config values that were left on their default to newly changed defaults. Recommended to keep enabled.
|
||||
migrate-default-config-changes: true
|
||||
# If enabled, ViaVersion will send the native player version to the server on connect via a plugin message.
|
||||
# See the wiki for more info: https://github.com/ViaVersion/ViaVersion/wiki/Server-and-Player-Details-Protocol
|
||||
migrate-default-config-changes: false
|
||||
send-player-details: true
|
||||
# If enabled, ViaVersion will send the native server version to a player on connect via a plugin message.
|
||||
# See the wiki above for more info.
|
||||
send-server-details: true
|
||||
#----------------------------------------------------------#
|
||||
# VELOCITY OPTIONS #
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# Velocity allows you to have different server versions inside.
|
||||
# Instead of you entering all the versions of these servers, we can ping them.
|
||||
#
|
||||
# What interval would you like us to ping at? (in seconds)
|
||||
# Use -1 to disable.
|
||||
velocity-ping-interval: 60
|
||||
# If the above is enabled, should we save the info to the config (in the section below)
|
||||
velocity-ping-save: true
|
||||
# To get a server's protocol, ViaVersion will do the following:
|
||||
# Look for the server in the following section, then look for the last ping if velocity-ping is enabled
|
||||
# otherwise use default.
|
||||
#
|
||||
# The format for the following is:
|
||||
# servername: protocolversion
|
||||
# You can find protocol ids on https://minecraft.wiki/w/Protocol_version
|
||||
# It will fall back to the default option if none found.
|
||||
velocity-servers: {}
|
||||
#
|
||||
#----------------------------------------------------------#
|
||||
# GLOBAL PACKET LIMITER #
|
||||
#----------------------------------------------------------#
|
||||
# Packets Per Second (PPS) and kilobyte packet size limiters.
|
||||
# Setting 'max-per-second' or 'sustained-max-per-second' to -1 will disable the individual limit.
|
||||
# Kick messages may include the %pps or %bps placeholders respectively, though they are more intended for debugging purposes.
|
||||
#
|
||||
# Limits the amount of packets sent per second.
|
||||
# Clients by default send around 20-90 packets per second.
|
||||
packet-limiter:
|
||||
enabled: true
|
||||
# The maximum packets a client can send per second.
|
||||
max-per-second: 800
|
||||
max-per-second-kick-message: "You are sending too many packets!"
|
||||
#
|
||||
# We can also kick them if they repeatedly send too many packets over a longer period of time.
|
||||
# E.g. if a player sends over 200 packets per second for 4 out of 7 seconds, we kick them.
|
||||
# The maximum packets per second a client can send over a longer period of time.
|
||||
max-per-second-kick-message: Your client is sending too many packets.
|
||||
sustained-max-per-second: 200
|
||||
# Period to track in seconds.
|
||||
sustained-period-seconds: 7
|
||||
# The number of seconds within the interval that the client can exceed the limit before being kicked.
|
||||
sustained-threshold: 4
|
||||
sustained-kick-message: "You are sending too many packets, :("
|
||||
# Limits the size of packets in kilobytes sent per second.
|
||||
sustained-kick-message: Your client is sending way too many packets!
|
||||
packet-size-limiter:
|
||||
enabled: false
|
||||
enabled: true
|
||||
max-per-second: -1
|
||||
max-per-second-kick-message: "You are sending too large packets!"
|
||||
max-per-second-kick-message: Your client is sending too many packets per second.
|
||||
sustained-max-per-second: -1
|
||||
sustained-period-seconds: 5
|
||||
sustained-threshold: 3
|
||||
sustained-kick-message: "You are sending too large packets, :("
|
||||
#
|
||||
#----------------------------------------------------------#
|
||||
# MULTIPLE VERSIONS OPTIONS #
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# Should we enable our hologram patch?
|
||||
# If they're in the wrong place, enable this
|
||||
hologram-patch: false
|
||||
# This is the offset, should work as default when enabled.
|
||||
sustained-kick-message: Your client is sending packets which are larger than the limit!
|
||||
hologram-patch: true
|
||||
hologram-y: -0.96
|
||||
# Whether to make sure ViaVersion's UserConnection object is already available in the PlayerJoinEvent.
|
||||
# You may disable this for faster startup/join time if you are 100% sure no plugin requires this.
|
||||
register-userconnections-on-join: true
|
||||
# Should we disable piston animation for 1.11/1.11.1 clients?
|
||||
# In some cases, when firing lots of pistons, it crashes them.
|
||||
piston-animation-patch: false
|
||||
# Experimental - Should we fix shift quick move action for 1.12 clients (causes shift + double click not to work when moving items) (only works on 1.8-1.11.2 bukkit based servers)
|
||||
quick-move-action-fix: false
|
||||
# Should we use prefix for team color on 1.13 and above clients?
|
||||
piston-animation-patch: true
|
||||
quick-move-action-fix: true
|
||||
team-colour-fix: true
|
||||
# 1.13 introduced new auto complete which can trigger "Kicked for spamming" for servers older than 1.13, the following option will disable it completely.
|
||||
disable-1_13-auto-complete: false
|
||||
# The following option will delay the tab complete request in x ticks if greater than 0, if other tab-complete is received, the previous is cancelled
|
||||
1_13-tab-complete-delay: 0
|
||||
# For 1.13 clients the smallest (1 layer) snow doesn't have collisions, this will send these as 2 snowlayers for 1.13+ clients to prevent them bugging through them
|
||||
fix-low-snow-collision: false
|
||||
# Infested blocks are instantly breakable for 1.13+ clients, resulting in them being unable to break them on sub 1.13 servers. This remaps them to their normal stone variants
|
||||
fix-infested-block-breaking: true
|
||||
# In 1.14 the client page limit has been upped to 100 (from 50). Some anti-exploit plugins ban when clients go higher than 50. This option cuts edited books to 50 pages.
|
||||
1_13-tab-complete-delay: 2
|
||||
fix-low-snow-collision: true
|
||||
fix-infested-block-breaking: false
|
||||
truncate-1_14-books: false
|
||||
# This prevents clients using 1.9-1.13 on 1.8 servers from receiving no knockback/having velocity bugs whilst sneaking under a block.
|
||||
change-1_9-hitbox: false
|
||||
# Similar to the above, but for 1.14+ players on 1.8-1.13 servers.
|
||||
# WARNING: This gives 1.14+ players the ability to sneak under blocks, that players under that version cannot (sneaking in places that are only 1.5 blocks high)!
|
||||
# Another thing to remember is that those players might be missed by projectiles and other hits directed at the very top of their head whilst sneaking.
|
||||
change-1_9-hitbox: true
|
||||
change-1_14-hitbox: false
|
||||
# Fixes 1.14+ clients on sub 1.14 servers having a light value of 0 for non-full blocks.
|
||||
fix-non-full-blocklight: true
|
||||
# Fixes walk animation not shown when health is set to Float.NaN
|
||||
fix-1_14-health-nan: true
|
||||
# Should 1.15+ clients respawn instantly / without showing a death screen?
|
||||
use-1_15-instant-respawn: false
|
||||
#
|
||||
# Enable serverside block-connections for 1.13+ clients - all the options in this section are built around this option
|
||||
serverside-blockconnections: true
|
||||
# Sets the method for the block connections (world for highly experimental (USE AT OWN RISK) world-level or packet for packet-level)
|
||||
blockconnection-method: packet
|
||||
# When activated, only the most important blocks are stored in the blockstorage. (fences, glass panes etc. won't connect to solid blocks)
|
||||
reduce-blockstorage-memory: false
|
||||
# When activated with serverside-blockconnections, flower parts with blocks above will be sent as stems
|
||||
# Useful for lobbyservers where users can't build and those stems are used decoratively
|
||||
flowerstem-when-block-above: false
|
||||
# Vines that are not connected to blocks will be mapped to air, else 1.13+ would still be able to climb up on them.
|
||||
vine-climb-fix: false
|
||||
#
|
||||
# Ignores incoming plugin channel messages of 1.16+ clients with channel names longer than 32 characters.
|
||||
# CraftBukkit had this limit hardcoded until 1.16, so we have to assume any server/proxy might have this arbitrary check present.
|
||||
flowerstem-when-block-above: true
|
||||
vine-climb-fix: true
|
||||
ignore-long-1_16-channel-names: true
|
||||
#
|
||||
# Force 1.17+ client to accept the server resource pack; they will automatically disconnect if they decline.
|
||||
forced-use-1_17-resource-pack: false
|
||||
# The message to be displayed at the prompt when the 1.17+ client receives the server resource pack.
|
||||
resource-pack-1_17-prompt: ''
|
||||
#
|
||||
# Caches light until chunks are unloaded to allow later chunk update packets as opposed to instantly uncaching when the first chunk data is sent.
|
||||
# Only disable this if you know what you are doing.
|
||||
cache-1_17-light: true
|
||||
#
|
||||
# Force-update 1.19.4+ player's inventory when they try to swap armor in a pre-occupied slot.
|
||||
armor-toggle-fix: true
|
||||
#
|
||||
# Get the world names which should be returned for each vanilla dimension
|
||||
map-1_16-world-names:
|
||||
overworld: "minecraft:overworld"
|
||||
nether: "minecraft:the_nether"
|
||||
end: "minecraft:the_end"
|
||||
#
|
||||
# If disabled, tamed cats will be displayed as ocelots to 1.14+ clients on 1.13 servers. Otherwise, ocelots (tamed and untamed) will be displayed as cats.
|
||||
overworld: minecraft:overworld
|
||||
nether: minecraft:the_nether
|
||||
end: minecraft:the_end
|
||||
translate-ocelot-to-cat: false
|
||||
#
|
||||
# Determines the value sent to 1.19+ clients on join if currently not accessible by ViaVersion.
|
||||
# It is not recommended to fake this value if your server is running 1.19 or later, as 1.20.5 have stricter chat handling and may get kicked otherwise.
|
||||
enforce-secure-chat: false
|
||||
#
|
||||
# Handles items with invalid count values (higher than max stack size) on 1.20.3 servers.
|
||||
handle-invalid-item-count: false
|
||||
#
|
||||
# Hides scoreboard numbers for 1.20.3+ clients on older server versions.
|
||||
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.
|
||||
fix-1_21-placement-rotation: false
|
||||
cancel-swing-in-inventory: true
|
||||
#
|
||||
#----------------------------------------------------------#
|
||||
# 1.9+ CLIENTS ON 1.8 SERVERS OPTIONS #
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# No collide options, these allow you to configure how collision works.
|
||||
# Do you want us to prevent collision?
|
||||
prevent-collision: true
|
||||
# If the above is true, should we automatically team players until you do?
|
||||
auto-team: true
|
||||
# When enabled, 1.9+ will be able to block by using shields
|
||||
shield-blocking: true
|
||||
# If this setting is active, the main hand is used instead of the off-hand to trigger the blocking of the player.
|
||||
# With the main hand, the blocking starts way faster.
|
||||
# (Requires "show-shield-when-sword-in-hand" to be disabled)
|
||||
no-delay-shield-blocking: false
|
||||
# If this setting is active, the shield will appear immediately for 1.9+ when you hold a sword in your main hand.
|
||||
# The shield disappears when you switch to another item.
|
||||
# (Requires "shield-blocking" to be enabled)
|
||||
no-delay-shield-blocking: true
|
||||
show-shield-when-sword-in-hand: false
|
||||
# Enable player tick simulation, this fixes eating, drinking, nether portals.
|
||||
simulate-pt: true
|
||||
# Should we use nms player to simulate packets, (may fix anti-cheat issues)
|
||||
nms-player-ticking: true
|
||||
# Should we patch boss bars so they work? (Default: true, disable if you're having issues)
|
||||
bossbar-patch: true
|
||||
# If your boss bar flickers on 1.9+, set this to 'true'. It will keep all boss bars on 100% (not recommended)
|
||||
bossbar-anti-flicker: false
|
||||
# This will show the new effect indicator in the top-right corner for 1.9+ players.
|
||||
use-new-effect-indicator: true
|
||||
# Show the new death messages for 1.9+ on the death screen
|
||||
use-new-effect-indicator: false
|
||||
use-new-deathmessages: true
|
||||
# Should we cache our items, this will prevent the server from being lagged out, however, the cost is a constant task caching items
|
||||
item-cache: true
|
||||
# Should we replace extended pistons to fix 1.10.1 (Only on chunk loading)?
|
||||
replace-pistons: false
|
||||
# What id should we replace with, default is air. (careful of players getting stuck standing on them)
|
||||
replacement-piston-id: 0
|
||||
# Fix 1.9+ clients not rendering the far away chunks and improve chunk rendering when moving fast (Increases network usage and decreases client fps slightly)
|
||||
chunk-border-fix: false
|
||||
# Allows 1.9+ left-handedness (main hand) on 1.8 servers
|
||||
left-handed-handling: true
|
||||
# Tries to cancel block break/place sounds sent by 1.8 servers to 1.9+ clients to prevent them from playing twice
|
||||
cancel-block-sounds: true
|
||||
# If enabled, 1.21.11+ clients on 1.8 servers will get wider entity hitboxes when attacking with items
|
||||
use-1_8-hitbox-margin: true
|
||||
@@ -44,8 +44,8 @@ import com.viaversion.viaversion.codec.CodecRegistryContext;
|
||||
import com.viaversion.viaversion.codec.hash.HashFunction;
|
||||
import com.viaversion.viaversion.codec.hash.HashOps;
|
||||
import com.viaversion.viaversion.common.PlatformTestBase;
|
||||
import com.viaversion.viaversion.connection.UserConnectionImpl;
|
||||
import com.viaversion.viaversion.protocols.v1_21_6to1_21_7.Protocol1_21_6To1_21_7;
|
||||
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
|
||||
import com.viaversion.viaversion.util.KeyMappings;
|
||||
import com.viaversion.viaversion.util.UUIDUtil;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
@@ -61,8 +61,10 @@ public class ItemHashTest extends PlatformTestBase {
|
||||
|
||||
@BeforeAll
|
||||
static void loadContext() {
|
||||
final UserConnectionImpl dummyConnection = new UserConnectionImpl(null);
|
||||
protocol = Via.getManager().getProtocolManager().getProtocol(Protocol1_21_6To1_21_7.class);
|
||||
context = new CodecRegistryContext(null, CodecContext.RegistryAccess.of(protocol), false);
|
||||
protocol.init(dummyConnection);
|
||||
context = new CodecRegistryContext(null, CodecContext.RegistryAccess.of(protocol, dummyConnection), false);
|
||||
hasher = new HashOps(context, HashFunction.CRC32C);
|
||||
}
|
||||
|
||||
@@ -71,12 +73,6 @@ public class ItemHashTest extends PlatformTestBase {
|
||||
hasher.reset();
|
||||
}
|
||||
|
||||
private HashOps hasher(final Class<? extends Protocol<?, ?, ?, ?>> protocolClass) {
|
||||
final Protocol<?, ?, ?, ?> protocol = Via.getManager().getProtocolManager().getProtocol(protocolClass);
|
||||
final CodecRegistryContext context = new CodecRegistryContext(null, CodecContext.RegistryAccess.of(protocol), false);
|
||||
return new HashOps(context, HashFunction.CRC32C);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNumberAndKey() {
|
||||
final UseCooldown useCooldown = new UseCooldown(0.5f, ":stick");
|
||||
@@ -138,7 +134,7 @@ public class ItemHashTest extends PlatformTestBase {
|
||||
|
||||
@Test
|
||||
void testRegistryHolderId() {
|
||||
((RegistryDataRewriter) protocol.getRegistryDataRewriter()).registryKeyMappings().put("banner_pattern", new KeyMappings("base"));
|
||||
protocol.getEntityRewriter().tracker(context.connection()).addRegistryKeys("banner_pattern", new KeyMappings("base"));
|
||||
hasher.write(BannerPatternLayer.ARRAY_TYPE, new BannerPatternLayer[]{new BannerPatternLayer(Holder.of(0), 0)});
|
||||
Assertions.assertEquals(606382024, hasher.hash(), "banner_pattern hash mismatch");
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
# Project properties - we put these here so they can be modified without causing a recompile of the build scripts
|
||||
projectVersion=5.9.1
|
||||
projectVersion=5.9.2-SNAPSHOT
|
||||
|
||||
# Smile emoji (note that modrinth may not have added the version on release yet)
|
||||
mcVersions=26.1.2, 26.1.1, 26.1, 1.21.11, 1.21.10, 1.21.9, 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
|
||||
|
||||
Reference in new issue
Block a user