Minecraft Forge编程入门二 “工艺和食谱”

时间:2024-03-06 18:18:14

从现在开始我们就要开始真正写代码了,还没有来得及配置环境的同学可以参考Minecraft Forge编程入门一 “环境搭建”这篇文章来进行环境搭建。

工艺(Craft)和食谱(Recepe)

所谓的工艺和食谱是指在Minecraft中物品的合成和合成表。

  • 工艺:指由一种或几种物品合成出另外一种物品,
    如常见的火把的合成:

  • 食谱:泛指物品合成的摆放顺序。有有形和无形两种,其中有形要求合成时物品间的相对位置不能变即形状不变,无形则只要求物品满足条件即可对形状没要求。
    如指南针的合成是有形的:

    稍微改变一下任何一个物品的顺序就无法合成了:

无形的食谱较少,当合成材料是一个的时候,可以说他是有形也可以说是无形。

或者

合成前的基础知识

ItemStack

在Minecraft中每种类型的方块和物品都不是多实例的,可以理解为你看到的土块在游戏内存中只是一个实例而已。这样做的目的显而易见,就是为了减少内存占用。
那如果我要表示一块土块要怎么做呢?

ItemStack dirtStack = new ItemStack(Blocks.dirt);

n块土块呢?

ItemStack dirtStack = new ItemStack(Blocks.dirt,n);

那如果不是土块而是羊毛呢?大家都知道羊毛是有颜色之分的?

ItemStack woolStack = new ItemStack(Blocks.wool, 2, 15);

ItemStack的构造方法大只就这三种,总结一下起语法:

ItemStack stack = new ItemStack((Object)ItemType,[(int)Stack Size],[(Object) Metadata]);

其中ItemType是必须的,另外的SizeMetadata是可选的。

  • ItemType表示物品或方块的类型,在forge中使用BlocksItems表示。
  • Size表示物品或方块的数量。
  • Metadata表示ItemType对应物品或方块的附加属性。

如果ItemType是羊毛Blocks.wool的话,Metadata就表示羊毛的颜色,Metadata取十进制Dec行的值。羊毛颜色如下:

由于在后面可能大量用到不同种类的ItemStack,这里我们定义一个java类,专门用来提供一些常用的ItemStack。

package com.zql.mc.zmod.itemstack;

import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;

/**
 *
 * @author scott 定义一些常用的物品组
 */
public class ArticleStacks {

    /**
     * 钻石 * 1
     */
    public final static ItemStack DIAMOND_STACK_1 = getItemStack(Items.diamond, 1);
    /**
     * 土块 * 1
     */
    public final static ItemStack DIRT_STACK_1 = getItemStack(Blocks.dirt, 1);

    /**
     * 沙子 * 1
     */
    public final static ItemStack SAND_STACK_1 = getItemStack(Blocks.sand, 1);

    /**
     * 羊毛 * 1 橙色
     */
    public final static ItemStack WOOL_ORANGE_1 = getItemStack(Blocks.wool, 1, 1);

    /**
     * 羊毛 * 1 黄色
     */
    public final static ItemStack WOOL_YELLOW_1 = getItemStack(Blocks.wool, 1, 4);

    /**
     * 羊毛 * 1 黑色
     */
    public final static ItemStack WOOL_BLACK_1 = getItemStack(Blocks.wool, 1, 15);

    /**
     *
     * @param item
     *            物品
     * @param count
     *            物品数量
     * @return
     */
    public static ItemStack getItemStack(Item item, int count) {
        return new ItemStack(item, count);
    }

    /**
     *
     * @param block
     *            方块
     * @param count
     *            方块数量
     * @return
     */
    public static ItemStack getItemStack(Block block, int count) {
        return new ItemStack(block, count);
    }

    /**
     *
     * @param block
     *            方块
     * @param count
     *            方块数量
     * @param metaData
     *            元数据,如方块是羊毛Wool的话,metaData的值是0~15,表示不同的颜色。
     * @return
     */
    public static ItemStack getItemStack(Block block, int count, int metaData) {
        return new ItemStack(block, count, metaData);
    }
}

读者也可以根据自己的需求往里面加不同的ItemStack。

无形合成配方

无形合成配方对物品或方块的顺序位置没有要求。
首先看一下添加无形合成配方的语法:

GameRegistry.addShapelessRecipe(ItemStack result, Object... recipe);

其中result表示合成结果,... recipe表示配方数组。

下面我们看一个简单的例子,用一个土块和一个沙块来合成一个钻石,