《我的世界Mod开发应用之一》1.14.4【物品属性】

首先最近知り合いの方が1.14.4で開発してる&正直1.7.10のModdingに飽きてきたので1.14.4を初めて触ってみました。
予想ですが、バニラのコード見てても開発側ですら仕様変更に追いつけてない気がします。
いろいろ変わりすぎて終始「???」って感じでした。笑

可以看朋友写的基础说明,非常易懂,请参阅那边。
这里是《Minecraft 1.14.4 Forge Mod的制作 第1部分》,我打算写应用方面的对抗!

2019/12/28补充:
我也写了一篇关于环境配置的文章,希望你一定要看一下。点击这里阅读。

开发环境

    • Windows 10

 

    • Minecraft 1.14.4

 

    • Minecraft Forge 1.14.4-28.1.79

 

    • IntelliJ IDEA 2019.2.4

 

    • Gradle 4.9

 

    Forge Gradle 3.+

请注意这个解说系列适合那些能够在一定程度上自己进行Modding的人。
基础部分不会过多解说,所以请参考一下先驱者的解说或者视频。
由于这是我第一次接触1.14.4版本,所以写得有些摸索。应该还有更好的编码方法。
另外,由于类的数量较多,我会在代码中直接进行解说,希望您不要介意。

我们来制作吧!

关于概念的问题本次我打算尝试制作一个综合工具。我将继承我个人制作的规格。

ツルハシ、シャベル、オノとして機能する (主目標1 理解できれば割と簡単)

NBTTagを利用して破壊速度を変更できるモードの実装 (主目標2 コード長くてばりめんどい)

自動で耐久が回復する (ついで めっちゃ簡単)

をやりたいと思います。私はクワは武器としてアホみたいなスペックで用意したい派なので、クワの機能は追加しません。
が、すぐ実装可能なのでコンセプトを達成できた後にちょこっと解説しようと思います。

并且,作为本次的重点,有Item.Properties和NBTTagCompound。
在本文中,我们主要解释Item.Properties。

实现了模板和助手等构建块

package rise.sunrisecraft.common;

import rise.sunrisecraft.lib.ToolMaterial;

@Mod("sunrisecraft")
public class SunriseCraft {

    public static final String MOD_ID = "sunrisecraft";

    static ToolMaterial TOOL_RISEMOND = new ToolMaterial(4, 4800, 17F, 10F, 42);
}

本来はコンストラクタでFMLCommonSetupEventなどを呼び出す必要があったりするのですが、
アイテムの追加程度であればなくても動きます。

package rise.sunrisecraft.lib;

public class ToolMaterial implements IItemTier {

    private float attackDamage, efficiency;
    private int maxUses, harvestLevel, enchantability;
    private ItemStack repairStack;

    public ToolMaterial(int harvestLevel, int maxUses, float efficiency, float attackDamage, int enchantability)
    {
        this.harvestLevel = harvestLevel;
        this.maxUses = maxUses;
        this.efficiency = efficiency;
        this.attackDamage = attackDamage;
        this.enchantability = enchantability;
    }

    /**
     * Set item for repair.
     * @param itemStack Repair item (ItemStack)
     * @return ToolMaterial
     */
    public ToolMaterial setRepairItem(ItemStack itemStack)
    {
        this.repairStack = itemStack;
        return this;
    }

    @Override
    public int getMaxUses() { return this.maxUses; }

    @Override
    public float getEfficiency() { return this.efficiency; }

    @Override
    public float getAttackDamage() { return this.attackDamage; }

    @Override
    public int getHarvestLevel() { return this.harvestLevel; }

    @Override
    public int getEnchantability() { return this.enchantability; }

    @Override
    public Ingredient getRepairMaterial() { return Ingredient.fromStacks(this.repairStack); }
}

1.7.10時代に使われていたToolMaterialはIItemTierに変更されました。
その度に個別クラスを継承するのは面倒くさかったので、ヘルパークラスとして上記のものを書きました。
1.7.10ではEnumHelper.addToolMaterial(…)を使っていましたが、このクラスはインスタンスを作るだけです。
今回のツールではIItemTierを継承したクラスを取得する必要があるので作りました。

package rise.sunrisecraft.common;

@Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
public class RegisterHandler {

    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event)
    {
        event.getRegistry().registerAll(ItemRegistry.ITEMS.toArray(new Item[0]));
    }
}

@Mod.EventBusSubscriberは自動的にイベントとして認識してくれるため、
メインクラスにイベント呼び出し用のメソッドを書かなくていいのはこのためです。
registerItems()では、ItemRegistryのITEMS内のコンテンツを全て自動的にメタ値0でアイテムとして登録してくれます。
本来メタデータとして0~15を適切に呼び出す必要がありましたが、1.14.4では使用頻度がほぼないのでこれで問題ありません。
自作でメタ値をもたせたい場合はPropertyEnumなどを作ってこのメソッド内で適切に処理をする必要があります。

package rise.sunrisecraft.common;

public class ItemRegistry {

    public static final List<Item> ITEMS = new ArrayList<>();

    public static final Item RISEMOND_HAMMER = new ItemHammer("risemond_hammer", SunriseCraft.TOOL_RISEMOND);

}

只需要进行初始化,就会自动注册到列表中,所以可以忽略未使用的警告。现在让我们进入正题,来看看工具类吧!

制作一个工具类

package rise.sunrisecraft.item;

import rise.sunrisecraft.common.ItemRegistry;
import rise.sunrisecraft.common.SunriseCraft;
import rise.sunrisecraft.lib.ItemProperties;
import rise.sunrisecraft.lib.ToolMaterial;

public class ItemHammer extends ToolItem {

    public ItemHammer(String name, ToolMaterial material)
    {
        super(material.getAttackDamage(), 9F, material, new HashSet<Block>(),
                new ItemProperties()
                .setItemGroup(SunriseCraft.GROUP_SUNRISE)
                .setHarvestLevel(ToolType.PICKAXE, material.getHarvestLevel())
                .setHarvestLevel(ToolType.SHOVEL, material.getHarvestLevel())
                .setHarvestLevel(ToolType.AXE, material.getHarvestLevel())
        );
        this.setRegistryName(new ResourceLocation(SunriseCraft.MOD_ID, name));
        ItemRegistry.ITEMS.add(this);
    }
}
37364e705eb3479080ef19f7ad64e3d7.png

Item.Properties的用途是什么?

    • 最大スタックサイズの設定

 

    • クリエイティブタブの指定

 

    食料としての機能の実装

像你所说的,Item类内部的方法已经不再可以对物品进行细致的设置了。现在我们可以通过Item.Properties来统一管理它们。除此之外,还有其他各种物品也被替换成了它。

然后,在1.7.10版本中,我们使用addToolType()来实现与setHarvestLevel()功能相当的功能,添加了镐、铲和斧头的功能。
但是,现在输入方式从字符串形式改为引用ToolType。
※第二个参数ToolMaterial是我们之前创建的助手类。

你不是已经不再使用这个东西了吗?
为了方便我创建这个项目,我创建了一个辅助类,可以使用与1.7.10方法相同或类似的名称进行调用。


package rise.sunrisecraft.lib;

public class ItemProperties extends Item.Properties {

    /**
     * Set max stack size.
     * @param stackSize Max stack size
     * @return Properties
     */
    public ItemProperties setMaxStackSize(int stackSize)
    {
        return (ItemProperties) this.maxStackSize(stackSize);
    }

    /**
     * Set max damage value
     * @param maxDamage Max damage value
     * @return Properties
     */
    public ItemProperties setMaxDamage(int maxDamage)
    {
        return (ItemProperties) this.defaultMaxDamage(maxDamage);
    }

    /**
     * Set container item (In crafting: return to crafting grid)
     * @param containerItem Container item
     * @return Properties
     */
    public ItemProperties setContainerItem(Item containerItem)
    {
        return (ItemProperties) this.containerItem(containerItem);
    }

    /**
     * Set item group
     * @param group Item group (Creative tab)
     * @return Properties
     */
    public ItemProperties setItemGroup(ItemGroup group)
    {
        return (ItemProperties) this.group(group);
    }

    /**
     * Set item rarity
     * @param rarity Rarity
     * @return Properties
     */
    public ItemProperties setRarity(Rarity rarity)
    {
        return (ItemProperties) this.rarity(rarity);
    }

    /**
     * Set harvest type and level. (Like "pickaxe", "shovel", "axe" ... and other type from any mods.)
     * @param toolType Tool type
     * @param level Harvest level
     * @return Properties
     */
    public ItemProperties setHarvestLevel(ToolType toolType, int level)
    {
        return (ItemProperties) this.addToolType(toolType, level);
    }
}

コードに書いてる説明の通りの働きをします。基本的に名前を変えただけなので挙動は元のクラスと同じです。

结束
本次我进行了关于Item.Properties的解说。Item.Properties是物品实现中必不可少的存在,所以建议您先浏览原始类。作为一个复合工具,这就够好了,但是下次我想使用NBTTagCompound来实现一些功能,比如物品的模式切换等。

期待着吧!

下一篇文章:Minecraft Modding 应用② 1.14.4【CompoundNBT】

bannerAds