凤梨通灵术 文档

凤梨通灵术简单概述

这个模组曾经是为帕斯特之梦作为外置修正库,直到帕斯特的开发者们发现如何在MCr的代码中修正问题。

因此现在仅仅是为作者提供一些重复的“通用代码”的库,它能够帮助压缩一些制作模组的时间。

但是我意识到了一些问题,我的代码库制作后并没有得到充分利用,但是本身也没有很多内容,因此我制作了1.16.5分支并且加入了一些简单的方法。

凤梨通灵

首先构建起一个1.16.5,Forge版本高于或等于36.2.0的工作区。在项目根目录中创建libs文件夹,把凤梨通灵术的jar放入libs文件夹。

打开build.gradle,在里面加入以下内容:

repositories {
    flatDir{ dirs 'libs'}
}

dependencies {
    compile "club.someoneice.pineapplepsychic:pineapple_psychic-1.0"
}

刷新Gradle项目,你的库中就会多出凤梨通灵术的包。现在你可以正常的创建主类和注册方法了。

凤梨通灵术没有提供很多功能,但是你可以不用手动创建一些没有特殊功能的物品,现在你可以使用以下内容:

  • 普通物品;
  • 允许参与合成并指定耐久度的物品,以及其返还物品;
  • 食物;
  • 普通方块;
  • 作物;

不需要复杂的工程,一个主类,一个注册表,你就能创造更多东西以最简单的方式。

主类:

import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Mod(Main.MODID)
public class Main {
    public static final String MODID = "modid";
    public static final String Version = "version";
    public static final Logger LOGGER = LogManager.getLogger("[modid/modname]");

    public Main() {
        MinecraftForge.EVENT_BUS.register(this);  // 访问总线
        ItemRegistry.ItemList.register(FMLJavaModLoadingContext.get().getModEventBus());   //Here is ItemRegister  这里用于修饰物品注册类ItemRegister
    }
}

注册类:

import net.minecraft.item.*;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.registries.DeferredRegister;

import javax.annotation.Nonnull;
import java.util.function.Supplier;

@Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ItemRegistry {
    public static final DeferredRegister<Item> ItemList = DeferredRegister.create(Item.class, Main.MODID);

    // TODO - Here is Item  这里放注册的物品。

    public static RegistryObject<Item> register(@Nonnull Supplier<Item> initializer, @Nonnull String name) {
        return ItemList.register(name, initializer);
    }
}

现在你已经有了一个主类和注册类,可以开始使用凤梨通灵术方便的创建你的物品了。

// 物品演示
public static final RegistryObject<Item> CAN = register(() -> Itemlist.itemItem(64, ItemGroup.TAB_MISC),"can");
public static final RegistryObject <Item> KNIFE = register(() -> Itemlist.itemCraftingItem(1, 20, 1, null,  ItemGroup.TAB_TOOL),"knife");

演示中我创建了两个物品:罐子Can和刀子Knife。

罐子中涉及到的参数是最大堆叠和分组,刀子中的参数是最大堆叠,最大耐久,每次合成消耗耐久,耐久用尽返还物品和分组。

刀子允许在工作台中与其他物品一起合成,每次合成消耗指定的耐久。如果你希望用坏后返还物品,可以将null改为指定的返还物品。

// 食物演示
 public static final RegistryObject<Item> PINEAPPLE = register(()-> Itemlist.itemFood(1, 0, false, false, true, 64, new Effect[]{}, 0, 0, 0, UseAction.EAT, Items.GLASS, ItemGroup.TAB_FOOD),"pineapple");

这里需要导入Itemlist类,并使用了Food方法。方法详细参数:

数据类型 - 参数内容 - 参数解释
int nutrition 饥饿值,正数。原版中饥饿值最高20点。
float saturation 饱和度,浮点数。饱和度不会超过玩家当前的饥饿值,实际饱和度 = 饥饿值 * (饱和度 * 2),若饥饿值为5,饱和度设为0.5F时饱和度同为5。
boolean isMeat 肉类,若为true,食物可以喂狼。
boolean fastFood 快速食用,若为true,着食用速度为16,但是这个数也可以被自定,不过凤梨通灵没有提供这个参数。
boolean alwaysEat 总是食用,就像金苹果一样,食物无论是否满腹都能食用。
int MixStacks 最大堆叠,超出64的也只能堆叠到64。
Effect[] effects 效果,这里填入的效果将会全部被加入到食物上。使用方法:new Effect[]{Effec.xxx , Effect.xxx}
效果在大括号中写入,若你希望加入自己写的效果,可能没有办法在这里被定义,可能因为加载顺序问题,你需要自己开一个类调用你的效果。若没有效果,大括号留空即可。
int getEffectTime 效果时间,推荐使用20 * n的写法,这样直观。因为这里的时间是计算tick,而20tick是一秒,20 * n中n可以直接代表秒数。没有效果时不生效。
int getEffectLever 效果等级,当为0时,效果为1级,为1时效果为2级,以此类推。过高的等级可能没有更好的效果。没有效果时不生效。
float random 获得概率,浮点数。为1F时代表100%获取,0.55F着代表55%概率获得。没有效果时不生效。
UseAction UseAnim 使用方法,物品是食用,还是饮用,亦或者像拉弓一样使用,通过这个方法可以被定义。使用方法:UseAction.EAT/UseAction.DRINK...... 在IDE中按住Ctrl点击UseAction可以检查当前版本允许的全部方法。
IItemProvider getItem 返还物品,设定使用后返还什么物品。比如返还玻璃瓶:Items.GLASS_BOTTLE 。如果你希望返还你定义的物品,返还的物品的注册优先级必须高于这个物品。比如我希望喝完苏打返还罐子,应该如下使用:
public static final RegistryObject<Item> CAN = register(() -> ItemList.itemItem(64, ItemGroup.TAB_MISC),"can");
public static final RegistryObject<Item> SODA= register(()-> Itemlist.itemFood(1, 0, false, false, true, 64, new Effect[]{}, 0, 0, 0, UseAction.DRINK, ItemRegister.CAN, ItemGroup.TAB_FOOD),"soda");
若你颠倒了顺序,把CAN放在了SODA的下面,那将会无法返还任何物品。不返还物品时可以设为null。

ItemGroup Group 物品分组,可以设定你自己的分组,也可以用原版的分组。

创建分组:

    public static ItemGroup pineapple = new ItemGroup("pineapple") { // 设定为你的分组名和方法名

        @Override
        public ItemStack makeIcon() {
            return new ItemStack(ItemRegister.PINEAPPLE.get()); // 闻起来需要一个物品来成为分组贴图
        }
    };

方块类注册食谱相同:

import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.material.Material;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fmllegacy.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;

import javax.annotation.Nonnull;
import java.util.function.Supplier;

@Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class BlockRegistry {
    public static final DeferredRegister<Block> BlockList = DeferredRegister.create(Block.class, partyrecipes.MODID);

    public static RegistryObject<Block> registerBaseBlock(@Nonnull Supplier<Block> initializer, @Nonnull String name) {
        return BlockList.register(name, initializer);
    }
}

这里可以直接创建方块。

public static final RegistryObject<Block> SEED = register(BlockCrop::new, "seed");
public static final RegistryObject<Block> BLOCK = register(BlockBlocks::new, "block");

// 别忘了去物品注册类里注册BlockItem
public static final RegistryObject<Item> obsidianBlock = ITEMS.register(() -> new BlockItem(BlockRegistry.SEED.get(), new Item.Properties().group(ItemGroup.TAB_MISC)), "my_seed");