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) |
相关条目
- Firestone 效果 - 余烬石的自定义掉落物实体
- Firestones