MC开发者日志#05

今天是大年初一,祝大家新年快乐,心想事成,万事如意呀!!

这次的博客会总结这两天的内容呀(如果我愿意的话♪(・ω・)ノ)

微光森林生态相关

解决了微光虫(shimmer_bug)(方块)shimmer_bug_item.png的物品贴图问题,解决方法是在BlockBench建模的时候要将物品贴图以及模型贴图都导入到项目里面,这样游戏才能正常读取物品的贴图。根据微光虫(方块)设计建模了一个新的生物微光虫(生物)击杀的掉落物即微光虫(方块)

微光虫.png

继承了原版蝙蝠的行为方式,并且贴图用ps带alpha通道绘制导出为tga文件,可以使得生物具有半透明且发光材质,虽然没有实际的照度但是可以在晚上发现该生物会更加亮眼一些。然后将微光虫(生物)的分类设为海洋生物。因为在基岩版中海洋生物的生物密度是最高的,这样可以一次刷新更多微光虫,具体基岩版生物密度如下图:

生物密度.png

其次是添加了新的世界生成规则,将微光草(shimmer_grass)添加进世界自动生成中,微光草(shimmer_grass)将在微光森林自动生成。


考虑到幻鹿的繁殖问题,设计添加了一种新的作物微光浆果(shimmer_berry)shimmer_berry.png并利用py脚本完成相关的设计,值得注意的是官网教程给出的模板中使用自定义物品种植自定义作物是不会消耗自定义物品的,再了解具体实现过程后实现了相关行为,具体代码如下:

if (blockDict["name"] == "minecraft:grass") or (blockDict["name"] == "fantasy_world:shimmer_grass_block"):
    blockDict = {
        'name': 'fantasy_world:shimmer_berry_stage0',
        'aux': 0
    }
    comp.SetBlockNew((args["x"], args["y"] + 1, args["z"]), blockDict)

    comp = serverApi.GetEngineCompFactory().CreateItem(playerId)
    dict = comp.GetPlayerItem(serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0)

    comp = serverApi.GetEngineCompFactory().CreateItem(playerId)
    comp.SetInvItemNum(self.SLOT_ID, 0)

    itemDict = {
        'itemName': 'fantasy_world:shimmer_berry',
        'count': dict['count'] - 1,
        'auxValue': 0,
        'customTips': '%name%%attack_damage%\n§2幻鹿似乎会被浆果的香味吸引过来§r'
    }
    comp = serverApi.GetEngineCompFactory().CreateItem(playerId)
    comp.SpawnItemToPlayerCarried(itemDict, playerId)

在检测玩家使用**微光浆果(shimmer_berry)时,种植微光浆果丛(shimmer_berry_stage0)**然后利用dict = comp.GetPlayerItem(serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0)获取玩家现在手持的物品详细信息存在dict中,再利用comp.SetInvItemNum(self.SLOT_ID, 0)将玩家手持的物品清空,最后利用comp.SpawnItemToPlayerCarried(itemDict, playerId)生成原本物品数量减一的物品到玩家手上,其中 self.SLOT_ID 是由客户端py脚本监听使用物品事件返回的玩家手持物品在装备栏的第几格,具体实现如下:

    def OnClientItemTryUseEvent(self, data):
        itemDict = data['itemDict']
        playerId = data['playerId']
        if itemDict['itemName'] == "fantasy_world:shimmer_berry":
            comp = clientApi.GetEngineCompFactory().CreateItem(playerId)
            slotId = comp.GetSlotId()
            CustomCropServer.SLOT_ID = slotId

在玩家使用**微光浆果(shimmer_berry)**时利用slotId = comp.GetSlotId()获取玩家手持物品的栏位并返回给服务端

微光浆果(shimmer_berry)的首次获得方式是破坏微光草(shimmer_grass)shimmer_grass_empty.png时有1/10的几率会掉落,随后可以利用种植获得更多。


幻鹿的繁殖只需要在幻鹿的生物行为json文件中添加相关逻辑就可以了,相关代码如下:

{
    "format_version": "1.12.0",
    "minecraft:entity": {
        "component_groups": {
            "minecraft:magic_deer_adult": {
                "minecraft:breedable": {
                    "breed_items": [
                        "fantasy_world:shimmer_berry"
                    ],
                    "breeds_with": {
                        "baby_type": "fantasy_world:magic_deer",
                        "breed_event": {
                            "event": "minecraft:entity_born",
                            "target": "baby"
                        },
                        "mate_type": "fantasy_world:magic_deer"
                    },
                    "require_tame": false
                },
                ·····
            },
            ·····
            "minecraft:magic_deer_baby": {
                "minecraft:ageable": {
                    "duration": 1200,
                    "feed_items": [
                        "fantasy_world:shimmer_berry"
                    ],
                    "grow_up": {
                        "event": "minecraft:ageable_grow_up",
                        "target": "self"
                    }
                },
                "minecraft:behavior.follow_parent": {
                    "priority": 5,
                    "speed_multiplier": 1.1
                },
                ·····
            }
        },
        "components": {
            ·····
            "minecraft:behavior.breed": {
                "priority": 3,
                "speed_multiplier": 0.8
            },
            ·····
            "minecraft:behavior.tempt": {
                "items": [
                    "fantasy_world:shimmer_berry"
                ],
                "priority": 4,
                "speed_multiplier": 1.0
            },
            ·····
        },
        "description": {
            ·····
        },
        "events": {
            "minecraft:ageable_grow_up": {
                "add": {
                    "component_groups": [
                        "minecraft:magic_deer_adult"
                    ]
                },
                "remove": {
                    "component_groups": [
                        "minecraft:magic_deer_baby"
                    ]
                }
            },
            "minecraft:entity_born": {
                "add": {
                    "component_groups": [
                        "minecraft:magic_deer_baby"
                    ]
                },
                "remove": {}
            },
            ·····
        }
    }
}

其中在成年组代码中的

                "minecraft:breedable": {
                    "breed_items": [
                        "fantasy_world:shimmer_berry"
                    ],
                    "breeds_with": {
                        "baby_type": "fantasy_world:magic_deer",
                        "breed_event": {
                            "event": "minecraft:entity_born",
                            "target": "baby"
                        },
                        "mate_type": "fantasy_world:magic_deer"
                    }

定义了

  • 繁殖需要的物品breed_items
  • 繁殖的伙伴mate_type
  • 繁殖的结果baby_type
  • 繁殖事件breed_event

繁殖事件指向了事件代码中的

            "minecraft:entity_born": {
                "add": {
                    "component_groups": [
                        "minecraft:magic_deer_baby"
                    ]
                },
                "remove": {}
            }

事件为新出生的幻鹿添加了相关的组,值得注意的是要在常规组(components)中添加繁殖的定义minecraft:behavior.breed不然会出现动物喂食后进入爱情状态却不会繁殖的情况,当时排查了好久才发现这里出了问题


至此微光森林的生态主体就完成了,来欣赏一下吧!

白天的微光森林
微光森林晚上.gif
夜晚的微光森林

初めて会ったの日から 僕の心の全てを奪った