生物生成
- 生物生成
- Alexmob介绍:
- **1. 核心功能与技术实现**
- **2. 项目结构与代码质量**
- **3. 社区协作与维护**
- **4. 扩展性与开发挑战**
- **5. 开发者学习价值**
- 食蚁兽
- 一、实体属性与行为控制(`EntityAnteater`类)
- 二、实体注册与生成规则(`AMEntityRegistry`类)
- 三、全局生成逻辑(辅助方法)
- 四、配置与数据管理
- 总结
- **1. `rollSpawn`方法的作用**
- **2. `MobSpawnType`枚举的作用**
- **3. 两者的联系**
- **示例场景**
- **总结**
- 探究AlexMob的生物生成
- 一、代码关系解析
- 1. `initializeAttributes` 方法的作用
- 2. 与之前代码的关联
- 二、Alex's Mob的生成控制机制
- 三、自定义生成规则编写指南
- 1. **基础配置(JSON文件)**
- 2. **高级控制(Forge代码)**
- 3. **调试与测试**
- 四、总结
- SpawnPlacements类
- 一、代码解析
- 1. **核心类与接口**
- 2. **关键方法**
- 3. **高度图(Heightmap.Types)**
- 二、自定义生成规则方法
- 1. **基本步骤**
- 2. **代码示例:自定义僵尸生成规则**
- 3. **高级控制:复用现有逻辑**
- 三、调试与兼容性
- 1. **调试技巧**
- 2. **与其他模组的兼容**
- 四、总结
- RandomSource接口
- 一、`RandomSource` 接口的作用
- 二、与之前代码的关系
- 1. **在 `rollSpawn` 方法中的应用**
- 2. **在 `SpawnPlacements` 中的生成条件验证**
- 3. **与 `MobSpawnType` 的间接关联**
- 三、关键实现类解析
- 四、自定义生成规则中的使用示例
- 1. **随机生成生物变种**
- 2. **控制生成密度**
- 五、性能与线程安全建议
- 六、总结
- SpawnPredicate接口
- 一、`SpawnPredicate` 接口的作用
- 二、`test()` 方法参数详解
- 三、总结
- BiomeTags和Biome
- 类 `BiomeTags` 与 `Biome` 的联系与区别
- **联系**
- **区别**
- **具体示例**
- **协同工作场景**
- **总结**
- BiomeTags
- **1. 类定义与包结构**
- **2. 标签常量定义**
- **3. 标签创建方法**
- **4. 私有构造函数**
- **5. 标签的用途**
- **6. 核心标签示例**
- **7. 总结**
- 最后
生物生成
这一篇我们来研究研究怎么自定义生物的生成条件,首先Alexs Mos作为主流的forge模组之一,肯定是有研究价值的,这一篇我们来看看alexmob是如何自定义生物生成的
Alexmob介绍:
Alex’s Mobs(AlexsMobs)开发者视角解析
Alex’s Mobs 是一个由开发者 AlexModGuy 创建的 Minecraft 模组(Mod),专注于为游戏添加多样化的生物(Mobs),通过独特的模型、行为机制和生态交互提升游戏体验。以下从开发者角度分析其技术实现和项目特点:
1. 核心功能与技术实现
• 生物设计与行为逻辑
模组中的每个生物均基于 Minecraft Forge/Fabric API 开发,通过自定义的实体类(如 EntityCrocodile
、EntityMantisShrimp
)实现独特行为。开发者需深入理解 Minecraft 的实体系统(AI 任务、路径寻找、动画状态机)来设计复杂的生物交互(如捕食、群居、特殊技能)。
• 资源管理
• 模型与动画:使用 Blockbench 等工具创建高精度模型(.json
文件),并通过 GeoEntityRenderer
(基于 Geckolib 动画库)实现流畅的骨骼动画。
• 音效与本地化:资源包(resources/
目录)包含多语言支持、音效文件(.ogg
)和生物生成规则配置(spawns/
文件夹)。
• 跨版本兼容性
项目需适配多个 Minecraft 版本(如 1.16.5, 1.18.2),开发者通过分支管理和条件编译处理版本差异,依赖 Gradle 构建工具自动化打包。
2. 项目结构与代码质量
• 模块化设计
代码库(GitHub 仓库)按功能分层:
• main/java/com/github/alexmodguy/
:核心逻辑(实体、物品、世界生成)。
• common/
:通用工具类(配置解析、数学计算)。
• events/
:事件监听器(处理玩家交互、生物攻击等游戏事件)。
• 代码规范
• 清晰的类命名(如 AnimalAIWanderRanged
描述生物漫游 AI)。
• 注释详尽,关键逻辑配有行为树说明(如生物攻击优先级)。
• 依赖注入(通过 Forge Event Bus)降低耦合度。
3. 社区协作与维护
• 开源生态
项目采用 MIT 许可证,鼓励二次开发。开发者可通过 GitHub 的 Issues 提交 Bug 报告或功能请求,Pull Request 流程规范化(需通过 CI 测试)。
• 持续更新
作者定期发布新版本,更新日志(CHANGELOG.md
)详细记录生物新增、平衡调整和 Bug 修复,社区反馈响应迅速。
4. 扩展性与开发挑战
• API 集成
支持与其他模组联动(如 JEI 物品查询、Biomes O’ Plenty 生态兼容),开发者需通过 Forge Capability 系统实现数据交互。
• 性能优化
复杂生物可能影响游戏性能,需通过实体渲染优化(Level-of-Detail 技术)和 AI 任务调度(减少冗余计算)确保流畅运行。
5. 开发者学习价值
• 学习实体 AI 与动画系统的深度定制。
• 实践大型 Mod 的版本管理与跨平台适配。
• 参与开源协作,理解社区驱动的开发模式。
总结
Alex’s Mobs 不仅是 Minecraft 生态的丰富扩展,更是一个展示复杂游戏模组开发流程的优质案例。其代码结构清晰、文档完善,适合中高级开发者学习生物 AI、资源管理和社区维护的最佳实践。
食蚁兽
这段代码通过多个机制控制生物(如食蚁兽)的生成,主要涉及以下几个关键部分:
一、实体属性与行为控制(EntityAnteater
类)
-
属性定义
public static AttributeSupplier.Builder bakeAttributes() {return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 6D).add(Attributes.MOVEMENT_SPEED, 0.25F); }
• 设置食蚁兽的基础属性:生命值20、攻击伤害6、移动速度0.25。
-
生成条件验证
public static boolean canAnteaterSpawn(EntityType<? extends Animal> animal, LevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource random) {return worldIn.getRawBrightness(pos, 0) > 8; }
• 食蚁兽只能在亮度等级大于8的地方生成。
-
生成概率控制
public boolean checkSpawnRules(LevelAccessor worldIn, MobSpawnType spawnReasonIn) {return AMEntityRegistry.rollSpawn(AMConfig.anteaterSpawnRolls, this.getRandom(), spawnReasonIn); }
• 通过配置文件
AMConfig.anteaterSpawnRolls
控制生成概率,调用rollSpawn
方法决定是否生成。
二、实体注册与生成规则(AMEntityRegistry
类)
-
实体类型注册
public static final RegistryObject<EntityType<EntityAnteater>> ANTEATER = DEF_REG.register("anteater", () -> registerEntity(EntityType.Builder.of(EntityAnteater::new, MobCategory.CREATURE).sized(1.3F, 1.1F).setTrackingRange(10), "anteater"));
• 将食蚁兽注册为
CREATURE
(被动生物),设置碰撞箱大小(1.3×1.1)和跟踪范围(10格)。 -
生成规则绑定
SpawnPlacements.register(ANTEATER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityAnteater::canAnteaterSpawn);
• 食蚁兽必须在地面(
ON_GROUND
)生成,使用高度图MOTION_BLOCKING_NO_LEAVES
(忽略树叶),并调用canAnteaterSpawn
验证亮度条件。 -
属性初始化事件
event.put(ANTEATER.get(), EntityAnteater.bakeAttributes().build());
• 在
EntityAttributeCreationEvent
中应用食蚁兽的属性配置。
三、全局生成逻辑(辅助方法)
-
概率计算
public static boolean rollSpawn(int rolls, RandomSource random, MobSpawnType reason) {if (reason == MobSpawnType.SPAWNER) return true;return rolls <= 0 || random.nextInt(rolls) == 0; }
• 若
AMConfig.anteaterSpawnRolls
设为10,则每次生成尝试有1/10的概率成功(自然生成时)。 -
特殊生成环境验证
public static boolean createLeavesSpawnPlacement(LevelReader level, BlockPos pos, EntityType<?> type) {// 检查是否在树叶上生成(用于其他生物,如猴子) }
• 虽然食蚁兽不依赖此方法,但其他生物(如
CAPUCHIN_MONKEY
)可能需要在树叶上生成。
四、配置与数据管理
- 配置文件交互
•AMConfig.anteaterSpawnRolls
:控制生成频率,值越大生成越稀有。
•AMTagRegistry
:管理食蚁兽的食物和繁殖物品标签(如ANTEATER_FOODSTUFFS
)。
总结
食蚁兽的生成由以下因素控制:
- 位置条件:地面且亮度>8。
- 生成概率:通过
AMConfig.anteaterSpawnRolls
配置。 - 实体属性:生命值、攻击力等由
bakeAttributes
定义。 - 注册与事件:通过Forge的实体注册系统和事件监听器绑定生成规则。
其他生物(如猴子、鳄鱼)通过类似的逻辑注册,但可能使用不同的生成条件(如树叶、水域等)。
j接下来研究一下这两个代码:
public static boolean rollSpawn(int rolls, RandomSource random, MobSpawnType reason){if(reason == MobSpawnType.SPAWNER){return true;}else{return rolls <= 0 || random.nextInt(rolls) == 0;}}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package net.minecraft.world.entity;public enum MobSpawnType {NATURAL,CHUNK_GENERATION,SPAWNER,STRUCTURE,BREEDING,MOB_SUMMONED,JOCKEY,EVENT,CONVERSION,REINFORCEMENT,TRIGGERED,BUCKET,SPAWN_EGG,COMMAND,DISPENSER,PATROL;private MobSpawnType() {}
}
1. rollSpawn
方法的作用
public static boolean rollSpawn(int rolls, RandomSource random, MobSpawnType reason) {if (reason == MobSpawnType.SPAWNER) {return true;} else {return rolls <= 0 || random.nextInt(rolls) == 0;}
}
• 功能:此方法用于判断生物是否满足生成条件。
• 参数解析:
• rolls
:生成概率的分母(例如设置为10时,生成概率为1/10)。
• random
:随机数生成器,用于概率判定。
• reason
:生成原因,来自MobSpawnType
枚举。
• 逻辑:
• 若生成原因是SPAWNER
(刷怪笼生成),直接返回true
,即必定生成。
• 其他生成原因则根据rolls
值判断:
◦ 若rolls <= 0
,表示无概率限制,直接生成。
◦ 否则通过随机数判断,只有random.nextInt(rolls) == 0
时才生成(概率为1/rolls
)。
2. MobSpawnType
枚举的作用
public enum MobSpawnType {NATURAL, // 自然生成(如夜晚刷怪)CHUNK_GENERATION, // 区块生成时生成SPAWNER, // 刷怪笼生成STRUCTURE, // 结构生成(如要塞中的末影人)BREEDING, // 繁殖生成MOB_SUMMONED, // 被召唤生成(如唤魔者召唤恼鬼)// 其他类型省略...
}
• 功能:定义生物生成的不同场景或触发方式。
• 关键类型:
• SPAWNER
:通过刷怪笼生成的生物。
• NATURAL
:自然生成的生物(如僵尸在夜晚生成)。
• BREEDING
:通过繁殖生成的生物(如动物交配)。
3. 两者的联系
• 依赖关系:
rollSpawn
方法通过MobSpawnType
参数区分生成场景,从而应用不同的生成逻辑:
• 若生成原因是SPAWNER
,直接允许生成,无需概率计算。这可能是因刷怪笼本身已有独立的生成规则(如冷却时间)。
• 其他场景(如自然生成)则通过rolls
参数控制生成概率。例如,配置rolls=20
时,自然生成概率为1/20。
• 设计意图:
• 灵活性:允许不同生成场景(如自然生成与刷怪笼生成)采用不同的判定规则。
• 性能优化:刷怪笼生成可能更频繁,直接跳过概率计算可减少运算开销。
示例场景
- 刷怪笼生成:
•reason = MobSpawnType.SPAWNER
→ 直接返回true
,生物必定生成。 - 自然生成:
• 若配置rolls=15
,则有1/15的概率生成生物(如僵尸在夜晚生成)。
总结
• MobSpawnType
枚举是生成场景的分类标签,而rollSpawn
方法是基于这些标签的生成条件判定器。
• 通过结合两者,Minecraft实现了对不同生成场景的精细化控制,同时优化了刷怪笼等高频生成场景的性能。
探究AlexMob的生物生成
@SubscribeEventpublic static void initializeAttributes(EntityAttributeCreationEvent event) {SpawnPlacements.Type spawnsOnLeaves = SpawnPlacements.Type.create("am_leaves", AMEntityRegistry::createLeavesSpawnPlacement);SpawnPlacements.register(GRIZZLY_BEAR.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules);SpawnPlacements.register(ROADRUNNER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityRoadrunner::canRoadrunnerSpawn);SpawnPlacements.register(BONE_SERPENT.get(), SpawnPlacements.Type.IN_LAVA, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityBoneSerpent::canBoneSerpentSpawn);SpawnPlacements.register(GAZELLE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules);SpawnPlacements.register(CROCODILE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityCrocodile::canCrocodileSpawn);SpawnPlacements.register(FLY.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityFly::canFlySpawn);SpawnPlacements.register(HUMMINGBIRD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING, EntityHummingbird::canHummingbirdSpawn);SpawnPlacements.register(ORCA.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityOrca::canOrcaSpawn);SpawnPlacements.register(SUNBIRD.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntitySunbird::canSunbirdSpawn);SpawnPlacements.register(GORILLA.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING, EntityGorilla::canGorillaSpawn);SpawnPlacements.register(CRIMSON_MOSQUITO.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityCrimsonMosquito::canMosquitoSpawn);SpawnPlacements.register(RATTLESNAKE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityRattlesnake::canRattlesnakeSpawn);SpawnPlacements.register(ENDERGRADE.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityEndergrade::canEndergradeSpawn);SpawnPlacements.register(HAMMERHEAD_SHARK.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityHammerheadShark::canHammerheadSharkSpawn);SpawnPlacements.register(LOBSTER.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityLobster::canLobsterSpawn);SpawnPlacements.register(KOMODO_DRAGON.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityKomodoDragon::canKomodoDragonSpawn);SpawnPlacements.register(CAPUCHIN_MONKEY.get(), spawnsOnLeaves, Heightmap.Types.MOTION_BLOCKING, EntityCapuchinMonkey::canCapuchinSpawn);SpawnPlacements.register(CENTIPEDE_HEAD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityCentipedeHead::canCentipedeSpawn);SpawnPlacements.register(WARPED_TOAD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING, EntityWarpedToad::canWarpedToadSpawn);SpawnPlacements.register(MOOSE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityMoose::canMooseSpawn);SpawnPlacements.register(MIMICUBE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Mob::checkMobSpawnRules);SpawnPlacements.register(RACCOON.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules);SpawnPlacements.register(BLOBFISH.get(), SpawnPlacements.Type