3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-10-03 16:31:14 +02:00

Version out potion registry

The ID of (for example) redstone dust has shifted, meaning that our hack of re-using IDs no longer works.

Fixes #3620
Dieser Commit ist enthalten in:
Camotoy 2023-03-17 19:07:31 -04:00
Ursprung 147618d5bc
Commit 9609686eb3
4 geänderte Dateien mit 59 neuen und 50 gelöschten Zeilen

Datei anzeigen

@ -135,7 +135,7 @@ public final class Registries {
/** /**
* A registry holding all the potion mixes. * A registry holding all the potion mixes.
*/ */
public static final SimpleRegistry<Set<PotionMixData>> POTION_MIXES; public static final VersionedRegistry<Set<PotionMixData>> POTION_MIXES;
/** /**
* A registry holding all the * A registry holding all the
@ -178,7 +178,7 @@ public final class Registries {
RecipeRegistryPopulator.populate(); RecipeRegistryPopulator.populate();
// Create registries that require other registries to load first // Create registries that require other registries to load first
POTION_MIXES = SimpleRegistry.create(PotionMixRegistryLoader::new); POTION_MIXES = VersionedRegistry.create(PotionMixRegistryLoader::new);
ENCHANTMENTS = SimpleMappedRegistry.create("mappings/enchantments.json", EnchantmentRegistryLoader::new); ENCHANTMENTS = SimpleMappedRegistry.create("mappings/enchantments.json", EnchantmentRegistryLoader::new);
// Remove unneeded client generation data from NbtMapBuilder // Remove unneeded client generation data from NbtMapBuilder

Datei anzeigen

@ -26,17 +26,18 @@
package org.geysermc.geyser.registry.loader; package org.geysermc.geyser.registry.loader;
import com.nukkitx.protocol.bedrock.data.inventory.PotionMixData; import com.nukkitx.protocol.bedrock.data.inventory.PotionMixData;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import org.geysermc.geyser.inventory.item.Potion; import org.geysermc.geyser.inventory.item.Potion;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
//TODO this needs to be versioned, but the runtime item states between 1.17 and 1.17.10 are identical except for new blocks so this works for both
/** /**
* Generates a collection of {@link PotionMixData} that enables the * Generates a collection of {@link PotionMixData} that enables the
* Bedrock client to place brewing items into the brewing stand. * Bedrock client to place brewing items into the brewing stand.
@ -46,64 +47,72 @@ import java.util.Set;
* (Ex: Bedrock cannot normally place glass bottles or fully upgraded * (Ex: Bedrock cannot normally place glass bottles or fully upgraded
* potions into the brewing stand, but Java can.) * potions into the brewing stand, but Java can.)
*/ */
public class PotionMixRegistryLoader implements RegistryLoader<Object, Set<PotionMixData>> { public class PotionMixRegistryLoader implements RegistryLoader<Object, Int2ObjectMap<Set<PotionMixData>>> {
@Override @Override
public Set<PotionMixData> load(Object input) { public Int2ObjectMap<Set<PotionMixData>> load(Object input) {
List<ItemMapping> ingredients = new ArrayList<>(); var allPotionMixes = new Int2ObjectOpenHashMap<Set<PotionMixData>>(Registries.ITEMS.get().size());
ingredients.add(getNonNull("minecraft:nether_wart")); for (var entry : Registries.ITEMS.get().int2ObjectEntrySet()) {
ingredients.add(getNonNull("minecraft:redstone")); ItemMappings mappings = entry.getValue();
ingredients.add(getNonNull("minecraft:glowstone_dust")); List<ItemMapping> ingredients = new ArrayList<>();
ingredients.add(getNonNull("minecraft:fermented_spider_eye")); ingredients.add(getNonNull(mappings, "minecraft:nether_wart"));
ingredients.add(getNonNull("minecraft:gunpowder")); ingredients.add(getNonNull(mappings, "minecraft:redstone"));
ingredients.add(getNonNull("minecraft:dragon_breath")); ingredients.add(getNonNull(mappings, "minecraft:glowstone_dust"));
ingredients.add(getNonNull("minecraft:sugar")); ingredients.add(getNonNull(mappings, "minecraft:fermented_spider_eye"));
ingredients.add(getNonNull("minecraft:rabbit_foot")); ingredients.add(getNonNull(mappings, "minecraft:gunpowder"));
ingredients.add(getNonNull("minecraft:glistering_melon_slice")); ingredients.add(getNonNull(mappings, "minecraft:dragon_breath"));
ingredients.add(getNonNull("minecraft:spider_eye")); ingredients.add(getNonNull(mappings, "minecraft:sugar"));
ingredients.add(getNonNull("minecraft:pufferfish")); ingredients.add(getNonNull(mappings, "minecraft:rabbit_foot"));
ingredients.add(getNonNull("minecraft:magma_cream")); ingredients.add(getNonNull(mappings, "minecraft:glistering_melon_slice"));
ingredients.add(getNonNull("minecraft:golden_carrot")); ingredients.add(getNonNull(mappings, "minecraft:spider_eye"));
ingredients.add(getNonNull("minecraft:blaze_powder")); ingredients.add(getNonNull(mappings, "minecraft:pufferfish"));
ingredients.add(getNonNull("minecraft:ghast_tear")); ingredients.add(getNonNull(mappings, "minecraft:magma_cream"));
ingredients.add(getNonNull("minecraft:turtle_helmet")); ingredients.add(getNonNull(mappings, "minecraft:golden_carrot"));
ingredients.add(getNonNull("minecraft:phantom_membrane")); ingredients.add(getNonNull(mappings, "minecraft:blaze_powder"));
ingredients.add(getNonNull(mappings, "minecraft:ghast_tear"));
ingredients.add(getNonNull(mappings, "minecraft:turtle_helmet"));
ingredients.add(getNonNull(mappings, "minecraft:phantom_membrane"));
List<ItemMapping> inputs = new ArrayList<>(); List<ItemMapping> inputs = List.of(
inputs.add(getNonNull("minecraft:potion")); getNonNull(mappings, "minecraft:potion"),
inputs.add(getNonNull("minecraft:splash_potion")); getNonNull(mappings, "minecraft:splash_potion"),
inputs.add(getNonNull("minecraft:lingering_potion")); getNonNull(mappings, "minecraft:lingering_potion")
);
ItemMapping glassBottle = getNonNull("minecraft:glass_bottle"); ItemMapping glassBottle = getNonNull(mappings, "minecraft:glass_bottle");
Set<PotionMixData> potionMixes = new HashSet<>(); Set<PotionMixData> potionMixes = new HashSet<>();
// Add all types of potions as inputs // Add all types of potions as inputs
ItemMapping fillerIngredient = ingredients.get(0); ItemMapping fillerIngredient = ingredients.get(0);
for (ItemMapping entryInput : inputs) { for (ItemMapping entryInput : inputs) {
for (Potion potion : Potion.values()) { for (Potion potion : Potion.VALUES) {
potionMixes.add(new PotionMixData(
entryInput.getBedrockId(), potion.getBedrockId(),
fillerIngredient.getBedrockId(), fillerIngredient.getBedrockData(),
glassBottle.getBedrockId(), glassBottle.getBedrockData())
);
}
}
// Add all brewing ingredients
// Also adds glass bottle as input
for (ItemMapping ingredient : ingredients) {
potionMixes.add(new PotionMixData( potionMixes.add(new PotionMixData(
entryInput.getBedrockId(), potion.getBedrockId(), glassBottle.getBedrockId(), glassBottle.getBedrockData(),
fillerIngredient.getBedrockId(), fillerIngredient.getBedrockData(), ingredient.getBedrockId(), ingredient.getBedrockData(),
glassBottle.getBedrockId(), glassBottle.getBedrockData()) glassBottle.getBedrockId(), glassBottle.getBedrockData())
); );
} }
}
// Add all brewing ingredients allPotionMixes.put(entry.getIntKey(), potionMixes);
// Also adds glass bottle as input
for (ItemMapping ingredient : ingredients) {
potionMixes.add(new PotionMixData(
glassBottle.getBedrockId(), glassBottle.getBedrockData(),
ingredient.getBedrockId(), ingredient.getBedrockData(),
glassBottle.getBedrockId(), glassBottle.getBedrockData())
);
} }
return potionMixes; allPotionMixes.trim();
return allPotionMixes;
} }
private static ItemMapping getNonNull(String javaIdentifier) { private static ItemMapping getNonNull(ItemMappings mappings, String javaIdentifier) {
ItemMapping itemMapping = Registries.ITEMS.forVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()).getMapping(javaIdentifier); ItemMapping itemMapping = mappings.getMapping(javaIdentifier);
if (itemMapping == null) if (itemMapping == null)
throw new NullPointerException("No item entry exists for java identifier: " + javaIdentifier); throw new NullPointerException("No item entry exists for java identifier: " + javaIdentifier);

Datei anzeigen

@ -640,7 +640,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
// Potion mixes are registered by default, as they are needed to be able to put ingredients into the brewing stand. // Potion mixes are registered by default, as they are needed to be able to put ingredients into the brewing stand.
CraftingDataPacket craftingDataPacket = new CraftingDataPacket(); CraftingDataPacket craftingDataPacket = new CraftingDataPacket();
craftingDataPacket.setCleanRecipes(true); craftingDataPacket.setCleanRecipes(true);
craftingDataPacket.getPotionMixData().addAll(Registries.POTION_MIXES.get()); craftingDataPacket.getPotionMixData().addAll(Registries.POTION_MIXES.forVersion(this.upstream.getProtocolVersion()));
upstream.sendPacket(craftingDataPacket); upstream.sendPacket(craftingDataPacket);
PlayStatusPacket playStatusPacket = new PlayStatusPacket(); PlayStatusPacket playStatusPacket = new PlayStatusPacket();

Datei anzeigen

@ -167,7 +167,7 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator<ClientboundUpd
} }
} }
craftingDataPacket.getCraftingData().addAll(CARTOGRAPHY_RECIPES); craftingDataPacket.getCraftingData().addAll(CARTOGRAPHY_RECIPES);
craftingDataPacket.getPotionMixData().addAll(Registries.POTION_MIXES.get()); craftingDataPacket.getPotionMixData().addAll(Registries.POTION_MIXES.forVersion(session.getUpstream().getProtocolVersion()));
Int2ObjectMap<GeyserStonecutterData> stonecutterRecipeMap = new Int2ObjectOpenHashMap<>(); Int2ObjectMap<GeyserStonecutterData> stonecutterRecipeMap = new Int2ObjectOpenHashMap<>();
for (Int2ObjectMap.Entry<List<StoneCuttingRecipeData>> data : unsortedStonecutterData.int2ObjectEntrySet()) { for (Int2ObjectMap.Entry<List<StoneCuttingRecipeData>> data : unsortedStonecutterData.int2ObjectEntrySet()) {