自定义CampfireRecipe概率掉落失效问题求助(Spigot 1.20.1)
问题原因分析
你的代码存在核心逻辑错误:当服务器启动注册配方时,getMaterialWithProb()只会执行一次,直接把配方的结果固定成牛肉或骨头中的一种,之后所有腐肉烧制都会得到同一个固定结果,完全不会触发概率判断。CampfireRecipe本身是静态配置,无法直接实现动态概率掉落。
解决方案
要实现概率掉落,需要分两步:注册基础配方,再通过事件监听动态修改烹饪结果。
1. 修改配方注册类
先注册一个结果为生牛肉的基础配方,不需要在注册阶段处理概率:
package es.exmaster.simpletools.recipes; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.inventory.CampfireRecipe; import org.bukkit.inventory.ItemStack; import es.exmaster.simpletools.Main; public class RottenFleshCampfireRecipe { public static CampfireRecipe get() { NamespacedKey rottenRecipeKey = new NamespacedKey(Main.plugin, "rotten_campfire_recipe"); // 注册基础配方,结果默认为生牛肉 return new CampfireRecipe( rottenRecipeKey, new ItemStack(Material.BEEF), Material.ROTTEN_FLESH, 0, 200); } }
2. 添加烹饪事件监听器
通过CampfireCookEvent捕获烹饪行为,在每次完成前根据概率替换结果:
package es.exmaster.simpletools.listeners; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.CampfireCookEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import es.exmaster.simpletools.Main; public class CampfireCookListener implements Listener { public CampfireCookListener() { // 注册监听器 Main.plugin.getServer().getPluginManager().registerEvents(this, Main.plugin); } @EventHandler public void onCampfireCook(CampfireCookEvent event) { Recipe recipe = event.getRecipe(); // 验证是否为我们的腐肉烧制配方 if (recipe != null && recipe.getKey().equals(new NamespacedKey(Main.plugin, "rotten_campfire_recipe"))) { // 30%概率将结果替换为骨头 if (Math.random() <= 0.30) { event.setResult(new ItemStack(Material.BONE)); } // 概率外保持原结果(生牛肉) } } }
3. 初始化监听器与配方
在主类Main的onEnable方法中完成配方注册和监听器初始化:
@Override public void onEnable() { // 注册腐肉烧制配方 getServer().addRecipe(RottenFleshCampfireRecipe.get()); // 初始化烹饪事件监听器 new CampfireCookListener(); }
关键说明
- CampfireRecipe是静态配方,注册时就固定了输出,无法直接实现动态逻辑
CampfireCookEvent是专门用于监听营火烹饪的事件,能精准拦截指定配方的烹饪行为- 概率判断放在事件监听中,每次烹饪都会重新计算,确保随机性生效
内容的提问来源于stack exchange,提问作者GalliardDev
相关产品推荐
相关产品推荐

