Small optimizations in Enchantment

This commit is contained in:
Camotoy 2024-09-13 15:51:39 -04:00
parent ed5195a842
commit 34fda8a743
No known key found for this signature in database
GPG key ID: 7EEFB66FE798081F

View file

@ -25,6 +25,7 @@
package org.geysermc.geyser.item.enchantment; package org.geysermc.geyser.item.enchantment;
import it.unimi.dsi.fastutil.ints.IntArrays;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMap;
@ -33,13 +34,14 @@ import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; import org.geysermc.geyser.session.cache.registry.RegistryEntryContext;
import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.translator.text.MessageTranslator;
import org.geysermc.geyser.util.MinecraftKey;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.ToIntFunction;
/** /**
* @param description only populated if {@link #bedrockEnchantment()} is not null. * @param description only populated if {@link #bedrockEnchantment()} is not null.
@ -86,21 +88,21 @@ public record Enchantment(String identifier,
} }
// TODO holder set util? // TODO holder set util?
private static HolderSet readHolderSet(@Nullable Object holderSet, Function<Key, Integer> keyIdMapping) { private static HolderSet readHolderSet(@Nullable Object holderSet, ToIntFunction<Key> keyIdMapping) {
if (holderSet == null) { if (holderSet == null) {
return new HolderSet(new int[]{}); return new HolderSet(IntArrays.EMPTY_ARRAY);
} }
if (holderSet instanceof String stringTag) { if (holderSet instanceof String stringTag) {
// Tag // Tag
if (stringTag.startsWith("#")) { if (stringTag.startsWith("#")) {
return new HolderSet(Key.key(stringTag.substring(1))); // Remove '#' at beginning that indicates tag return new HolderSet(MinecraftKey.key(stringTag.substring(1))); // Remove '#' at beginning that indicates tag
} else { } else {
return new HolderSet(new int[]{keyIdMapping.apply(Key.key(stringTag))}); return new HolderSet(new int[]{keyIdMapping.applyAsInt(MinecraftKey.key(stringTag))});
} }
} else if (holderSet instanceof List<?> list) { } else if (holderSet instanceof List<?> list) {
// Assume the list is a list of strings // Assume the list is a list of strings
return new HolderSet(list.stream().map(o -> (String) o).map(Key::key).map(keyIdMapping).mapToInt(Integer::intValue).toArray()); return new HolderSet(list.stream().map(o -> (String) o).map(Key::key).mapToInt(keyIdMapping).toArray());
} }
throw new IllegalArgumentException("Holder set must either be a tag, a string ID or a list of string IDs"); throw new IllegalArgumentException("Holder set must either be a tag, a string ID or a list of string IDs");
} }