Skip to content

Commit d588b1d

Browse files
authored
Merge pull request #197 from TheNextLvl-net/discover-recipe-internally
Fixed recipe discovery logic
2 parents fb6b35b + d78101b commit d588b1d

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

per-worlds/src/main/java/net/thenextlvl/perworlds/model/PaperPlayerData.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@
55
import net.kyori.adventure.util.TriState;
66
import net.minecraft.advancements.AdvancementHolder;
77
import net.minecraft.advancements.AdvancementProgress;
8+
import net.minecraft.network.protocol.game.ClientboundRecipeBookAddPacket;
9+
import net.minecraft.resources.ResourceKey;
810
import net.minecraft.resources.ResourceLocation;
911
import net.minecraft.server.PlayerAdvancements;
1012
import net.minecraft.server.level.ServerPlayer;
13+
import net.minecraft.stats.ServerRecipeBook;
1114
import net.minecraft.world.entity.Pose;
15+
import net.minecraft.world.item.crafting.RecipeHolder;
1216
import net.thenextlvl.perworlds.GroupSettings;
1317
import net.thenextlvl.perworlds.WorldGroup;
1418
import net.thenextlvl.perworlds.data.AdvancementData;
@@ -25,6 +29,7 @@
2529
import org.bukkit.craftbukkit.CraftServer;
2630
import org.bukkit.craftbukkit.advancement.CraftAdvancement;
2731
import org.bukkit.craftbukkit.entity.CraftPlayer;
32+
import org.bukkit.craftbukkit.inventory.CraftRecipe;
2833
import org.bukkit.entity.EntityType;
2934
import org.bukkit.entity.Player;
3035
import org.bukkit.inventory.ItemStack;
@@ -36,6 +41,7 @@
3641
import org.jspecify.annotations.Nullable;
3742
import org.spigotmc.SpigotConfig;
3843

44+
import java.util.ArrayList;
3945
import java.util.Collection;
4046
import java.util.HashSet;
4147
import java.util.LinkedHashMap;
@@ -346,15 +352,50 @@ private void applyRecipes(Player player, GroupSettings settings) {
346352
if (settings.recipes()) {
347353
var toAdd = new HashSet<>(recipes);
348354
toAdd.removeAll(player.getDiscoveredRecipes());
349-
// todo: discover internally, don't send toast
350-
player.discoverRecipes(toAdd);
355+
discoverRecipes(player, toAdd);
351356

352357
var toRemove = new HashSet<>(player.getDiscoveredRecipes());
353358
toRemove.removeAll(recipes);
354359
player.undiscoverRecipes(toRemove);
355360
} else player.undiscoverRecipes(player.getDiscoveredRecipes());
356361
}
357362

363+
private void discoverRecipes(Player player, Set<NamespacedKey> recipes) {
364+
var handle = ((CraftPlayer) player).getHandle();
365+
var list = new ArrayList<ClientboundRecipeBookAddPacket.Entry>();
366+
var manager = ((CraftServer) player.getServer()).getServer().getRecipeManager();
367+
var recipeBook = handle.getRecipeBook();
368+
369+
var recipeHolders = recipes.stream().map(CraftRecipe::toMinecraft)
370+
.map(manager::byKey)
371+
.map(recipeHolder -> recipeHolder.orElse(null))
372+
.filter(Objects::nonNull);
373+
374+
recipeHolders.forEach(recipeHolder -> {
375+
if (recipeBook.known.contains(recipeHolder.id()) || recipeHolder.value().isSpecial()) return;
376+
recipeBook.add(recipeHolder.id());
377+
manager.listDisplaysForRecipe(recipeHolder.id(), (entry) -> {
378+
list.add(new ClientboundRecipeBookAddPacket.Entry(entry, false, true));
379+
});
380+
addHighlight(player, recipeHolder, recipeBook);
381+
});
382+
383+
if (!list.isEmpty()) handle.connection.send(new ClientboundRecipeBookAddPacket(list, false));
384+
}
385+
386+
private void addHighlight(Player player, RecipeHolder<?> recipeHolder, ServerRecipeBook recipeBook) {
387+
try {
388+
var addHighlight = recipeBook.getClass().getDeclaredMethod("addHighlight", ResourceKey.class);
389+
var access = addHighlight.canAccess(recipeBook);
390+
if (!access) addHighlight.setAccessible(true);
391+
addHighlight.invoke(recipeBook, recipeHolder.id());
392+
addHighlight.setAccessible(access);
393+
} catch (Exception e) {
394+
group().getGroupProvider().getLogger().error("Failed to add recipe highlight for player {}", player.getName(), e);
395+
group().getGroupProvider().getLogger().error("Please look for similar issues or report this on GitHub: {}", ISSUES);
396+
}
397+
}
398+
358399
private void applyAdvancements(Player player, GroupSettings settings) {
359400
try {
360401
var handle = ((CraftPlayer) player).getHandle();

0 commit comments

Comments
 (0)