我们今天对 主世界建筑生成进行制作

1.在 util 包中新建 IStructure 接口

在 IStructure.java 中编写

package com.Joy187.newmod.util;import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.world.WorldServer;
import net.minecraft.world.gen.structure.template.PlacementSettings;
import net.minecraftforge.fml.common.FMLCommonHandler;public interface IStructure {public static final WorldServer worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().getWorld(0);public static final PlacementSettings settings = (new PlacementSettings()).setChunk(null).setIgnoreEntities(false).setIgnoreStructureBlock(false).setMirror(Mirror.NONE).setRotation(Rotation.NONE);
}

2.在world 包中新建 ModWorldGenStructure 类

在 ModWorldGenStructure.java 中编写

package com.Joy187.newmod.world;import java.util.Random;import com.Joy187.newmod.util.IStructure;
import com.Joy187.newmod.util.Reference;import net.minecraft.block.state.IBlockState;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraft.world.gen.feature.WorldGenerator;
import net.minecraft.world.gen.structure.template.Template;
import net.minecraft.world.gen.structure.template.TemplateManager;public class ModWorldGenStructure extends WorldGenerator implements IStructure{public static String structureName;public ModWorldGenStructure(String name) {this.structureName = name;}@Overridepublic boolean generate(World worldIn, Random rand, BlockPos position) {this.generateStructure(worldIn, position);return true;}public static void generateStructure(World world,BlockPos pos) {MinecraftServer mcServer = world.getMinecraftServer();TemplateManager manager = worldServer.getStructureTemplateManager(); ResourceLocation location = new ResourceLocation(Reference.Mod_ID, structureName); Template template = manager.get(mcServer,location);if(template != null) {IBlockState state = world.getBlockState(pos);world.notifyBlockUpdate(pos, state, state, 3);template.addBlocksToWorldChunk(world, pos, settings);}}}

3.在 world 包中新建ModWorldGenCustomStructure 类

在ModWorldGenCustomStructure.java 中编写

package com.Joy187.newmod.world;import java.util.ArrayList;
import java.util.Random;import com.Joy187.newmod.blocks.MutamyceteBlock;
import com.Joy187.newmod.init.ModBlocks;import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.BiomePlains;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.IChunkGenerator;
import net.minecraft.world.gen.feature.WorldGenerator;
import net.minecraftforge.fml.common.IWorldGenerator;
import scala.actors.threadpool.Arrays;public class ModWorldGenCustomStructure implements IWorldGenerator{//你所要生成的建筑名称,可以写多个建筑public static final ModWorldGenStructure XCHAMBERX = new ModWorldGenStructure("xchamberx");@Overridepublic void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkePrvider) {switch(world.provider.getDimension()){case 2:break;case 1:break;case 0:                 //建筑名称 生成的时间 随机位 区块X,Z 生成概率(0~100) 在什么方块上面生成 在什么地形生成generateStructure(XCHAMBERX, world, random, chunkX, chunkZ, 10,    Blocks.GRASS, BiomePlains.class);break;case -1:}}private void generateStructure(WorldGenerator generator , World world, Random random, int chunkX, int chunkZ, int chance, Block topBlock, Class<?>... classes) {ArrayList<Class<?>> classesList = new ArrayList<Class<?>>(Arrays.asList(classes));int x = (chunkX * 16) + random.nextInt(15);int z = (chunkZ * 16) + random.nextInt(15);    int y = calculateGenerationHeight(world, x, z,topBlock);BlockPos pos = new BlockPos(x,y,z);Class<?> biome = world.provider.getBiomeForCoords(pos).getClass();if(world.getWorldType() != WorldType.FLAT) {if(classesList.contains(biome)){if(random.nextInt(chance) == 0){generator.generate(world, random, pos);}}}}//计算生成高度 [0,255]层之间可生成 其余忽略private static int calculateGenerationHeight(World world, int x, int z, Block topBlock) {int y = world.getHeight();boolean foundGround = false;while(!foundGround && y-- >= 0) {Block block = world.getBlockState(new BlockPos(x,y,z)).getBlock();foundGround = block == topBlock;}return y;       }}

4.在 Main.java中添加建筑生成语句:

 @EventHandlerpublic static void PreInit(FMLPreInitializationEvent event){RegistryHandler.preInitRegistries( );//新增建筑生成语句GameRegistry.registerWorldGenerator(new ModWorldGenCustomStructure(), 0);}

5.保存所有文件 -> 进入游戏进行建筑制作

可以在超平坦世界进行建造,建筑物建好之后要将建筑物与地面分离,也就是将建筑物下面的一层草方块全部挖空。

输入指令

/give Player minecraft:structure_block

这个名称是你进入游戏时的随机玩家名称,可在eclipse中看到:

6.点击建筑方块,设置相对定位(第一行)和建筑的大小(长宽高),调整建筑空间。

当我们的建筑正好被建筑空间包裹时,说明我们的大小已经设置好了 -> 点击保存(SAVE) -> 退出游戏

7. 在 run\saves\你的世界名\structures 文档中找到 我们的 建筑.nbt文件并复制

在 resource 包中新建 structures 包,将 .nbt文件放入包中

8.保存所有代码 -> 进入游戏 -> 新建一个世界

我们将生产概率调成50,地形调为平原,在草方块上生成

在平原上成功找到所设计的建筑物!

Note: Minecraft 全地形一览

Minecraft 1.12.2模组开发(十四) 建筑生成 (structure generation)相关推荐

  1. Minecraft 1.12.2模组开发(十八) 自定义附魔

    我们本次对于模组中自定义附魔进行讲解 1. init 包中新建 ModEnchantment 类 在 ModEnchantment.java 中编写: package com.Joy187.newmo ...

  2. Minecraft 1.12.2模组开发(十) 食物制作

    我们本次来制作一款食物(food) 1.在items包下 新建 food 包 在food 包中新建 FoodBase 类: public FoodBase(String name(食物名称), int ...

  3. Minecraft 1.12.2模组开发(十二) 战利品 (loot)

    我们本次对击杀怪物掉落战利品进行设置 1.在 util.handler 包中新建 LootTableHandler 类 在LootTableHandler.java中进行编辑: package com ...

  4. Minecraft 1.12.2模组开发(十九) 自定义3D物品模型

    本次我们来制作MC中的 自定义物品模型 并在游戏中成功显示 要设计制作3D物品模型,需要用到blockbench的建模软件: BlockBench下载地址 相关教程 国外中英字幕 酒石酸菌(国人大神% ...

  5. Minecraft 1.12.2模组开发(一) 配置ForgeMDK环境

    我的世界1.12.2 IDEA开发包构建教程已出,更加方便快捷~ 1.12.2Forge模组开发 配置ForgeMDK环境 开发环境:eclipse 1. 我的世界模组开发首先需要配置Forge MD ...

  6. Minecraft 1.12.2模组开发(二十) 导出模组

    模组制作完成后,我们就可以将其导出成为.jar文件,进行发布,供全世界的玩家进行下载游玩了 1.进入模组开发的文件夹 -> 起动cmd控制台 2.输入构建指令等待其构建模组 Windows系统: ...

  7. Minecraft 1.12.2模组开发(三十九) 反应器(TileEntity方块实体)

    说到方块实体(TileEntity),可以理解为一种功能性方块,比如熔炉,箱子,附魔台等. 我们今天来做一个类似于熔炉的反应器 熔炉逻辑: 放入燃料-> 放入物品 -> 获取产出物品 1. ...

  8. Minecraft 1.12.2模组开发(四十九) 维度空间

    1.18.2维度空间教程 1.16.5维度空间教程 我们今天在1.12.2的模组中实现一个自定义维度的生成: 1.在Java包的init包中新建一个InitDimension类注册我们所有的维度: I ...

  9. Minecraft 1.12.2模组开发(四十) buff效果(Potion Effect)

    今天我们在1.12.2的模组中尝试实现几种特殊的buff效果 1.在开发包中新建potion包 -> potion包中新建一个BaseSimplePotion类作为我们药水效果的基类: Base ...

最新文章

  1. zabbix企业应用之固定端口监控redis
  2. java socket超时时间_java中socket 默认超时时间 | 学步园
  3. CodeBlocks主题和字体
  4. 用神经网络分类一维矩阵
  5. Spring mvc整合freemarker详解
  6. 南方rtk手簿使用说明书详解_学RTK必须要掌握的三大要领是什么?
  7. map 和set 有什么区别,分别又是怎么实现的
  8. 抛硬币直到连续若干次正面
  9. 【C++基础】重抛异常与异常的使用场景
  10. Event Organization Site - To be published on 4th August
  11. python random 之基础点名器
  12. react中IOS手机里面两个input同时存在时,聚焦focus失效解决办法
  13. MUI全国城市区县级联json转换sql建表
  14. 免费而强大的十款PCB设计软件
  15. 如何用 css 画一个正方体
  16. Linux centOS系统备份还原(dd+rsync方式)
  17. 快速进行服务接口监控
  18. python网盘搜索引擎_打造一个蓝奏云网盘搜索引擎
  19. 通过加速度计和陀螺仪解算姿态
  20. c语言画伯努利分布图像,C++ - 随机生成器 伯努利分布(bernoulli distribution) 的 详解 及 代码...

热门文章

  1. MacBook配置oh my zsh
  2. 事后诸葛亮分析(冲鸭队)
  3. java遍历queue_Java:Java 队列的遍历
  4. 北京大学、阿里巴巴成立联合实验室,聚焦人工智能理论和创新算法研究
  5. idea提交项目至码云(完整步骤介绍及其过程中遇到的各种问题解决办法)gitee码云创建仓库,idea新项目提交至码云完整步骤及其过程中遇到的各种问题
  6. PyCharm快捷键大全-你想要的全都有
  7. Brotato 游戏拆解
  8. div css纵向显示 html,css如何设置竖排文字?
  9. 同期群分析到底是怎么一回事?有哪些商业应用?
  10. flutter 隐藏返回按钮 自定义返回按钮