MC 1.20.1 Forge开发(3)创造模式物品栏以及实体的注册
在项目根目录下创建creativetab包新建TabReg.javaimport craftedegg.rbw.item.ItemReg; import java.util.Iterator; import java.util.Random; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; public class TabReg { public static final DeferredRegisterCreativeModeTab CREATIVE_MODE_TABDeferredRegister.create(Registries.CREATIVE_MODE_TAB, rbw); public static final RegistryObjectCreativeModeTab MOD_TAB CREATIVE_MODE_TAB.register(tab, () - CreativeModeTab.builder().withTabsBefore(CreativeModeTabs.COMBAT).title(Component.translatable(creativetab.rbw.tab)).icon(() - ((Item)((RegistryObject)ItemReg.rbwItems.get((new Random()).nextInt(ItemReg.rbwItems.size()))).get()).getDefaultInstance()).displayItems((parameters, output) - { output.accept(ItemReg.BOMB_BENCH_ITEM.get()); output.accept(ItemReg.GUARANTEE.get()); Iterator var2 ItemReg.rbwItems.iterator(); while(var2.hasNext()) { RegistryObjectItem item (RegistryObject)var2.next(); output.accept(item.get());} }).build());; }也是直接用循环直接注册数组里的物品到物品栏在主类的构造方法里加上TabReg.CREATIVE_MODE_TAB.register(modEventBus);注册到事件总线。接下来讲解如何注册实体新建entity包新建EntityReg.javapackage craftedegg.rbw.entity; import craftedegg.rbw.Main; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class EntityReg { public static final DeferredRegisterEntityType? ENTITY_TYPES DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, Main.MODID); public static final RegistryObjectEntityTypeBombEntity BOMB_ENTITY ENTITY_TYPES.register(bomb, () - EntityType.Builder.BombEntityof(craftedegg.rbw.entity.BombEntity::new, MobCategory.MISC).fireImmune().sized(0.98F, 0.98F).clientTrackingRange(10).updateInterval(10).build(bomb)); }新建炸弹实体BombEntity.javapackage craftedegg.rbw.entity; import java.util.HashSet; import java.util.List; import java.util.Set; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.PrimedTnt; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; public class BombEntity extends PrimedTnt { private static final SetBlock UNBREAKABLE new HashSet(); static { //设置一下不可破坏的方块 UNBREAKABLE.add(Blocks.BEDROCK); UNBREAKABLE.add(Blocks.BARRIER); UNBREAKABLE.add(Blocks.END_PORTAL_FRAME); UNBREAKABLE.add(Blocks.END_PORTAL); UNBREAKABLE.add(Blocks.END_GATEWAY); UNBREAKABLE.add(Blocks.STRUCTURE_BLOCK); UNBREAKABLE.add(Blocks.STRUCTURE_VOID); UNBREAKABLE.add(Blocks.COMMAND_BLOCK); UNBREAKABLE.add(Blocks.CHAIN_COMMAND_BLOCK); UNBREAKABLE.add(Blocks.REPEATING_COMMAND_BLOCK); UNBREAKABLE.add(Blocks.REINFORCED_DEEPSLATE); UNBREAKABLE.add(Blocks.NETHER_PORTAL); } public float range 10.0F;//默认炸弹威力 public BombEntity(EntityType? extends BombEntity p_32076_, Level p_32077_) { super(p_32076_, p_32077_); this.setFuse(0); this.blocksBuilding true; } public void setRange(float range) { this.range range; } Override public void explode() { //爆炸算法这是核心 //对于不同的方块要考虑爆炸等级的不同并考虑威力的衰减 Level level this.level(); if (level.isClientSide) return; BlockPos center this.blockPosition(); float R this.range; int intR (int)Math.ceil(R); int intR2 intR * intR; for (int x -intR; x intR; x) { int x2 x * x; if (x2 intR2) continue; int yzMax (int)Math.sqrt(intR2 - x2); for (int y -yzMax; y yzMax; y) { int xy2 x2 y * y; if (xy2 intR2) continue; int zMax (int)Math.sqrt(intR2 - xy2); for (int z -zMax; z zMax; z) { BlockPos pos center.offset(x, y, z); BlockState state level.getBlockState(pos); if (state.isAir() || UNBREAKABLE.contains(state.getBlock())) continue; float dist (float)Math.sqrt(x * x y * y z * z); float power R - dist; float resistance state.getExplosionResistance(level, pos, null); float required (resistance 0.3F) * 3.0F; if (power required) { level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); } } } } Vec3 centerVec center.getCenter(); DamageSource explosionSource this.damageSources().explosion(this, this.getOwner()); float maxDamage 10.0F R * 4.0F; AABB searchBox new AABB(centerVec.subtract(R, R, R), centerVec.add(R, R, R)); ListEntity entities level.getEntities(this, searchBox); for (Entity entity : entities) { if (entity.isInvulnerableTo(explosionSource)) continue; double dist entity.distanceToSqr(centerVec); if (dist R * R) continue; float fraction 1.0F - (float)Math.sqrt(dist) / R; float damage maxDamage * fraction * fraction; if (damage 1.0F) damage 1.0F; entity.hurt(explosionSource, damage); //注意将伤害来源设置为爆炸伤害而不是别的 } } public void setFuse(int p_32086_) { super.setFuse(p_32086_); } }直接继承原版TNT实体即可由于我比较懒不愿意给实体画贴图就直接将炸弹设置成点然后立即引爆。最后在主类的构造方法上加上EntityReg.ENTITY_TYPES.register(modEventBus);补由于炸弹实体加的有点多不要忘记去resources目录下补齐资源文件大家可自行发挥效果1.Mini Bomb小炸弹可以看见小炸弹根本炸不动钻石块2.JK4最强炸弹炸的还是很规整的。。。按shift查看炸弹威力下一章教大家怎么实现自定义村民职业。