Minecraft 1.19.2 Forge模组开发 02.物品栏+方块+物品

news/2024/11/19 19:41:18/

今天是1024程序员日,我们尝试在1.19.2的模组中实现物品栏、方块和物品

1.在项目主类Main.java中添加物品栏声明,同时将物品和方块的类进行注册:

Main.java

package com.joy187.re8joymod;import com.joy187.re8joymod.init.BlockInit;
import com.joy187.re8joymod.init.ItemInit;
import com.mojang.logging.LogUtils;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Blocks;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.ForgeRegistries;
import org.slf4j.Logger;// The value here should match an entry in the META-INF/mods.toml file
@Mod(Main.MOD_ID)
public class Main
{// Define mod id in a common place for everything to referencepublic static final String MOD_ID = "re8joymod"; //修改为你的模组名称// Directly reference a slf4j loggerprivate static final Logger LOGGER = LogUtils.getLogger();//物品栏声明public static final CreativeModeTab TUTORIAL_TAB = new CreativeModeTab(MOD_ID) {@Overridepublic ItemStack makeIcon() {//这个是物品栏的图标使用哪个物品来展示return new ItemStack(BlockInit.EXAMPLE_BLOCK.get());}};public Main(){IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();// Register the commonSetup method for modloadingbus.addListener(this::commonSetup);bus.addListener(this::setup);//添加物品、方块的注册ItemInit.ITEMS.register(bus);BlockInit.BLOCKS.register(bus);// Register ourselves for server and other game events we are interested inMinecraftForge.EVENT_BUS.register(this);}private void setup(final FMLCommonSetupEvent event){}private void commonSetup(final FMLCommonSetupEvent event){// Some common setup codeLOGGER.info("HELLO FROM COMMON SETUP");LOGGER.info("DIRT BLOCK >> {}", ForgeRegistries.BLOCKS.getKey(Blocks.DIRT));}// You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent@Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)public static class ClientModEvents{@SubscribeEventpublic static void onClientSetup(FMLClientSetupEvent event){}}
}

2.Java包中新建init包,init包中新建一个我们的物品类ItemInit :

ItemInit.java

package com.joy187.re8joymod.init;import com.joy187.re8joymod.Main;
import net.minecraft.world.item.Item;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;import java.util.function.Supplier;public class ItemInit {public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Main.MOD_ID);//我们的第一个物品public static final RegistryObject<Item> LEI = register("lei",() -> new Item(new Item.Properties().tab(Main.TUTORIAL_TAB)));//第二个物品//public static final RegistryObject<Item> FAKE = register("fake",//        () -> new Item(new Item.Properties().tab(Main.TUTORIAL_TAB)));private static <T extends Item> RegistryObject<T> register(final String name, final Supplier<T> item) {return ITEMS.register(name, item);}
}

3.在init包中新建一个我们的方块类BlockInit:

BlockInit.java

package com.joy187.re8joymod.init;import com.joy187.re8joymod.Main;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.StainedGlassBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.material.MaterialColor;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;import java.util.function.Function;
import java.util.function.Supplier;public class BlockInit {public static DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Main.MOD_ID);public static final DeferredRegister<Item> ITEMS = ItemInit.ITEMS;//第一个方块 of(方块和什么类似,方块颜色) strength(挖掘时长(越大时间越长),防爆等级(越大越防爆)) sound(挖方块的声音) public static final RegistryObject<Block> EXAMPLE_BLOCK = register("example_block",() -> new Block(BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_PURPLE).strength(5f, 6f).sound(SoundType.METAL).requiresCorrectToolForDrops()),object -> () -> new BlockItem(object.get(), new Item.Properties().tab(Main.TUTORIAL_TAB)));//第二个方块//public static final RegistryObject<Block> HOT_BLOCK = register("hot_block",//      () -> new Block(BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_PURPLE).strength(5f, 6f)//            .sound(SoundType.METAL).requiresCorrectToolForDrops()),//    object -> () -> new BlockItem(object.get(), new Item.Properties().tab(Main.TUTORIAL_TAB)));private static <T extends Block> RegistryObject<T> registerBlock(final String name,final Supplier<? extends T> block) {return BLOCKS.register(name, block);}private static <T extends Block> RegistryObject<T> register(final String name, final Supplier<? extends T> block,Function<RegistryObject<T>, Supplier<? extends Item>> item) {RegistryObject<T> obj = registerBlock(name, block);ITEMS.register(name, item.apply(obj));return obj;}private static <T extends Block> RegistryObject<T> registerBlock(String name, Supplier<T> block, CreativeModeTab tab) {RegistryObject<T> toReturn = BLOCKS.register(name, block);registerBlockItem(name, toReturn, tab);return toReturn;}private static <T extends Block> RegistryObject<Item> registerBlockItem(String name, RegistryObject<T> block,CreativeModeTab tab) {return ItemInit.ITEMS.register(name, () -> new BlockItem(block.get(),new Item.Properties().tab(tab)));}private static <T extends Block> RegistryObject<T> registerBlockWithoutBlockItem(String name, Supplier<T> block) {return BLOCKS.register(name, block);}public static Supplier<Block> createStainedGlassFromColor(DyeColor color) {return () -> new StainedGlassBlock(color, BlockBehaviour.Properties.of(Material.GLASS, color).strength(0.3F).sound(SoundType.GLASS).noOcclusion().isValidSpawn(BlockInit::never).isRedstoneConductor(BlockInit::never).isSuffocating(BlockInit::never).isViewBlocking(BlockInit::never));}public static boolean always(BlockState state, BlockGetter reader, BlockPos pos) {return true;}public static boolean never(BlockState state, BlockGetter reader, BlockPos pos) {return false;}public static boolean always(BlockState state, BlockGetter reader, BlockPos pos, EntityType<?> entityType) {return true;}public static boolean never(BlockState state, BlockGetter reader, BlockPos pos, EntityType<?> entityType) {return false;}
}

4.代码部分结束,进入资源包制作环节:

CR.png

resources/assets/lang/你的模组名称包中的en_us.json中添加英文名称:

en_us.json

{"item.re8joymod.lei":"125 Lei","block.re8joymod.example_block": "Umbrella Block","itemGroup.re8joymod": "RE8 Item"
}

在zh_cn.json中添加中文名称:

zh_cn.json

{"item.re8joymod.lei":"125 物品","block.re8joymod.example_block": "方块","itemGroup.re8joymod": "RE8 物品栏"
}

blockstates包中新建一个我们的方块文件,指明其模型位置:

example_block.json

{"variants": {"": {"model": "re8joymod:block/example_block"}}
}

models/block中添加方块的模型文件:

example_block.json

{"parent": "block/cube_all","textures": {"all": "re8joymod:block/example_block"}
}

models/item中添加方块和物品的手持模型文件:

添加方块的手持模型文件:

example_block.json

{"parent": "re8joymod:block/example_block"
}
添加物品的手持模型文件:

lei.json

{"parent": "item/generated","textures": {"layer0": "re8joymod:item/lei"}
}

textures/block中添加方块的贴图,在textures/item中添加物品的贴图:

pic

5.在resources/data文件夹下新建2个文件夹,一个叫minecraft,另一个是你的模组名称(以re8joymod为例)

在minecraft文件夹中新建 -> tags文件夹 -> tags包中新建blocks文件夹 -> blocks包中新建mineable文件夹 ->在mineable中新建 pickaxe.json(定义方块是否可挖掘)

pickaxe.json

{"replace": false,"values": ["re8joymod:example_block"   //这里面的方块都是可以被挖掘的]
}

在re8joymod中新建loot_tables文件夹 -> 在loot_tables中新建blocks文件夹 -> 在blocks文件夹中新建 方块名.json(名称与BlockInit.java中你自定义的方块名称保持一致)

example_block.json(挖掉之后方块的掉落物)

{"type": "minecraft:block","pools": [{"rolls": 1.0,"entries": [{"type": "minecraft:item","name": "re8joymod:example_block"   //掉落物格式:模组名称:物品、方块的名称,原版默认是minecraft:xxx}]}]
}

6.保存所有文件,刷新项目,启动游戏

cr5.jpg

OK,完美!


http://www.ppmy.cn/news/287196.html

相关文章

梦世界服务器修改指令,我的世界梦世界指令大全 实用指令汇总

我的世界梦世界是一个人气非常高的服务器&#xff0c;拥有起床战争、空岛战争、饥饿游戏、死亡大逃杀、职业乱斗、吸氧羊大作战、贪吃蛇等经典小游戏&#xff0c;小编为您带来我的世界梦世界指令大全。 我的世界梦世界指令大全 island可以缩写为is /island - 显示插件信息 /isl…

我的世界服务器指令标题显示,我的世界命令方块 如何用命令方块显示标题

导读 大家好,下面是小编给大家带来的我的世界命令方块 如何用命令方块显示标题,希望能帮到大家! 【本文转自我的世界官方论坛,原作者:Netro777】 有不好的地方请大家见谅。。。版本1.9/1.9以上 因为自从有了1.9以后title指令的Json信息变了 教你如何用命令方块显示标题 下…

我的世界服务器玩家在线指令,我的世界指令大全 各类指令汇总

在我的世界中使用指令的话会给玩家带来很多便利&#xff0c;这次小编就为诸位玩家带来我的世界指令大全 各类指令汇总。 Hcharger_hs_training:建图指令map charger_hs_training witch_crown:建图指令map witch_training suvi8 建图指令&#xff1a;map suvi8 1/register XXX …

命令方块召唤别墅指令_命令方块其实不难玩!

#新作者扶植计划 第二期# 大家好&#xff0c;是我指令师。 想必各位我的世界玩家都遇到过一个问题。生存创造都已经玩的如火纯青了&#xff0c;但想向我的世界的高阶玩法前进———指令&#xff0c;但却不知道指令该如何使用&#xff0c;如何操作和操作格式&#xff0c;今天我就…

我的世界服务器怎么修改小标题,我的世界标题指令

title就是在屏幕的某个位置出现字体(可自定义)&#xff0c;用处很广&#xff0c;在PVP、PVE地图中经常用到。title指令的标准格式&#xff1a;/title a(玩家) title(位置) {"text":"给个小麦吧(文字内容)"}。 正确答案 1、title指令的大致理解&#xff1a;…

我的世界服务器显示空岛等级,我的世界空岛指令

满意答案 winpnie 2020.09.12 采纳率&#xff1a;43% 等级&#xff1a;10 已帮助&#xff1a;718人 去百度文库&#xff0c;查看完整内容> 内容来自用户:我是一只咪丶 我的世界空岛指令&#xff1a; /island -显示插件信息 /island create -创建一个新的岛屿 /island cre…

mc服务器地皮系统权限指令,我的世界常用地皮指令 全地皮指令分享

我的世界常用地皮指令&#xff0c;全地皮指令分享。最近很多玩家在问我的世界常用地皮指令有哪些?其实是有一个地皮世界插件的&#xff0c;相信很多老玩家都用过这个插件。下面小兮就跟大家分享下全地皮指令列表一览&#xff0c;希望对各位有所帮助哦! 指令 解释 /plotme clai…

服务器无法取消指令方块显示,我的世界禁止命令方块运行

我的世界服务器如何关掉命令方块的提示(如图) /gamerule commandBlockOutput false 我的世界如何远程停止命令方块运行? 如果你还记得你放置命令方块的位置,用setblock指令把你放命令方块的位置替换成空气就行了,不记得的话,那就没什么办法了 我的世界怎么屏蔽命令方块发出…