mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-12-02 21:16:45 +01:00
Better handling of invalid items in recipe translator
Stonecutter recipes will now be processed correctly, even if an item is modded. Co-authored-by: Setadokalo <darkenchanter1@gmail.com>
This commit is contained in:
parent
7cd3eb99ef
commit
a5779a716b
1 changed files with 17 additions and 7 deletions
|
@ -85,6 +85,10 @@ public class JavaDeclareRecipesTranslator extends PacketTranslator<ServerDeclare
|
||||||
case CRAFTING_SHAPELESS -> {
|
case CRAFTING_SHAPELESS -> {
|
||||||
ShapelessRecipeData shapelessRecipeData = (ShapelessRecipeData) recipe.getData();
|
ShapelessRecipeData shapelessRecipeData = (ShapelessRecipeData) recipe.getData();
|
||||||
ItemData output = ItemTranslator.translateToBedrock(session, shapelessRecipeData.getResult());
|
ItemData output = ItemTranslator.translateToBedrock(session, shapelessRecipeData.getResult());
|
||||||
|
if (output.equals(ItemData.AIR)) {
|
||||||
|
// Likely modded item that Bedrock will complain about if it persists
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// Strip NBT - tools won't appear in the recipe book otherwise
|
// Strip NBT - tools won't appear in the recipe book otherwise
|
||||||
output = output.toBuilder().tag(null).build();
|
output = output.toBuilder().tag(null).build();
|
||||||
ItemData[][] inputCombinations = combinations(session, shapelessRecipeData.getIngredients());
|
ItemData[][] inputCombinations = combinations(session, shapelessRecipeData.getIngredients());
|
||||||
|
@ -98,6 +102,10 @@ public class JavaDeclareRecipesTranslator extends PacketTranslator<ServerDeclare
|
||||||
case CRAFTING_SHAPED -> {
|
case CRAFTING_SHAPED -> {
|
||||||
ShapedRecipeData shapedRecipeData = (ShapedRecipeData) recipe.getData();
|
ShapedRecipeData shapedRecipeData = (ShapedRecipeData) recipe.getData();
|
||||||
ItemData output = ItemTranslator.translateToBedrock(session, shapedRecipeData.getResult());
|
ItemData output = ItemTranslator.translateToBedrock(session, shapedRecipeData.getResult());
|
||||||
|
if (output.equals(ItemData.AIR)) {
|
||||||
|
// Likely modded item that Bedrock will complain about if it persists
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// See above
|
// See above
|
||||||
output = output.toBuilder().tag(null).build();
|
output = output.toBuilder().tag(null).build();
|
||||||
ItemData[][] inputCombinations = combinations(session, shapedRecipeData.getIngredients());
|
ItemData[][] inputCombinations = combinations(session, shapedRecipeData.getIngredients());
|
||||||
|
@ -136,7 +144,9 @@ public class JavaDeclareRecipesTranslator extends PacketTranslator<ServerDeclare
|
||||||
// Sort the list by each output item's Java identifier - this is how it's sorted on Java, and therefore
|
// Sort the list by each output item's Java identifier - this is how it's sorted on Java, and therefore
|
||||||
// We can get the correct order for button pressing
|
// We can get the correct order for button pressing
|
||||||
data.getValue().sort(Comparator.comparing((stoneCuttingRecipeData ->
|
data.getValue().sort(Comparator.comparing((stoneCuttingRecipeData ->
|
||||||
session.getItemMappings().getItems().get(stoneCuttingRecipeData.getResult().getId()).getJavaIdentifier())));
|
session.getItemMappings().getItems()
|
||||||
|
.getOrDefault(stoneCuttingRecipeData.getResult().getId(), ItemMapping.AIR)
|
||||||
|
.getJavaIdentifier())));
|
||||||
|
|
||||||
// Now that it's sorted, let's translate these recipes
|
// Now that it's sorted, let's translate these recipes
|
||||||
for (StoneCuttingRecipeData stoneCuttingData : data.getValue()) {
|
for (StoneCuttingRecipeData stoneCuttingData : data.getValue()) {
|
||||||
|
@ -144,6 +154,10 @@ public class JavaDeclareRecipesTranslator extends PacketTranslator<ServerDeclare
|
||||||
ItemStack ingredient = stoneCuttingData.getIngredient().getOptions()[0];
|
ItemStack ingredient = stoneCuttingData.getIngredient().getOptions()[0];
|
||||||
ItemData input = ItemTranslator.translateToBedrock(session, ingredient);
|
ItemData input = ItemTranslator.translateToBedrock(session, ingredient);
|
||||||
ItemData output = ItemTranslator.translateToBedrock(session, stoneCuttingData.getResult());
|
ItemData output = ItemTranslator.translateToBedrock(session, stoneCuttingData.getResult());
|
||||||
|
if (input.equals(ItemData.AIR) || output.equals(ItemData.AIR)) {
|
||||||
|
// Probably modded items
|
||||||
|
continue;
|
||||||
|
}
|
||||||
UUID uuid = UUID.randomUUID();
|
UUID uuid = UUID.randomUUID();
|
||||||
|
|
||||||
// We need to register stonecutting recipes so they show up on Bedrock
|
// We need to register stonecutting recipes so they show up on Bedrock
|
||||||
|
@ -151,12 +165,8 @@ public class JavaDeclareRecipesTranslator extends PacketTranslator<ServerDeclare
|
||||||
Collections.singletonList(input), Collections.singletonList(output), uuid, "stonecutter", 0, netId++));
|
Collections.singletonList(input), Collections.singletonList(output), uuid, "stonecutter", 0, netId++));
|
||||||
|
|
||||||
// Save the recipe list for reference when crafting
|
// Save the recipe list for reference when crafting
|
||||||
IntList outputs = stonecutterRecipeMap.get(ingredient.getId());
|
// Add the ingredient as the key and all possible values as the value
|
||||||
if (outputs == null) {
|
IntList outputs = stonecutterRecipeMap.computeIfAbsent(ingredient.getId(), ($) -> new IntArrayList());
|
||||||
outputs = new IntArrayList();
|
|
||||||
// Add the ingredient as the key and all possible values as the value
|
|
||||||
stonecutterRecipeMap.put(ingredient.getId(), outputs);
|
|
||||||
}
|
|
||||||
outputs.add(stoneCuttingData.getResult().getId());
|
outputs.add(stoneCuttingData.getResult().getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue