跳到正文
烈焰甘蔗Wiki

Refined Firestone(精炼余烬石)效果

[!WARNING] 已订正(1.7.10 树) 原条目的方法签名全部是 1.12.2 API。1.7.10 源码树中 EnumHand / BlockPos 零命中,onItemUse 的签名是 (ItemStack, EntityPlayer, World, int x, int y, int z, int side, float, float, float), 且 没有 itemInteractionForEntity(ItemStack, EntityPlayer, EntityLivingBase, EnumHand) 这个方法。

另:注册名是 railcraft.firestone.refined(点号式), 原条目写的 railcraft:firestone_refined(下划线)是错的。 证据:firestone/ItemFirestoneRefined.java:35,58,68-85,105-148、 firestone/ItemFirestoneRefined.java:40(String tag)。

基本信息

属性 值
来源物品 ItemFirestoneRefined
注册名 railcraft.firestone.refined
基类 ItemFirestoneBase → ItemRailcraft
耐久上限 5000(setMaxDamage(5000),ItemFirestoneRefined.java:58)
热量值 250(HEAT,ItemFirestoneRefined.java:35)
可堆叠 否
常量名 是 HEAT,不是 CHARGES(1.7.10 中无 CHARGES 常量)

熔炼 / 助燃效果(onItemUse 第一段,:105-121)

public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z,
                         int side, float hitX, float hitY, float hitZ) {
    if (player.canPlayerEdit(x, y, z, side, stack)) {
        Block block = WorldPlugin.getBlock(world, x, y, z);
        if (block != null && block != Blocks.stone) {
            List<ItemStack> drops = block.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
            if (drops.size() == 1 && drops.get(0) != null && drops.get(0).getItem() instanceof ItemBlock) {
                ItemStack cooked = FurnaceRecipes.smelting().getSmeltingResult(drops.get(0));
                ...
                stack.damageItem(1, player);
                return true;
            }
        }
    }
    ...
}

触发条件(比原条目严格得多):

条件 要求
编辑权限 player.canPlayerEdit(x, y, z, side, stack)
目标方块 非 Blocks.stone(原条目说「右击石头」,说反了)
掉落物 block.getDrops(...) 必须恰好 1 个
掉落物类型 必须是 ItemBlock
熔炼配方 FurnaceRecipes.smelting().getSmeltingResult() 必须有结果且为 ItemBlock

满足则用熔炼产物替换方块、播放 fire.ignite 音效、扣 1 点耐久。

生火效果(onItemUse 第二段,:123-148)

若上面未返回,按点击的面(side 0–5)调整目标坐标: side==0 → y--;1 → y++;2 → z--;3 → z++;4 → x--;5 → x++。

然后要求 player.canPlayerEdit(...) 且 world.isAirBlock(x, y, z), 则放置 Blocks.fire、播放 fire.ignite、扣 1 点耐久。

热量值(getHeatValue,:87-92)

public int getHeatValue(ItemStack stack) {
    if (stack.getItemDamage() < getMaxDamage())
        return HEAT;      // 250
    return 0;
}

1.7.10 中该方法是 getHeatValue(ItemStack),不是 1.12.2 的 getItemBurnTime(ItemStack)。 耐久未耗尽时恒返回 250,耗尽后返回 0。

容器物品(getContainerItem,:67-85)

public boolean hasContainerItem(ItemStack stack) { return true; }

public ItemStack getContainerItem(ItemStack stack) {
    double damageLevel = (double) stack.getItemDamage() / (double) stack.getMaxDamage();
    if (MiscTools.RANDOM.nextDouble() < damageLevel * 0.0001) {
        newStack = ItemFirestoneCracked.getItemEmpty();
        if (stack.hasDisplayName()) newStack.setStackDisplayName(stack.getDisplayName());
    } else
        newStack = stack.copy();
    newStack.stackSize = 1;
    newStack = InvTools.damageItem(newStack, 1);
    return newStack;
}
行为 内容
容器物品 恒返回 true
退化概率 damageLevel × 0.0001,退化后变为 ItemFirestoneCracked(保留自定义名)
耐久 每次 damageItem(newStack, 1)
数量 恒为 1

物品提示(addInformation,:94-103)

  • 耐久剩余 > 5:显示 .tip.charged
  • 耐久剩余 ≤ 5:显示 .tip.empty

创造模式物品栏(getSubItems,:60-65)

同时提供满耐久(getMaxDamage())与零耐久两个堆栈。

1.7.10 中不存在的机制

原条目声称 1.7.10 实际情况
itemInteractionForEntity(..., EnumHand) 点燃生物 方法不存在,无此功能
target.setFire(5) 点燃生物 无对应代码
在目标脚下生成火 无对应代码
public static final int CHARGES = 5000 常量名为 HEAT;5000 来自 setMaxDamage(5000)

相关条目

浏览全部模组