首页 > 其他分享 >forge教程

forge教程

时间:2023-09-25 14:22:53浏览次数:50  
标签:教程 Item texture 物品 myblock 方块 forge block

物品Item

介绍:物品就是所有只能抓在手中的,不能手动防置在level(世界)中的统称为物品。如果你问,那我把Item丢到level中呢?是方块,但是这是每种物品都会自带的掉落状态!

创建一个物品

当我们创建一个物品,我们当然要继承Item

public class MyItem extends Item {

//在我们创建MyItem时必须要传入物品的属性给到Item
    public MyItem (Properties properties) {
        super(properties);
    }
}

物品属性

第一次我们可以直接调用Item的内部类new Item.Properties()

物品属性还有很多这里我们就留给大家进入源码中探索,我也会不时把我学到的更新到这一节!

物品注册

大部分的东西都是用DeferredRegister注册到Minecraft中的!

DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);

这样我们就得到了Forge的方块注册表

 RegistryObject<Item> MyItem = ITEMS.register("myitem", () -> new MyItem(new Item.Properties()));

这里必须必须注意:ITEMS.register中第一个参数是物品的名称,最好是小写!

最后我们把这个Forge的物品注册表注册到游戏中去

 ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());

这里我们用到了是mod事件哦,为我事件那一节做铺垫!
这样完成后,你以为你的物品创建完了吗,并没有,不然你进入游戏就是这样的

这是我随便找的图,经供参考

物品材质

在textures目录的子文件夹Item中这里放置你的物品png
在models目录的子文件夹Item中防置你的物品模型json

在这里我给一个模型经供参考

{
	"parent": "minecraft:item/generated",
	"textures": {
		"layer0": "mymod:item/myitem"
	}
}

准备好这些,我们就可以进游戏体验我们的第一个物品了

方块Block

创建第一个方块

介绍:对于简单的方块,或者说那些没有特殊功能的方块(如圆石和木板等),你并不需要对它们单独创建一个类。你只需要实例化一个 Block 类并调用一些Setter方法,就能创建出很多不同种类的方块。

物品属性(Properties)

  • setHardness - 控制破坏方块所需要的时间。它可以是任意的值。方便参考起见,石头(Stone)的硬度(Hardness)为1.5,泥土(Dirt)的硬度为0.5。如果方块应该是不可破坏的,你可以直接调用 setBlockUnbreakable。
  • setResistance - 控制方块的爆炸抗性。虽然这个值是与硬度分开的,但是 setHardness 同样会将方块的爆炸抗性(Resistance)设置为5倍的硬度,如果爆炸抗性低于这个值的话。(译注:这个方法设置后的实际 blockResistance 是传入参数的3倍。 比如说石头的爆炸抗性(blockResistance)为30,但传入的参数为 10.0f。而setHardness 检测的是这个 blockResistance。但一般初始化方块的时候一般都先设置硬度再设置爆炸抗性)
  • setSoundType - 控制方块被击打、破坏、或放置时的声音。需要传入一个 SoundType 参数,具体请看音效那一节。
  • setLightLevel - 控制方块的发光程度。注意:这个方法接受一个0-1的值,而不是0-15。如果想要计算这个值,请用你需要的光亮等级除以16。比如说,如果一个方块的亮度为5,那么这里的参数需要为 5 / 16f。
  • setLightOpacity - 控制方块阻碍光线传播的程度。不像 setLightLevel,这个值的范围是0-15。比如说,将这个值设定为 3 时,每当光线穿过方块,光线的光亮等级将会减少3级。
  • setUnlocalizedName - 设置方块未本地化时(Unlocalized)的名字。这个名字会被前缀 “tile.”,并后缀 “.name” 以方便本地化。比如说,setUnlocalizedName("foo") 会将方块的本地化条目设置为 “tile.foo.name”。如果你需要更高级的本地化控制,那么你还需要一个自定义的物品(Item)类,我们将会在之后进行介绍。
  • setCreativeTab - 控制方块所在的创造面板。面板选项可以在 CreativeTabs 类下找到。

这里的物品属性我们要用BlockBehaviour.Properties这个内部类中的of方法

public static final RegistryObject<Block> myBlock = BLOCKS.register("myblock", () ->
            new Block(BlockBehaviour.Properties.of().strength(3.0f).sound(SoundType.CROP)));

方块注册

这里我们也是用到DeferredRegister类来获取forge的block注册表

public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID);

然后我们也要吧block注册表注册进入mod总线中

BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());

物品材质

在textures目录的子文件夹Block中这里放置你的物品png
在models目录的子文件夹Block中防置你的物品模型json

模型示例:

{
  "credit": "Made with Blockbench",
  "parent": "minecraft:block/cube_all",
  "texture_size": [
    64,
    64
  ],
  "textures": {
    "0": "mymod:block/myblock",
    "particle": "mymod:block/myblock"
  },
  "elements": [
    {
      "from": [
        0,
        0,
        0
      ],
      "to": [
        16,
        16,
        16
      ],
      "faces": {
        "north": {
          "uv": [
            0,
            0,
            4,
            4
          ],
          "texture": "#0"
        },
        "east": {
          "uv": [
            0,
            4,
            4,
            8
          ],
          "texture": "#0"
        },
        "south": {
          "uv": [
            4,
            0,
            8,
            4
          ],
          "texture": "#0"
        },
        "west": {
          "uv": [
            4,
            4,
            8,
            8
          ],
          "texture": "#0"
        },
        "up": {
          "uv": [
            4,
            12,
            0,
            8
          ],
          "texture": "#0"
        },
        "down": {
          "uv": [
            12,
            0,
            8,
            4
          ],
          "texture": "#0"
        }
      }
    }
  ],
  "display": {}
}

对于方块我们比物品多一步
在blockstates文件中还要添加一个json模型文件

{
    "variants": {
        "": [
            {
                "model": "mymod:block/myblock"
            },
            {
                "model": "mymod:block/myblock",
                "y": 90
            },
            {
                "model": "mymod:block/myblock",
                "y": 180
            },
            {
                "model": "mymod:block/myblock",
                "y": 270
            }
        ]
    }
}

这样我们的第一个物品就创建成功了!

没错我们的方块类中也有很多属性等待你去源码中探索哦!

ItemState

介绍:

为什么我分开讲,因为我觉得ItemState跟BlockState差别不大,而且这里面别有洞天!
Item 和 Block 只有一个,但是ItemState 和 BlockState 有无数个!
……
未更新完敬请期待!
……

事件

介绍:Forge使用的是一种事件总线(Event Bus)的机制,使mod能够从原版或者mod行为中截取事件(Event)。对于大部分事件的主事件总线位于 MinecraftForge.EVENT_BUS。
但是还是有很多事件很***钻!
特点:forge有两套bus分别如下
forge -> event : 游戏内发生的事,游戏已经在运行了!
Mod事件 ->Fml -> event :游戏生命周期发生的事,和世界内无关,游戏启动,物品注册,配置文件加载等等游戏还没正式运行时候! -> 一般实现了IModBusEvent就是mod事件

事件的分类

能力(Capability)

Capability Provider 要实现ICapabilityProvider, INBTSerializable接口

自定义properties中要定义好存储和读取的方法,使用CompoundTag 来序列化和反序列化数据

每一个Capability都要一个对应的provider,这个provider要继承ICapabilityProvider,INBTSerializable这两个接口
并且重写getCapability方法和serializeNBT,deserializeNBT两个序列化和反序列化的方法

getCapability需要一个LazyOptional的返回值

所以在provider中我们要创建一个LazyOptional

private final LazyOptional<PlayerProperties> lazyOptional = LazyOptional.of(() -> this.playerProperties);

这是一般创建LazyOptional的方法

serializeNBT,deserializeNBT

就是将我们在properties中自定义的存储和读取CompoundTag的方法传入进去

 @Override
    public Tag serializeNBT() {
        CompoundTag tag = new CompoundTag();
        playerProperties.saveData(tag);
        return tag;
    }
    @Override
    public void deserializeNBT(Tag nbt) {
        playerProperties.loadData((CompoundTag) nbt);
    }

标签:教程,Item,texture,物品,myblock,方块,forge,block
From: https://www.cnblogs.com/iloveworld/p/17715971.html

相关文章

  • 【Python入门教程】Python实现猜数字小游戏
    ​    今天跟大家分享一下很久之前自己做的一款猜数字小游戏,基本的循环判断语句即可实现,可以用来当练手或者消磨时间用。    大家在编代码的时候最重要就是先理清逻辑思路,例如应该套几层循环、分几个模块等等。然后在编码时可以先随意一点,变量名、函数等可以先......
  • 本地电脑打包安卓证书教程
    打包教程进入目录D:\phpstudy_pro\Extensions\jre1.8\bin键入CMD回车keytool-importkeystore-srckeystorehaiwaishifu.keystore-destkeystorehaiwaishifu.keystore-deststoretypepkcs12haiwaishifu.keystore证书名字或者keytool-genkey-aliastestalias-keyalg......
  • FL Studio怎么激活图文安装教程?FL Studio 21中文版下载 v21.1.1.3750 汉化
    flstudio21.0.3.3517中文解锁特别版是一款功能强大的编曲软件,也就是众所熟知的水果软件。它可以编曲、剪辑、录音、混音,让您的计算机成为全功能录音室。除此之外,这款软件功能非常强大,为用户提供了许多音频处理工具,包含了编排,录制,编辑,混音和掌握专业品质音乐所需的一切,支持多音轨录......
  • PostgreSQL教程:备份与恢复(物理备份、物理恢复)
    物理备份(归档+物理)这里需要基于前面的文件系统的备份和归档备份实现最终的操作单独使用文件系统的方式,不推荐毕竟数据会丢失。这里直接上PostgreSQL提供的pg_basebackup命令来实现。pg_basebackup会做两个事情、会将内存中的脏数据落到磁盘中,然后将数据全部备份会将wal日志直接做归......
  • PostgreSQL教程:事务的ACID特性及基本使用
    什么是ACID?在日常操作中,对于一组相关操作,通常要求要么都成功,要么都失败。在关系型数据库中,称这一组操作为事务。为了保证整体事务的安全性,有ACID这一说:原子性A:事务是一个最小的执行单位,一次事务中的操作要么都成功,要么都失败。一致性C:在事务完成时,所有数据必须保持在一致的状态。(事......
  • PostgreSQL教程:触发器
    触发器Trigger,是由事件触发的一种存储过程当对标进行insert,update,delete,truncate操作时,会触发表的Trigger(看触发器的创建时指定的事件)构建两张表,学生信息表,学生分数表。在删除学生信息的同时,自动删除学生的分数。先构建表信息,填充数据createtablestudent(idint,namev......
  • PostgreSQL教程:约束(主键、非空、唯一、检查约束)
    核心在于构建表时,要指定上一些约束。约束主键--主键约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32));非空--非空约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32)notnull);......
  • PostgreSQL教程:数组类型
    数组还是要依赖其他类型,比如在设置住址,住址可能有多个住址,可以采用数组类型去修饰字符串。PGSQL中,指定数组的方式就是[],可以指定一维数组,也支持二维甚至更多维数组。构建数组的方式:droptabletest;createtabletest(idserial,col1int[],col2int[2],col3......
  • PostgreSQL教程:JSON&JSONB类型
    JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。PGSQL支持JSON类型以及JSONB类型。JSON和JSONB的使用基本没区别。撇去JSON类型,本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验......
  • PostgreSQL教程:IP类型cidr
    PGSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac内种诡异类型也支持这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做范围查找。IP校验的效果IP也支持范围查找。......