mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Fix all issues with vanilla and non-vanilla tags, fix documentation a bit.
This commit is contained in:
parent
444dad7407
commit
e5bcab1ec3
5 changed files with 18 additions and 30 deletions
|
@ -28,7 +28,6 @@ package org.geysermc.geyser.session.cache;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||||
import net.kyori.adventure.key.Key;
|
import net.kyori.adventure.key.Key;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
|
||||||
import org.geysermc.geyser.GeyserLogger;
|
import org.geysermc.geyser.GeyserLogger;
|
||||||
import org.geysermc.geyser.inventory.GeyserItemStack;
|
import org.geysermc.geyser.inventory.GeyserItemStack;
|
||||||
import org.geysermc.geyser.item.type.Item;
|
import org.geysermc.geyser.item.type.Item;
|
||||||
|
@ -42,7 +41,6 @@ import org.geysermc.geyser.util.MinecraftKey;
|
||||||
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket;
|
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket;
|
||||||
|
|
||||||
import javax.annotation.ParametersAreNonnullByDefault;
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -53,22 +51,20 @@ import java.util.Map;
|
||||||
@ParametersAreNonnullByDefault
|
@ParametersAreNonnullByDefault
|
||||||
public final class TagCache {
|
public final class TagCache {
|
||||||
// Stores the indexes of non-vanilla tag keys in the tags array.
|
// Stores the indexes of non-vanilla tag keys in the tags array.
|
||||||
private List<Object2IntMap<Key>> tagIndexMaps = new ArrayList<>();
|
private Object2IntMap<Key>[] tagIndexMaps = new Object2IntMap[TagRegistry.values().length];
|
||||||
private int[][][] tags = new int[TagRegistry.values().length][][];
|
private int[][][] tags = new int[TagRegistry.values().length][][];
|
||||||
|
|
||||||
public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) {
|
public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) {
|
||||||
Map<Key, Map<Key, int[]>> allTags = packet.getTags();
|
Map<Key, Map<Key, int[]>> allTags = packet.getTags();
|
||||||
int tagsLoading = (int) allTags.keySet().stream().filter(TagRegistry::shouldLoad).count();
|
|
||||||
GeyserLogger logger = session.getGeyser().getLogger();
|
GeyserLogger logger = session.getGeyser().getLogger();
|
||||||
|
|
||||||
this.tagIndexMaps = new ArrayList<>(tagsLoading);
|
this.tagIndexMaps = new Object2IntMap[TagRegistry.values().length];
|
||||||
this.tags = new int[tagsLoading][][];
|
this.tags = new int[TagRegistry.values().length][][];
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
for (Key registryKey : allTags.keySet()) {
|
for (Key registryKey : allTags.keySet()) {
|
||||||
TagRegistry registry = TagRegistry.fromKey(registryKey);
|
TagRegistry registry = TagRegistry.fromKey(registryKey);
|
||||||
if (registry == null) {
|
if (registry == null) {
|
||||||
GeyserImpl.getInstance().getLogger().debug("Not loading tags for registry " + registryKey + " (registry is not defined in TagRegistry enum)");
|
logger.debug("Not loading tags for registry " + registryKey + " (registry is not defined in TagRegistry enum)");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,28 +88,29 @@ public final class TagCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
Object2IntMap<Key> tagIndexMap = new Object2IntOpenHashMap<>();
|
Object2IntMap<Key> tagIndexMap = new Object2IntOpenHashMap<>();
|
||||||
this.tags[i] = loadTags(registryTags, tagIndexMap, registry);
|
this.tags[registry.ordinal()] = loadTags(registryTags, tagIndexMap, registry);
|
||||||
this.tagIndexMaps.add(tagIndexMap);
|
this.tagIndexMaps[registry.ordinal()] = tagIndexMap;
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int[][] loadTags(Map<Key, int[]> packetTags, Object2IntMap<Key> tagIndexMap, TagRegistry registry) {
|
private int[][] loadTags(Map<Key, int[]> packetTags, Object2IntMap<Key> tagIndexMap, TagRegistry registry) {
|
||||||
List<Key> vanillaTagKeys = List.copyOf(registry.getVanillaTags().keySet());
|
Map<Key, Tag> vanillaTags = registry.getVanillaTags();
|
||||||
List<Key> nonVanillaTagKeys = packetTags.keySet().stream().filter(tag -> !vanillaTagKeys.contains(tag)).toList();
|
List<Key> nonVanillaTagKeys = packetTags.keySet().stream().filter(tag -> !vanillaTags.containsKey(tag)).toList();
|
||||||
|
|
||||||
List<int[]> tagsBuilder = new ArrayList<>(vanillaTagKeys.size() + nonVanillaTagKeys.size());
|
int[][] tags = new int[vanillaTags.size() + nonVanillaTagKeys.size()][];
|
||||||
|
|
||||||
for (Key vanillaTagKey : registry.getVanillaTags().keySet()) {
|
for (Map.Entry<Key, Tag> vanillaTag : vanillaTags.entrySet()) {
|
||||||
tagsBuilder.add(packetTags.getOrDefault(vanillaTagKey, new int[0]));
|
tags[((VanillaTag) vanillaTag.getValue()).ordinal()] = packetTags.getOrDefault(vanillaTag.getKey(), new int[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tagIndex = vanillaTags.size();
|
||||||
for (Key nonVanillaTagKey : nonVanillaTagKeys) {
|
for (Key nonVanillaTagKey : nonVanillaTagKeys) {
|
||||||
tagIndexMap.put(nonVanillaTagKey, tagsBuilder.size());
|
tags[tagIndex] = packetTags.get(nonVanillaTagKey);
|
||||||
tagsBuilder.add(packetTags.get(nonVanillaTagKey));
|
tagIndexMap.put(nonVanillaTagKey, tagIndex);
|
||||||
|
tagIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return tagsBuilder.toArray(new int[0][]);
|
return tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -155,7 +152,7 @@ public final class TagCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
int registryIndex = tag.registry().ordinal();
|
int registryIndex = tag.registry().ordinal();
|
||||||
Object2IntMap<Key> tagIndexMap = this.tagIndexMaps.get(registryIndex);
|
Object2IntMap<Key> tagIndexMap = this.tagIndexMaps[registryIndex];
|
||||||
if (!tagIndexMap.containsKey(tag.tag())) {
|
if (!tagIndexMap.containsKey(tag.tag())) {
|
||||||
return new int[0];
|
return new int[0];
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,12 +25,8 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.session.cache.tags;
|
package org.geysermc.geyser.session.cache.tags;
|
||||||
|
|
||||||
import net.kyori.adventure.key.Key;
|
|
||||||
import org.geysermc.geyser.util.MinecraftKey;
|
import org.geysermc.geyser.util.MinecraftKey;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists vanilla block tags.
|
* Lists vanilla block tags.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.session.cache.tags;
|
package org.geysermc.geyser.session.cache.tags;
|
||||||
|
|
||||||
import net.kyori.adventure.key.Key;
|
|
||||||
import org.geysermc.geyser.util.MinecraftKey;
|
import org.geysermc.geyser.util.MinecraftKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -25,12 +25,8 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.session.cache.tags;
|
package org.geysermc.geyser.session.cache.tags;
|
||||||
|
|
||||||
import net.kyori.adventure.key.Key;
|
|
||||||
import org.geysermc.geyser.util.MinecraftKey;
|
import org.geysermc.geyser.util.MinecraftKey;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists vanilla item tags.
|
* Lists vanilla item tags.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -35,7 +35,7 @@ import org.geysermc.geyser.util.MinecraftKey;
|
||||||
* Lists registries that Geyser stores tags for.
|
* Lists registries that Geyser stores tags for.
|
||||||
*
|
*
|
||||||
* When wanting to store tags from a new registry, add the registry here, and register all vanilla tags for it using {@link TagRegistry#registerVanillaTag}. These vanilla tags
|
* When wanting to store tags from a new registry, add the registry here, and register all vanilla tags for it using {@link TagRegistry#registerVanillaTag}. These vanilla tags
|
||||||
* can be stored in a vanilla tag class, like {@link BlockTag} and {@link ItemTag}. This class can then have an init method that's called in {@link TagRegistry#init)}, to ensure
|
* can be stored in a vanilla tag class, like {@link BlockTag} and {@link ItemTag}. This class can then have an init method that's called in {@link TagRegistry#init}, to ensure
|
||||||
* that all vanilla tags are registered before any connection is made.
|
* that all vanilla tags are registered before any connection is made.
|
||||||
*/
|
*/
|
||||||
public enum TagRegistry {
|
public enum TagRegistry {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue