MC开发者日志#02
这两天有点吃不消,然后就摸了点,废话就不多说了直接进入正题
关于上次的那个动画bug 以及 幻鹿生态的补全
由于还是无法解决动画控制器的绑定问题,于是就跳过了使用动画控制器的步骤,直接用动画脚本进行了动画的转换,json代码如下:
"scripts": {
"animate": [
"setup",
{
"walk": "query.modified_move_speed"
},
"look_at_target",
{
"baby_transform": "query.is_baby"
},
{
"attack": "query.is_angry"
}
]
}
当幻鹿的属性中包含愤怒的时候就会播放攻击的动画,但这也会导致就算幻鹿离目标挺远的也会甩着头跑过来  ̄□ ̄Il|

然后是给幻鹿增加上了掉落物以及攻击附带效果,实现代码如下:
"minecraft:attack": {
"damage": 3.0,
"effect_duration": 20,
"effect_name": "nausea"
}
“minecraft:attack”标签下的
“effect_duration”是效果的持续时间
“effect_name”是效果的id
具体的id可以在这个网址找到,我在这里给幻鹿添加的效果是”nausea”也就是反胃,这样比较符合”幻“鹿的特性(?)
其次是幻鹿的掉落物,分别是 生幻鹿肉
幻鹿皮
幻鹿角
(这个好像看不太清) 掉落权重分别是4 : 3 : 1,目前幻鹿皮以及幻鹿角还没有作用。
生幻鹿肉直接食用可以获得3格饱食度(1.5格鸡腿)但会有80%获得反胃30秒 以及80%获得虚弱I 15秒,也可以通过烤制的方法变成 熟幻鹿肉
食用可以回复8格饱食度(4格鸡腿)但仍有60%会获得反胃20秒
最后为幻鹿添加了生成规则,幻鹿会在主世界的任意生态群系的草地上以3-5只为一个群落生成,也会在幻想世界中的微光森林以3-5只为一个群落生成,主要代码如下:
"minecraft:biome_filter": {
"all_of": [
{
"operator": "==",
"test": "has_biome_tag",
"value": "overworld"
},
{
"operator": "==",
"test": "has_biome_tag",
"value": "shimmer_forest"
}
]
}
这里运用了群落的比较器限定幻鹿生成在”overworld”(主世界)**”shimmer_forest”(微光森林)**
"minecraft:spawns_on_block_filter": [
"minecraft:grass",
"fantasy_world:shimmer_grass"
]
这里运用过滤器限定幻鹿会生成在”minecraft:grass”(草方块)和 “fantasy_world:shimmer_grass”(微光草)的上方
可能已经发现了,我提到了幻想世界以及微光森林两个原版不存在的东西,接下来就是
自定义维度以及自定义生态群系
原本只是想为幻鹿自定义一个生态群系,但是貌似基岩版不能直接在主世界中添加新的生态群系,只能自定义一个维度然后重写原版的生态群系,是的你没听错,于是就有了下文……..
但首先还是先讲讲自定义生态群系,生态群系的定义json如下:
{
"format_version": "1.13.0",
"minecraft:biome": {
"components": {
"dm3": {
},
"minecraft:overworld_height": {
"noise_type": "default"
},
"minecraft:overworld_surface": {
"floor_depth": 7,
"floor_material": "minecraft:gravel",
"foundation_material": "minecraft:stone",
"mid_material": "minecraft:dirt",
"top_material": "fantasy_world:shimmer_grass"
},
"minecraft:world_generation_rules": {
"generate_for_climates": [
[
"cold",
1
],
[
"medium",
4
],
[
"frozen",
3
]
],
"hills_transformation": "dm3_forest",
"mutate_transformation": "dm3_forest"
},
"shimmer_forest": {
}
},
"description": {
"identifier": "dm3_forest",
"inherits": "forest"
}
}
}
其中最主要的地形构成是由
"minecraft:overworld_surface": {
"floor_depth": 7,
"floor_material": "minecraft:gravel",
"foundation_material": "minecraft:stone",
"mid_material": "minecraft:dirt",
"top_material": "fantasy_world:shimmer_grass"
}
这段代码组成的,其中
- “floor_depth”是指群系中水域的深度
- “floor_material”是指水底的主要构成方块
- “foundation_material”是指群系地下主要构成方块
- “mid_material”是指地表到地下之间的主要构成方块
- “top_material”是指地表的主要构成方块
这里我将地表的方块改成了”fantasy_world:shimmer_grass”(微光草),但是由于基岩版的方块定义标签太少(或者是我太菜了,没找到相关的定义标签)没办法将微光草做的与原版草方块一样,拥有延展的特性,草也没办法生长在上面。
其中我还将自定义的结构微光树添加到了微光森林中,具体实现很简单不再赘述
接下来就是噩梦:自定义维度
其实使用网易的MCstudio可以简单的将传送门的相关逻辑自动绑定,但是 这个MCstudio特别**的一点就是 他的传送门边框只能用原版方块!!!这是什么操作?!!!

于是我只能翻阅他自动生成的py脚本去一个个排查怎么改成组件中自创的方块作为传送门的门框,起初我打开了pycham查阅他的py脚本然后发现了一个名叫editor_config的py文件,里面记录着相关的信息

这个gate改成自定义方块的id不就好了吗?二话不说行动起来,改脚本,进游戏,造传送门一气呵成,结果可想而知╮(╯﹏╰)╭
然后我又想是不是没有加上命名空间的原因,改成”fantasy_world:shimmer_log”,这次必过,进游戏,造传送门一气呵成,结果可想而知╮(╯﹏╰)╭
然后我翻阅了这个主的脚本文档,不断用log来调试,花了大概三个多小时,虽然还是没搞懂他的逻辑是咋样的(毕竟3h不可能学会一门语言)但是至少明白了他是什么过程
def __init__(self, namespace, system_name):
ServerSystem.__init__(self, namespace, system_name)
self.gate2cfg = {}
self.key2cfg = {}
for cfg in editorConfig.dataDict.itervalues():
if cfg['gate']:
gate = '{}:{}'.format('fantasy_world', *cfg['gate'])
key = cfg['key']
if key:
.....
elif cfg['portal']:
.....
self.gate2cfg.setdefault(gate, []).append(d)
self.key2cfg.setdefault(key, []).append(d)
self.ListenForEvent(
serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
'ServerItemUseOnEvent', self, self._server_item_use_on
)
self.ListenForEvent(
serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
'DimensionChangeFinishServerEvent', self, self._dimension_change_finish_server
)
self.ListenForEvent(
serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
'BlockRemoveServerEvent', self, self._block_remove_server
)
聪明的你应该已经看出来了就是
gate = '{}:{}'.format('fantasy_world', *cfg['gate'])
这一句定义了传送门的边框所用的材料,只要将format的第一个参数从“minecraft”改成自己的组件命名空间就可以了
改完万事大吉,进游戏,造传送门一气呵成,然后 ❌ (内心:啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!)
接着又花了一个多小时不断log,终于我发现了问题所在

gate = '{}:{}'.format('fantasy_world', *cfg['gate'])#这后面本来还有个aux的附加值
logging.info("================gate info:" + gate)
key = cfg['key']
就是这个aux附加值 也称方块面向参数(描述方块放置的朝向)(内心:啊?我放个传送门你还要规定我门框方块的朝向???)果断删除!然后


然后…..
明天摸鱼(顺便调整一下身体)应该会有时间继续更新
2022/7/5 修改图片到自建图床时评价: 你那时候咋那么多戏呢?<_<

