You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:11:28