mirror of
https://github.com/GeyserMC/Geyser.git
synced 2025-12-19 14:59:27 +00:00
Component hashing changes, bump mcpl
This commit is contained in:
@@ -8,8 +8,6 @@ architectury {
|
||||
fabric()
|
||||
}
|
||||
|
||||
val includeTransitive: Configuration = configurations.getByName("includeTransitive")
|
||||
|
||||
dependencies {
|
||||
modImplementation(libs.fabric.loader)
|
||||
modApi(libs.fabric.api)
|
||||
|
||||
@@ -16,8 +16,6 @@ provided("com.google.errorprone", "error_prone_annotations")
|
||||
// Jackson shipped by Minecraft is too old, so we shade & relocate our newer version
|
||||
relocate("com.fasterxml.jackson")
|
||||
|
||||
val includeTransitive: Configuration = configurations.getByName("includeTransitive")
|
||||
|
||||
dependencies {
|
||||
// See https://github.com/google/guava/issues/6618
|
||||
modules {
|
||||
|
||||
@@ -96,8 +96,8 @@ tasks {
|
||||
|
||||
afterEvaluate {
|
||||
val providedDependencies = providedDependencies[project.name]!!
|
||||
val shadedDependencies = configurations.getByName("shadowBundle")
|
||||
.dependencies.stream().map { dependency -> "${dependency.group}:${dependency.name}" }.toList()
|
||||
val shadedDependencies = configurations.getByName("shadowBundle").resolvedConfiguration.resolvedArtifacts.stream()
|
||||
.map { dependency -> "${dependency.moduleVersion.id.module}" }.toList()
|
||||
|
||||
// Now: Include all transitive dependencies that aren't excluded
|
||||
configurations["includeTransitive"].resolvedConfiguration.resolvedArtifacts.forEach { dep ->
|
||||
|
||||
@@ -74,6 +74,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.item.component.MobEffectIns
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.PotionContents;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.ToolData;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.TooltipDisplay;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.TypedEntityData;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.Unit;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.UseCooldown;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.Weapon;
|
||||
@@ -213,9 +214,15 @@ public class DataComponentHashers {
|
||||
|
||||
register(DataComponentTypes.TRIM, RegistryHasher.ARMOR_TRIM);
|
||||
register(DataComponentTypes.DEBUG_STICK_STATE, MinecraftHasher.NBT_MAP);
|
||||
// register(DataComponentTypes.ENTITY_DATA, MinecraftHasher.NBT_MAP); TODO 1.21.9
|
||||
registerMap(DataComponentTypes.ENTITY_DATA, builder -> builder
|
||||
.accept("id", RegistryHasher.ENTITY_TYPE_KEY, TypedEntityData::type)
|
||||
.inlineNbt(TypedEntityData::tag)
|
||||
);
|
||||
register(DataComponentTypes.BUCKET_ENTITY_DATA, MinecraftHasher.NBT_MAP);
|
||||
// register(DataComponentTypes.BLOCK_ENTITY_DATA, MinecraftHasher.NBT_MAP); TODO 1.21.9
|
||||
registerMap(DataComponentTypes.BLOCK_ENTITY_DATA, builder -> builder
|
||||
.accept("id", RegistryHasher.BLOCK_ENTITY_TYPE_KEY, TypedEntityData::type)
|
||||
.inlineNbt(TypedEntityData::tag)
|
||||
);
|
||||
|
||||
register(DataComponentTypes.INSTRUMENT, RegistryHasher.INSTRUMENT_COMPONENT);
|
||||
register(DataComponentTypes.PROVIDES_TRIM_MATERIAL, RegistryHasher.PROVIDES_TRIM_MATERIAL);
|
||||
@@ -235,7 +242,7 @@ public class DataComponentHashers {
|
||||
.optional("flight_duration", MinecraftHasher.BYTE, fireworks -> (byte) fireworks.getFlightDuration(), (byte) 0)
|
||||
.optionalList("explosions", RegistryHasher.FIREWORK_EXPLOSION, Fireworks::getExplosions));
|
||||
|
||||
// register(DataComponentTypes.PROFILE, MinecraftHasher.GAME_PROFILE); TODO 1.21.9
|
||||
register(DataComponentTypes.PROFILE, MinecraftHasher.RESOLVABLE_PROFILE);
|
||||
register(DataComponentTypes.NOTE_BLOCK_SOUND, MinecraftHasher.KEY);
|
||||
register(DataComponentTypes.BANNER_PATTERNS, RegistryHasher.BANNER_PATTERN_LAYER.list());
|
||||
register(DataComponentTypes.BASE_COLOR, MinecraftHasher.DYE_COLOR);
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
package org.geysermc.geyser.item.hashing;
|
||||
|
||||
import com.google.common.hash.HashCode;
|
||||
import org.cloudburstmc.nbt.NbtList;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -67,6 +69,14 @@ public class MapHasher<Type> {
|
||||
return this;
|
||||
}
|
||||
|
||||
private MapHasher<Type> accept(String key, Object value, HashCode valueHash) {
|
||||
if (unhashed != null) {
|
||||
unhashed.put(key, value);
|
||||
}
|
||||
map.put(encoder.string(key), valueHash);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a constant {@link Value} to the map.
|
||||
*
|
||||
@@ -82,6 +92,25 @@ public class MapHasher<Type> {
|
||||
return accept(key, hasher.hash(value, encoder));
|
||||
}
|
||||
|
||||
public MapHasher<Type> inlineNbt(Function<Type, NbtMap> extractor) {
|
||||
NbtMap nbtMap = extractor.apply(object);
|
||||
for (String key : nbtMap.keySet()) {
|
||||
Object value = nbtMap.get(key);
|
||||
if (value instanceof NbtList<?> list) {
|
||||
accept(key, value, encoder.nbtList(list));
|
||||
} else {
|
||||
nbtMap.listenForNumber(key, n -> accept(key, value, encoder.number(n)));
|
||||
nbtMap.listenForString(key, s -> accept(key, value, encoder.string(s)));
|
||||
nbtMap.listenForCompound(key, compound -> accept(key, value, encoder.nbtMap(compound)));
|
||||
|
||||
nbtMap.listenForByteArray(key, bytes -> accept(key, value, encoder.byteArray(bytes)));
|
||||
nbtMap.listenForIntArray(key, ints -> accept(key, value, encoder.intArray(ints)));
|
||||
nbtMap.listenForLongArray(key, longs -> accept(key, value, encoder.longArray(longs)));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts a {@link Value} from a {@link Type} using the {@code extractor}, and adds it to the map.
|
||||
*
|
||||
|
||||
@@ -37,6 +37,7 @@ import org.geysermc.geyser.session.GeyserSession;
|
||||
import org.geysermc.mcprotocollib.auth.GameProfile;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.EquipmentSlot;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.GlobalPos;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.ResolvableProfile;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.Filterable;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.ItemAttributeModifiers;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.Unit;
|
||||
@@ -45,6 +46,7 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
@@ -131,10 +133,15 @@ public interface MinecraftHasher<Type> {
|
||||
.accept("value", STRING, GameProfile.Property::getValue)
|
||||
.optionalNullable("signature", STRING, GameProfile.Property::getSignature));
|
||||
|
||||
MinecraftHasher<GameProfile> GAME_PROFILE = mapBuilder(builder -> builder
|
||||
.optionalNullable("name", STRING, GameProfile::getName)
|
||||
.optionalNullable("id", UUID, GameProfile::getId)
|
||||
.optionalList("properties", GAME_PROFILE_PROPERTY, GameProfile::getProperties));
|
||||
MinecraftHasher<ResolvableProfile> RESOLVABLE_PROFILE = mapBuilder(builder -> builder
|
||||
.optionalNullable("name", STRING, resolvableProfile -> resolvableProfile.getProfile().getName())
|
||||
.optionalNullable("id", UUID, resolvableProfile -> resolvableProfile.getProfile().getId())
|
||||
.optionalList("properties", GAME_PROFILE_PROPERTY, resolvableProfile -> resolvableProfile.getProfile().getProperties())
|
||||
.optionalNullable("texture", KEY, ResolvableProfile::getBody)
|
||||
.optionalNullable("cape", KEY, ResolvableProfile::getCape)
|
||||
.optionalNullable("elytra", KEY, ResolvableProfile::getElytra)
|
||||
.optional("model", STRING, resolvableProfile -> Optional.ofNullable(resolvableProfile.getModel()).map(GameProfile.TextureModel::name))
|
||||
);
|
||||
|
||||
MinecraftHasher<Integer> RARITY = fromIdEnum(Rarity.values(), Rarity::getName);
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ package org.geysermc.geyser.item.hashing;
|
||||
|
||||
import com.google.common.hash.HashCode;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
import org.geysermc.geyser.inventory.item.Potion;
|
||||
import org.geysermc.geyser.item.hashing.data.ConsumeEffectType;
|
||||
import org.geysermc.geyser.item.hashing.data.FireworkExplosionShape;
|
||||
@@ -74,6 +73,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.item.component.ProvidesTrim
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.SuspiciousStewEffect;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.ToolData;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.Unit;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.level.block.BlockEntityType;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.level.sound.BuiltinSound;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.level.sound.CustomSound;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.level.sound.Sound;
|
||||
@@ -110,6 +110,10 @@ public interface RegistryHasher<DirectType> extends MinecraftHasher<Integer> {
|
||||
|
||||
RegistryHasher<?> ENTITY_TYPE = enumIdRegistry(EntityType.values());
|
||||
|
||||
MinecraftHasher<EntityType> ENTITY_TYPE_KEY = enumRegistry();
|
||||
|
||||
MinecraftHasher<BlockEntityType> BLOCK_ENTITY_TYPE_KEY = enumRegistry();
|
||||
|
||||
RegistryHasher<?> ENCHANTMENT = registry(JavaRegistries.ENCHANTMENT);
|
||||
|
||||
RegistryHasher<?> ATTRIBUTE = enumIdRegistry(AttributeType.Builtin.values(), AttributeType::getIdentifier);
|
||||
@@ -346,7 +350,8 @@ public interface RegistryHasher<DirectType> extends MinecraftHasher<Integer> {
|
||||
.optional("has_twinkle", BOOL, Fireworks.FireworkExplosion::isHasTwinkle, false));
|
||||
|
||||
MinecraftHasher<BeehiveOccupant> BEEHIVE_OCCUPANT = MinecraftHasher.mapBuilder(builder -> builder
|
||||
.optional("entity_data", NBT_MAP, BeehiveOccupant::getEntityData, NbtMap.EMPTY)
|
||||
.accept("id", RegistryHasher.ENTITY_TYPE_KEY, beehiveOccupant -> beehiveOccupant.getEntityData().type())
|
||||
.inlineNbt(beehiveOccupant -> beehiveOccupant.getEntityData().tag())
|
||||
.accept("ticks_in_hive", INT, BeehiveOccupant::getTicksInHive)
|
||||
.accept("min_ticks_in_hive", INT, BeehiveOccupant::getMinTicksInHive));
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ protocol-common = "3.0.0.Beta8-20250929.213851-8"
|
||||
protocol-codec = "3.0.0.Beta8-20250929.213851-8"
|
||||
raknet = "1.0.0.CR3-20250811.214335-20"
|
||||
minecraftauth = "4.1.1"
|
||||
mcprotocollib = "1.21.9-20251005.132211-10"
|
||||
mcprotocollib = "1.21.9-20251008.155050-11"
|
||||
adventure = "4.24.0"
|
||||
adventure-platform = "4.3.0"
|
||||
junit = "5.9.2"
|
||||
|
||||
Reference in New Issue
Block a user