Cat_Anchor 发表于 2023-7-9 20:41:11

附加包教程:36.实体(二)

本帖最后由 Cat_Anchor 于 2023-8-20 11:09 编辑




前言



终于到了实体的例子的阶段了。这对我来说还有些难度,不过我们今天就来看看我的附加包——相机平滑移动中的实体例子。这个附加包中仅有一个实体,那就是缓动标记。相机的缓动,就是根据这个标记进行的。由于内容过长,我打算分期进行。



https://klpbbs.com/static/image/hrline/line5.png


创建实体



首先,需要创建一个空白的新实体,这个实体没有任何功能。我在这里直接使用我的附加包中的代码。然后,因为缓动标记仅起标识的作用,它当然不能受到伤害导致标记消失,也不能自然消失,等等。
{
"format_version": "1.20.10",
"minecraft:entity": {
    "description": {
"identifier": "supplementary:moving_mark", //我的附加包中,缓动标记的命名空间ID。
"is_spawnable": false, //可用刷怪蛋等生成
"is_summonable": true, //可用命令生成
"is_experimental": false //是否是实验性的
    },
    "component_groups": {}, //组件组
    "components": {
"minecraft:tick_world": {}, //常加载周围的区块
"minecraft:persistent": {}, //防止自然消失
"minecraft:damage_sensor": {
"triggers": {
    "cause": "all", //所有伤害
    "deals_damage": false //不造成实际影响
}
},
"minecraft:type_family": {
"family": [
    "inanimate"
]
}, //实体属于inanimate族
"minecraft:physics": {
"has_gravity": false, //可以漂浮
"has_collision": false //无碰撞箱
},
"minecraft:pushable": {
"is_pushable": false, //无法被生物推动
"is_pushable_by_piston": false //无法被活塞推动
},
"minecraft:fire_immune": true, //免疫火焰,不会着火
"minecraft:nameable": {
"allow_name_tag_renaming": false //不允许使用命名牌
}
    }, //组件
    "events": {} //事件
}
}
然后,我们就要进入实现环节了。
在播放时,标记是有顺序地进行播放的,因此必须让标记存储自己是第几个这样的数据,便于以后播放。这样,使用camera命令才能把玩家的摄像机从一个标记缓动到下一个标记。
要实现这种功能,计分板是一个好选择。因此,在实体生成时就应该创建一个计分板。借助内置事件minecraft:entity_spawned可以轻松实现这一点。
那么怎么实现用分数表示顺序呢?我首先想到了让其他实体把自己的分数加到当前实体。首先,创建计分板moving;然后,将moving设为1;最后,把所有分数加到自身。这样的结果是:第一个实体,1;第二个,1+1=2;第三个开始出问题,1+2+1=4;第四个是1+2+4+1=8。这样显然是不对的。要纠正这个问题太复杂,事倍功半的事我不会去做。
于是,我又创建了一个moving2计分板,把值设为1,再把所有实体的moving2的分数加到自身的moving的分数上,使用/scoreboard players operation @s moving += * moving2命令可以完成这一点。这样,有多少个实体就加多少分,这其实也是实体计数的原理。不过现在,我们用它表示顺序。
那么第一个实体,1;第二个,1+1=2;第三个,1+1+1=3……现在就正确了。计分板上的分数就是这个实体的顺序。比如这个标记的moving是3,那么这就是第3个标记。
以上这么一大堆,可以概括为以下事件:
"minecraft:entity_spawned": { //当实体生成时...
"run_command": { //运行命令
    "command": [ //命令列表
      "scoreboard objectives add moving dummy", //创建计分板moving
      "scoreboard objectives add moving2 dummy", //创建计分板moving2
      "scoreboard players set @s moving2 1", //将moving2设为1
      "scoreboard players operation @s moving += * moving2" //将所有有分数的实体的moving2分数加到自身的moving里。这个*代表计分板上所有有分数的实体。
    ]
}
}
是的,刚才讲了这么久,只实现了实体顺序的储存。接下来,为了实现开始播放的功能,我们需要新增一个事件,让它检测我们设置的速度和缓动类型,最后开始缓动。同时,为了正确识别标记的顺序,还需要在计分板方面下点功夫。



https://klpbbs.com/static/image/hrline/line2.png


后记



这一期主要实现了实体生成顺序的标记。下期,我们开始完成主要部分。





第三十五期 第三十六期 第三十七期
页: [1]
查看完整版本: 附加包教程:36.实体(二)