2.6
This commit is contained in:
102
docs/mconline/90-知识库获奖教程/3-自定义内容/0-制作生物死亡动画.md
Normal file
102
docs/mconline/90-知识库获奖教程/3-自定义内容/0-制作生物死亡动画.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# 制作生物死亡动画
|
||||
|
||||
> 本篇教程获得第一期知识库必看教程奖。
|
||||
>
|
||||
> 获奖作者:艾诺德。
|
||||
|
||||
今天的教程将教各位开发者制作实体死亡动画。这项技术经常被应用于包含动作优化/Boss生物的模组中。
|
||||
|
||||
**教程概述:**
|
||||
|
||||
主要功能:在实体死亡时播放自定义死亡动画。
|
||||
|
||||
实现步骤:
|
||||
|
||||
- 检测实体死亡。
|
||||
- 实体死亡时替换原版动画。
|
||||
- 动画播放完成后清除实体。
|
||||
|
||||
|
||||
|
||||
**学习本教程的前置技术要求:**
|
||||
|
||||
- 了解json语法格式。
|
||||
|
||||
- 了解生物行为代码并能熟练自定义 **component_groups** 和 **events** 中的内容。
|
||||
|
||||
- 会使用生物动画控制器且会制作原版生物动画。
|
||||
|
||||
|
||||
|
||||
**让我们先看看最终效果:**
|
||||
|
||||
如下图所示,连弩实体死亡时并没有和原版一样表现出全身泛红倒下,而是播放了我们自定义的死亡动画。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
首先我们需要在BlockBench内制作一个生物死亡动画。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**注意:**
|
||||
|
||||
1. 该动画必须是循环播放。
|
||||
|
||||
2. 无论你实际的动画时长多少,你都需要将该动画时长设置为999(见下图所示)(毕竟我们不想看见生物反复去世对吧)。
|
||||
|
||||

|
||||
|
||||
3. 该动画可设置"override_previous_animation",设置后可避免生物死亡后在播放动画时发生位移而同时播放行走动画产生诡异的效果。
|
||||
|
||||
|
||||
|
||||
在准备工作完成后,我们先制作动画控制器(代码如下图所示) 。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
由于实体死亡并没有提供molang,因此我们使用`query.variant`进行自定义的死亡状态判定。
|
||||
|
||||
**在将动画控制器及动画挂载到entity文件中后材质包中的工作就算完成了。**
|
||||
|
||||
接下来我们开始编写实体的行为文件。首先我们需要在`component_groups`创建`death`和`alive`两个group,根据动画控制器里的条件,我们需要将两个组的`variant`分别设置为1和0。核心部分代码如下图所示:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
为了判定生物死亡,我们需要在`alive`组里加入如下代码:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
该代码会在生物受到致命伤害时执行`event`中定义的`minecraft:death`事件,同时阻止最后一次伤害,从而达到屏蔽实体原版死亡动画的效果,同时为了防止实体在死后仍受到伤害/移动,我们需要在`death`组中加入如下代码:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
完成上述步骤后我们需要在`event`中添加如下代码实现状态的转换:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
由于实体进入死亡状态后将进入无敌状态,在正常状况下很难让它消失,因此需要在`death`组中添加如下代码移除实体:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
上图所示代码将执行一个无破坏力的自爆对实体进行清除,1.5为延迟时间,我们可以将时间调为和死亡动画实际所用时间相同的值以达到播放完动画清除实体的性格,也可以设置更多时间让实体停留一段时间。
|
||||
|
||||
最后我们只需要在alive组中添加实体行为代码(如攻击、仇恨目标、行走等,但如`minecraft:health`和`minecraft:physics`等实体基本属性组件需要添加在`components`中,并在`components`中设置`variant`为0就大功告成了!感谢大家的阅读。
|
||||
|
||||
|
||||
|
||||
49
docs/mconline/90-知识库获奖教程/3-自定义内容/1-生物生成建筑.md
Normal file
49
docs/mconline/90-知识库获奖教程/3-自定义内容/1-生物生成建筑.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# 生物生成建筑
|
||||
|
||||
> 本篇教程获得第一期知识库必看教程奖。
|
||||
>
|
||||
> 获奖作者:橘子气泡水。
|
||||
|
||||
**效果图**
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**效果视频**
|
||||
|
||||
<iframe frameborder="0" height="600" width="800" allowfullscreen="allowfullscreen" src="http://cc.163.com/v/core/externplayer/63e38f8529279d2f4acfc1bb/"/>
|
||||
|
||||
|
||||
|
||||
**目标**
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**结构位置**
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**动画控制器**
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**Function**
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
这样你就可以让你的猪帮你把房子盖好了。
|
||||
127
docs/mconline/90-知识库获奖教程/3-自定义内容/2-自定义弓使用原版弓的动画.md
Normal file
127
docs/mconline/90-知识库获奖教程/3-自定义内容/2-自定义弓使用原版弓的动画.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# 自定义弓使用原版弓的动画
|
||||
|
||||
> 本篇教程获得第一期知识库必看教程奖。
|
||||
>
|
||||
> 获奖作者:日月潭。
|
||||
|
||||
开发者按照网易方法自定义远程武器后,会发现物品不像原版弓一样能够有拉弓+微微颤抖的动画,事实上让你的弓使用原版动画十分容易。
|
||||
|
||||
如何在自定义远程武器这里就不再赘述,在本期中,我们会聚焦如何 使用原版JSON附加包 及 模组SDK 的方式来让你的弓使用原版动画。想要催更或加码的小伙伴们,请不要吝啬自己手中的点赞和评论,欢迎您们在开发角下方分享你们的收获与灵感。
|
||||
|
||||
**阅读本章的前置要求:**
|
||||
|
||||
- 了解json数据的格式。
|
||||
- 知道怎么监听事件,以及客户端和服务器之间通信。
|
||||
- 能够按照网易教程添加自定义物品。
|
||||
|
||||
|
||||
|
||||
**在本章你将掌握:**
|
||||
|
||||
- 让你的弓使用原版弓的动画。
|
||||
|
||||
|
||||
|
||||
打开《我的世界》开发工作台,首先新建基岩版组件,我们选择空白Addon,生成一个新的项目并启动编辑。
|
||||
|
||||
按照教程[自定义远程武器](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/20-%E7%8E%A9%E6%B3%95%E5%BC%80%E5%8F%91/15-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B8%B8%E6%88%8F%E5%86%85%E5%AE%B9/6-%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%9C%E7%A8%8B%E6%AD%A6%E5%99%A8.html?catalog=1)来自定义你的远程武器。
|
||||
|
||||
自定义时,要注意三点:第一点,弓的ID可以随意写,但要足够个性化防止冲突。
|
||||
|
||||
因此,不推荐参考官方教程的以下部分:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
第二点,`minecraft:use_duration`应该设为72000(也就是一小时,因为1秒对应20帧),而不是40,100这些。
|
||||
|
||||
|
||||
|
||||
因此,不推荐参考官方教程的以下部分:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
那么什么时候需要这种较小的数字呢?use_duration决定了长按屏幕时物品序列帧播放时间,因此在我们今天的条件中,它最小也得是20(即1秒),如果太短,序列帧还没播放完,物品的使用时间就到了。
|
||||
|
||||
物品的使用时间到了之后,如果玩家还在右键或者长按屏幕,那么会再次触发`ClientItemTryUseEvent/ServerItemTryUseEvent`事件,并再播放序列帧。所以如果你要做连发武器配序列帧,这个数字就可以决定你武器的射速。
|
||||
|
||||
第三点,你并不需要配置`minecraft:use_animation`和`netease:render_offsets`。
|
||||
|
||||
按照以上三点,结合网易教程做好自定义弓后,就可以给他上原版动画了。
|
||||
|
||||
资源包下新增attachables文件夹,在里面新增一个json文件。json文件内容如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version":"1.10.0",
|
||||
"minecraft:attachable":{
|
||||
"description":{
|
||||
"identifier":"sevenstars:torch_bow",//这里换成你的物品id
|
||||
"materials":{
|
||||
"default":"entity_alphatest",
|
||||
"enchanted":"entity_alphatest_glint"
|
||||
},
|
||||
"textures":{
|
||||
"default":"textures/items/sevenstars_torch_bow_standby",//未拉弓时的物品贴图
|
||||
"bow_pulling_0":"textures/items/sevenstars_torch_bow_pulling_0",//拉弓贴图1
|
||||
"bow_pulling_1":"textures/items/sevenstars_torch_bow_pulling_1",//拉弓贴图2
|
||||
"bow_pulling_2":"textures/items/sevenstars_torch_bow_pulling_2",//拉弓贴图3
|
||||
"enchanted":"textures/misc/enchanted_item_glint"
|
||||
},
|
||||
"geometry":{
|
||||
"default":"geometry.bow_standby",
|
||||
"bow_pulling_0":"geometry.bow_pulling_0",
|
||||
"bow_pulling_1":"geometry.bow_pulling_1",
|
||||
"bow_pulling_2":"geometry.bow_pulling_2"
|
||||
},
|
||||
"animations":{
|
||||
"wield":"animation.bow.wield",
|
||||
"wield_first_person_pull":"animation.bow.wield_first_person_pull"
|
||||
},
|
||||
"scripts":{
|
||||
"animate":[
|
||||
"wield",
|
||||
{
|
||||
"wield_first_person_pull":"query.main_hand_item_use_duration > 0.0f && c.is_first_person"
|
||||
}
|
||||
]
|
||||
},
|
||||
"render_controllers":[
|
||||
"controller.render.bow"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
按照上面json文件里的注释,把物品id和四张图片修改成自己的,进游戏就能看到效果了。
|
||||
|
||||
为什么这么写就可以呢?首先,只要手中物品的名字等于`attachables`的json里的identifier,我的世界就会自动把手持物品换成上面json里的模型,并使用上面定义的贴图,以及动画和渲染控制器等。因为`controller.render.bow`里是按照`use_duration`来切换上方`geometry`里的模型,从而做到拉弓动画的,所以我才说`minecraft:use_duration`不应该小于20,不然它都来不及切换到最后一个模型。因此如果你的弓不是连发,请将它设为72000保持和原版弓一致。
|
||||
|
||||
如果物品栏里的序列帧可以播放的再快点,我们就可以自己写一个渲染控制器代替`controller.render.bow`,来让模型的切换和物品栏序列帧保持同步,问题就是`netease:frame_animation`这个json接口只能慢速播放,它不能自定义播放帧率,因此目前用这种方法实现的最快射速只能是1秒一下。
|
||||
|
||||
然后,我们配置第三人称拉弓动画。要做到第三人称的动画同步,需要做两件事,在客户端监听`AddPlayerCreatedClientEvent`事件,这样就能知道客户端加载了任意玩家,在回调函数里写入如下代码,并按照里面中文部分的要求,替换字符串即可。
|
||||
|
||||
```python
|
||||
comp = clientApi.GetEngineCompFactory().CreateActorRender(args['playerId'])
|
||||
|
||||
comp.AddPlayerAnimation('在这里填写一个英文id,要保证个性化防止冲突', 'animation.player.bow_equipped')
|
||||
|
||||
comp.AddPlayerAnimationIntoState('root', 'third_person', '对应上面填写的id', "query.is_item_name_any('slot.weapon.mainhand', '这里填写你的弓id,我的是sevenstars:torch_bow') && (variable.item_use_normalized > 0 && variable.item_use_normalized < 1.0)")
|
||||
```
|
||||
|
||||
**最后效果如图:**
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
33
docs/mconline/90-知识库获奖教程/3-自定义内容/3-创建生物背包.md
Normal file
33
docs/mconline/90-知识库获奖教程/3-自定义内容/3-创建生物背包.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# 创建生物背包
|
||||
|
||||
> 本篇教程获得第一期知识库优秀教程奖。
|
||||
>
|
||||
> 获奖作者:橘子气泡水。
|
||||
|
||||
出门捡东西装不下了怎么办,让猪猪来帮你解决。
|
||||
|
||||
**效果图**
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**效果视频**
|
||||
|
||||
<iframe frameborder="0" height="600" width="800" allowfullscreen="allowfullscreen" src="http://cc.163.com/v/core/externplayer/63e3906c308c57165bcfd40e/"/>
|
||||
|
||||
|
||||
|
||||
目标:让你的猪猪帮你背东西(移动猪包)。
|
||||
|
||||
需求:了解生物json。
|
||||
|
||||
原理:在猪猪身上添加背包组件。
|
||||
|
||||
过程:创建一个自定义生物然后在他身上添加背包组件。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后驯服它,他就是你的移动猪包了。
|
||||
40
docs/mconline/90-知识库获奖教程/3-自定义内容/4-生物的简单小知识.md
Normal file
40
docs/mconline/90-知识库获奖教程/3-自定义内容/4-生物的简单小知识.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# 生物的简单小知识
|
||||
|
||||
>本篇教程获得第一期知识库优秀教程奖。
|
||||
>
|
||||
>获奖作者:素笺淡墨。
|
||||
|
||||
1. 你的生物受到攻击后会飞上天是因为你没有在这个生物组件里面定义重力。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2. 你的生物无法被命名牌命名或者使用`SetName`没有效果,是因为你没有在组件定义这个行为。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
3. 我们都知道用这个方法可以取消实体受到的伤害。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
但是,你会发现实体还是会变红。这个时候我们需要用这个方法来取消:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
这样子就能完美的取消伤害并且生物也不会有任何的变红效果。
|
||||
|
||||
4. 关于生物更多的json行为,随便找到一个原版生物。可以使用图中的网站进行搜索。原版生物的组件名字,如果看不懂英文可以像我一样使用谷歌翻译。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
如果看不懂英文可以像我一样使用谷歌翻译。如果网站里面没有对应的组件名字,可以直接把组件名字放到谷歌翻译里面,自己结合上下文看一看。
|
||||
|
||||
677
docs/mconline/90-知识库获奖教程/3-自定义内容/5-手把手教你制作网易模组更多弓.md
Normal file
677
docs/mconline/90-知识库获奖教程/3-自定义内容/5-手把手教你制作网易模组更多弓.md
Normal file
@@ -0,0 +1,677 @@
|
||||
# 手把手教你制作网易模组更多弓
|
||||
|
||||
> 本篇教程获得第二期知识库必看教程奖。
|
||||
>
|
||||
> 获奖作者:沦陷的王国-某只苦力怕。
|
||||
|
||||
## 开头的话
|
||||
|
||||
大家好!我是某只苦力怕!今天给大家带来更多弓模组教程!!!现在这个模组在网易为免费模组,截止2022年12月20日下载量为202813,为什么这个看起来很简单的模组会有这么高的下载量呢?今天就让我来给大家从0开始教大家做这个模组, **有不足之处欢迎指正** 。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
首先是图片贴图,我在某个游戏素材平台下载到了下面这张图片。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后用texturepackerGUI这个软件把这张图片处理一下,变为大小一样的多张贴图。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后再打开ps,这里我直接用了个很笨但很方便的方法,手动选择像素点然后分成新图层,最后我们得到我们要的贴图,一张不带箭、弦不动的贴图和三张不同时期带箭、时长越久弦拉越长的贴图。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后打开我的世界编辑器(mcs),点击页面左侧栏里的内容库,点击作品模板,下载自定义远程武器,然后导入,打开编辑 。
|
||||
|
||||
导入所有贴图。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 物品设置
|
||||
|
||||
模板自带3个物品,三叉戟弓弩、弓、苹果箭,我的自定义弓用的是原版箭,那就直接用这个弓就行,点击精简分类里的物品,鼠标移动到其中一个json文件上面不点击,然后看到它会说明这个是物品行为包配置文件还是物品资源包配置文件,先对一个物品行为包配置文件右键,再点(打开文件所在位置),文件夹里中间这个文件customrangedweapon_bow.json就是我要的,其他删掉。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
但他还是不够完整,我们用Visual Studio Code(vsc)打开,然后修改一下identifier,改为自己能记得住的物品id,后面的(:bow)要留下,我改为`zcbdg:bow`,筑创冰冻弓的拼音缩写,再增加`minecraft:use_duration`和`minecraft:use_animation`这2个物品组件,前者是使用物品的最大时长,后者是定义这个物品被使用时要使用bow这个动画,下图左边为我模组里的文件,右边为模板里的文件。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后自己要做几个物品就复制几份,修改文件名称和对应文件里面的identifier。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
再用同样的方法对一个物品资源包json文件右键,打开文件所在位置,一样是中间那个文件,修改一下identifier,下图左边为我模组里的文件,右边为模板里的文件。
|
||||
|
||||

|
||||
|
||||
物品行为包json和物品资源包json文件的identifier一样的话,2个文件就绑定在一起,然后几个物品复制几份,每份都要改identifier。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后在mcs的关卡编辑界面的左下角的配置里面点物品,这里说一下物品名字怎么快速改,点你要修改的物品,在界面右侧会出现属性,点击其中的基础属性右侧的添加属性,能看到有个name,把它点一下,右边的勾自己会点上,然后点调整,就可以在属性里面改物品名称了
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后修改你的物品贴图为之前准备的不带箭、弦不动的贴图。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后点开完整目录中常用目录里的贴图,找到item_texture.json这个文件,右键用vsc打开,这里我直接放几张图,然后再说他们的意思是什么。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
会一点的应该看出来了,这里在定义序列帧,上面的最后一张图是物品属性里面的,我们需要给每个物品手动修改这个。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
改为item_texture.json这个文件里面定义的名称,我举个例子。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
这里数字3的意思就是使用我们之前准备好的三张不同时期带箭、时长越久弦拉越长的贴图,至此,自定义物品做好了,但它没有任何事件,所以下面进入程序部分。
|
||||
|
||||
|
||||
|
||||
## 程序部分
|
||||
|
||||
*他不难!!他不难!!他不难!!不要怕他!!*
|
||||
|
||||
首先需要打开python脚本文件,在目录上面的搜索里面搜索脚本,可以看到在根目录的行为包里面,点开,其中2个文件是我们现在需要注意的,`customRangedWeaponClient.py`和`customRangedWeaponServer.py`,我们都右键打开。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
这里请记住2个知识点:
|
||||
|
||||
- `customRangedWeaponClient.py`里面写的是客户端事件,关键词Client。
|
||||
- `customRangedWeaponServer.py`里面写的是服务端事件,关键词Server。
|
||||
|
||||
|
||||
|
||||
为了让我们编辑python脚本更加方便,我们点击左侧栏里面的——扩展,搜索python,点击安装,安装好后重新启动就装好了
|
||||
|
||||
然后,你应该注意到了,在花花绿绿的英文字母和符号中,有一串绿色的中文,绿色部分开头为井字符号(#)。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
这个叫做注释,在python中,行注释用#,块注释用"""。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
注释在python文件中不参与事件,所以可以随便使用,方便自己看得懂,这个模板里面,非常好心的加了几处注释,可以很容易上手。
|
||||
|
||||
然后稍微解释一下现在有的部分:
|
||||
|
||||
1. 这个部分是客户端文件的最后2个自定义函数`createParticle()`和`CreateSfx()`,依靠注释并结合上文能看出来`createParticle()`是自定义弓发射子弹(先暂时叫它子弹)后,碰到方块上后,子弹不会消失,会留在方块上,持续播放粒子特效,`CreateSfx()`是自定义弓发射的子弹命中生物后,会产生一个序列帧动画特效,来表示玩家命中生物了,我的更多弓模组,每个箭都有对应的飞行粒子效果,所以`createParticle()`对我没用,我就直接删掉,包括上面的`elif args['hitTargetType'] == "BLOCK": self.createParticle(args)`,
|
||||
|
||||

|
||||
|
||||
改完后的样子:
|
||||
|
||||
```python
|
||||
def OnProjectileDoHitEffectClientEvent(self, args):
|
||||
if args['hitTargetType'] == "ENTITY":
|
||||
self.CreateSfx(args)
|
||||
|
||||
def CreateSfx(self, args):
|
||||
# 播放序列帧动画,60 tick销毁
|
||||
pos = (args['x'], args['y'], args['z'])
|
||||
frameEntityId = self.CreateEngineSfx("textures/sfxs/buff_hongse")
|
||||
self.particleIdDict[frameEntityId] = self.tickCnt
|
||||
frameAniTransComp = compFactory.CreateFrameAniTrans(frameEntityId)
|
||||
frameAniTransComp.SetPos(pos)
|
||||
frameAniTransComp.SetRotUseZXY((0,0,0))
|
||||
frameAniTransComp.SetScale((1,1,1))
|
||||
frameAniControlComp = compFactory.CreateFrameAniControl(frameEntityId)
|
||||
frameAniControlComp.Play()
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 这个部分是客户端文件的自定义函数`OnClientItemTryUseEvent()`,功能就是检测玩家是否在使用自定义物品,即是否手持弓并开始蓄力准备发射子弹,我们需要修改if判据中的id名称,让模板能检测我们自己做的自定义物品,其中==的意思是判断是否相等的意思,即物品id确认是我们自定义的物品后,执行if块里的内容。
|
||||
|
||||
```python
|
||||
self.isUsingItem = True
|
||||
self.startUsingTick = self.tickCnt
|
||||
```
|
||||
|
||||
还有,其中or的意思是(或者),即我们这个if块里的内容想要执行,你手持物品不管是zcbzg:bow还是zcdg:bow还是zcfg:bow或者其他你自定义的物品,只要是其中一个都能执行,所以叫(或者)。
|
||||
|
||||

|
||||
|
||||
|
||||
改完后的样子:
|
||||
|
||||
```python
|
||||
def OnClientItemTryUseEvent(self, args):
|
||||
if args["itemName"] == "zcbzg:bow" or args["itemName"] == "zcdg:bow" or args["itemName"] == "zcfg:bow" or args["itemName"] == "zchtg:bow" or args["itemName"] == "zchyg:bow":
|
||||
# control camera
|
||||
self.isUsingItem = True
|
||||
self.startUsingTick = self.tickCnt
|
||||
```
|
||||
|
||||
这里的id名称,如zcbzg:bow,就是我们做自定义物品时identifier里填的物品id。
|
||||
|
||||
3. 这个部分是服务端文件的自定义函数`OnRangedWeaponReleaseUsingServerEvent()`,功能是检测玩家是否放弃使用自定义物品,也就是蓄力结束,可以把子弹发射出去了,它的前提是背包中有规定数量的物品有就发射子弹,即你用弓发射箭如果背包没箭就没办法发射,我的更多弓模组每一把弓发射的每一个子弹效果都是不同的,其实,他们只是不同的生物而已,我后面还要给每个生物都进行单独设置,所以我此处修改了很多东西,我先单独检测每一把弓的物品id,每个物品指定生成一个自己对应的生物,其中自定义函数`DecreaseCustomProjectileItemCount()`是用来减掉玩家背包那支被发射出去的物品的,`comp.CreateProjectileEntity()`即不是我们定义的函数也不是模板自定义的函数了,它是一个接口,功能就是发射生物,可以发射和原版雪球、鸡蛋、末影珍珠一样的实体生物,这个后面会教,你只要知道这个接口的第二个参数是填生物id的就行,比如`customrangedweapon:custom_arrow_hyg`,这个是火焰弓`(zchyg:bow)`发射的生物的生物id。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
改完后的样子:
|
||||
|
||||
```python
|
||||
def OnRangedWeaponReleaseUsingServerEvent(self, args):
|
||||
playerId = args["playerId"]
|
||||
itemDict = args["itemDict"]
|
||||
count, slotIndex = self.GetCustomProjectileItemInfo(playerId)
|
||||
# 物品栏中customrangedweapon:projectile数量大于0时才能发射抛射物
|
||||
if count > 0:
|
||||
comp = compFactory.CreatePos(playerId)
|
||||
pos = comp.GetPos()
|
||||
comp = compFactory.CreateProjectile(serverApi.GetLevelId())
|
||||
power = self.getLaunchPower(args["durationLeft"], args["maxUseDuration"])
|
||||
# 这里可以通过修改customrangedweapon:custom_arrow来切换不同的抛射物
|
||||
param = {"power": 1.6 * power}
|
||||
if itemDict["newItemName"] == "zchyg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(
|
||||
playerId, "customrangedweapon:custom_arrow_hyg", param
|
||||
)
|
||||
if projectile_entity_id != "-1":
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
if itemDict["newItemName"] == "zcbzg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(
|
||||
playerId, "customrangedweapon:custom_arrow_bzg", param
|
||||
)
|
||||
if projectile_entity_id != "-1":
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
if itemDict["newItemName"] == "zcdg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(
|
||||
playerId, "customrangedweapon:custom_arrow_dg", param
|
||||
)
|
||||
if projectile_entity_id != "-1":
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
if itemDict["newItemName"] == "zcfg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(
|
||||
playerId, "customrangedweapon:custom_arrow_fg", param
|
||||
)
|
||||
if projectile_entity_id != "-1":
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
if itemDict["newItemName"] == "zchtg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(
|
||||
playerId, "customrangedweapon:custom_arrow_htg", param
|
||||
)
|
||||
if projectile_entity_id != "-1":
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
if itemDict["newItemName"] == "zcbdg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(
|
||||
playerId, "customrangedweapon:custom_arrow_bdg", param
|
||||
)
|
||||
if projectile_entity_id != "-1":
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
if itemDict["newItemName"] == "zcldg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(
|
||||
playerId, "customrangedweapon:custom_arrow_ldg", param
|
||||
)
|
||||
if projectile_entity_id != "-1":
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
else:
|
||||
print("没有足够弹药发射抛射物")
|
||||
```
|
||||
|
||||
|
||||
|
||||
4. 这个部分是服务端文件的自定义函数`GetCustomProjectileItemInfo()`,功能是获取玩家背包某个物品的数量,即检测玩家背包是否有箭的实际事件部分,这里要进行个小修改,原本的`xrange(0, 9)`只能检测玩家主物品栏的10个格子,背包里的就检测不到,所以改为`range(0, 36)`,去掉x,9改36,然后将需要被检测为发射物品的物品id修改一下,因为我的更多弓只发射原版的箭,所以我改为`minecraft:arrow`。
|
||||
|
||||

|
||||
|
||||
|
||||
改好的样子:
|
||||
|
||||
```python
|
||||
def GetCustomProjectileItemInfo(self, playerId):
|
||||
"""
|
||||
获取物品customrangedweapon:projectile的<数量, slotIndex>
|
||||
"""
|
||||
comp = compFactory.CreateItem(playerId)
|
||||
for i in range(0, 36):
|
||||
data = comp.GetPlayerItem(serverApi.GetMinecraftEnum().ItemPosType.INVENTORY, i)
|
||||
if data and data["itemName"] == "minecraft:arrow":
|
||||
return data["count"], i
|
||||
return 0, 0
|
||||
```
|
||||
|
||||
至此,自定义物品的事件全部完成,进入下一步 **自定义抛掷生物** 。
|
||||
|
||||
|
||||
|
||||
## 自定义抛掷生物
|
||||
|
||||
很明显,我们使用模板提供的生物是远远不够的,用原版生物也很单调,我的更多弓在模板的基础上修改了一些东西,首先是生物行为文件重写:
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version":"1.13.0",
|
||||
"minecraft:entity":{
|
||||
"description":{
|
||||
"identifier":"customrangedweapon:custom_arrow_bdg",
|
||||
"is_spawnable":false,
|
||||
"is_summonable":true,
|
||||
"is_experimental":false,
|
||||
"scripts":{
|
||||
"animate":[
|
||||
"bdglz"
|
||||
]
|
||||
},
|
||||
"animations":{
|
||||
"bdglz":"controller.animation.bdglz"
|
||||
}
|
||||
},
|
||||
"component_groups":{
|
||||
|
||||
},
|
||||
"components":{
|
||||
"minecraft:projectile":{
|
||||
"on_hit":{
|
||||
"impact_damage":{
|
||||
"damage":3,
|
||||
"knockback":true,
|
||||
"semi_random_diff_damage":false,
|
||||
"destroy_on_hit":true
|
||||
},
|
||||
"stick_in_ground":{
|
||||
"shake_time":0.35
|
||||
},
|
||||
"mob_effect":{
|
||||
"effect":"slowness",
|
||||
"duration":200,
|
||||
"durationeasy":200,
|
||||
"durationnormal":200,
|
||||
"durationhard":200,
|
||||
"amplifier":999,
|
||||
"visible":false
|
||||
}
|
||||
},
|
||||
"hit_sound":"bow.hit",
|
||||
"power":10,
|
||||
"gravity":0.0039,
|
||||
"uncertainty_base":1,
|
||||
"uncertainty_multiplier":0,
|
||||
"anchor":1,
|
||||
"should_bounce":true,
|
||||
"offset":[
|
||||
0,
|
||||
-0.1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"netease:custom_entity_type":{
|
||||
"value":"projectile_entity"
|
||||
},
|
||||
"netease:pick_up":{
|
||||
"item_name":"minecraft:arrow",
|
||||
"favored_slot":1
|
||||
},
|
||||
"minecraft:collision_box":{
|
||||
"width":0.25,
|
||||
"height":0.25
|
||||
},
|
||||
"minecraft:hurt_on_condition":{
|
||||
"damage_conditions":[
|
||||
{
|
||||
"filters":{
|
||||
"test":"in_lava",
|
||||
"subject":"self",
|
||||
"operator":"==",
|
||||
"value":true
|
||||
},
|
||||
"cause":"lava",
|
||||
"damage_per_tick":4
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"events":{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
点击精简分类里的实体,鼠标移动到其中一个json文件上面不点击,然后看到它会说明这个是实体行为包配置文件还是实体资源包配置文件,先对一个实体行为包配置文件右键,再点(打开文件所在位置),文件夹里选一个文件,修改它的内容,改为上面的那一大段,其中有一个`netease:pick_up`组件,它的内容为`"item_name": "minecraft:arrow"`,`"favored_slot": 1`,联系上下文可以知道,它的功能是如果这个生物触碰到方块后不会立刻消失,而是会留在方块上,玩家靠近后,可以把它重新捡起来,回到背包里,因为我的更多弓是发射原版的箭所以我这的物品id就用的`minecraft:arrow`,还有,`minecraft:projectile`这个组件,是用来定义这个生物的抛掷物属性!比如它的`on_hit`中的`mob_effect`,联系上下文可以知道,它的功能是如果这个生物碰到生物就等于射中目标,并且给目标附加药水效果,这里我做的是冰冻弓,射中目标后会让目标无法行动,也就是给予时长200秒的1000级的`slowness`(缓慢)效果,所以`amplifier`写999,其他写200(药水效果初始等级为1,对应`amplifier`写0),再比如`minecraft:projectile`这个组件的`on_hit`中的`impact_damage`,内容为`"damage": 3`,`"knockback": true`,`"semi_random_diff_damage": false`,`"destroy_on_hit": true`,这个数字3就是命中后造成的伤害,`knockback`的意思为是否击退命中的目标,填true就是会击退,填false就是不会击退,上面这些都只能用vsc打开然后自己手改,目前在mcs里面是没法改的,包括identifier,它在mcs里面也是没办法修改的,但它关系到生物id,我们在讲脚本的自定义函数`OnRangedWeaponReleaseUsingServerEvent()`时说过,里面用到了一个`comp.CreateProjectileEntity()`接口用来发射生物,其中comp在模板里面已经帮我们定义好了(也就是`comp = compFactory.CreateProjectile(serverApi.GetLevelId())`这部分),我们只需要修改`CreateProjectileEntity()`这个括号里的参数就行,比如我使用`zcbdg:bow(冰冻弓)`发射冰冻箭生物而且冰冻箭生物的实体行为文件中的identifier我写`customrangedweapon:custom_arrow_bdg`那对应的事件部分就是:
|
||||
|
||||
```python
|
||||
if itemDict["newItemName"] == "zcbdg:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(playerId, "customrangedweapon:custom_arrow_bdg", param)
|
||||
if projectile_entity_id != '-1':
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
```
|
||||
|
||||
再举个例子,比如我做了一个自定义物品苦力怕qiang,物品id是klpqiang:bow,然后做了个自定义生物苦力怕子弹,对应实体行为文件中的identifier我写muapapa:bdg,那对应的事件部分就是:
|
||||
|
||||
```python
|
||||
if itemDict["newItemName"] == "klpqiang:bow":
|
||||
projectile_entity_id = comp.CreateProjectileEntity(playerId, "muapapa:bdg", param)
|
||||
if projectile_entity_id != '-1':
|
||||
self.DecreaseCustomProjectileItemCount(slotIndex, count - 1, playerId)
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后要做几个不同效果的箭(不同生物)就复制几份,修改文件名和文件内的内容。
|
||||
|
||||
再看实体资源包配置文件,文件`custom_arrow.entity.json`正是我们要用的,修改文件名及其文件里的identifier,要和实体行为包配置文件里的identifier一样,identifier一样的话,2个文件就绑定在一起,然后几个物品复制几份,每份都要改identifier,有基础的开发者,如果学会了改生物的模型和贴图,这里可以自己改,讲到生物模型了,再讲一下这个模板里面提供的模型,它在材质包文件夹models的entity文件夹中,叫`custom_arrow.geo.json`,我们用建模软件Blockbench打开它后能看到这个模型居然有一点点位置上的错误,虽然错误不明显,不改也能用,但建议会用Blockbench可以把它改一下,
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
前面说过我的更多弓模组,每个箭都有对应的飞行粒子效果,在实体行为包配置文件中有这么一段:
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts":{
|
||||
"animate":[
|
||||
"bdglz"
|
||||
]
|
||||
},
|
||||
"animations":{
|
||||
"bdglz":"controller.animation.bdglz"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
这样写可以给生物加上一个动画控制器,也就是下一个部分—— **行为包动画控制器** 。
|
||||
|
||||
|
||||
|
||||
## 行为包动画控制器
|
||||
|
||||
首先,打开mcs,在资源管理里选完整目录,点根目录,再右键行为包,选择(打开当前文件夹),在这个文件夹里新建一个文件夹名字叫animation_controllers,打开这个文件夹,在里面新建一个txt文本文档(或者你直接新建json文件也行),右键新建的文本,选择重命名,把文件的后缀名(.txt)改为(.json),文件名随意,用vsc打开,在里面手动输入下面这段内容:
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version":"1.10.0",
|
||||
"animation_controllers":{
|
||||
"controller.animation.bdglz":{
|
||||
"initial_state":"default",
|
||||
"states":{
|
||||
"default":{
|
||||
"transitions":[
|
||||
{
|
||||
"attacking":"(1.0)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"attacking":{
|
||||
"on_entry":[
|
||||
"/particle hejin:yyaflz ~ ~ ~"
|
||||
],
|
||||
"transitions":[
|
||||
{
|
||||
"dimian":"query.is_moving==0.0"
|
||||
},
|
||||
{
|
||||
"default":"(1.0)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"dimian":{
|
||||
"transitions":[
|
||||
{
|
||||
"attacking":"query.is_moving==1.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
会一点的可以看出来,行为包动画控制器和材质包里面的动画控制器格式一样,唯一不一样的地方在on_entry取代了animations,这里on_entry是用来执行一个游戏里的指令的,我这里执行了播放粒子效果的指令`/particle`,因为格式一样,所以`controller.animation.bdglz`也是动画控制器名,在实体行为包配置文件中animations里面就写了`controller.animation.bdglz`,2处写一样的动画控制器名就可以把2个文件绑定,再看`transitions`中的`query.is_moving`,它是一种叫molang的语言,大家可以通过这个网站进行学习:[molang文档](https://wiki.mcbe-dev.net/p/Molang#%E6%9F%A5%E8%AF%A2%E5%87%BD%E6%95%B0%E6%B8%85%E5%8D%95),通过这个网站我们能知道`query.is_moving`是用来检测实体是否正在移动,结合上下文可知,这段内容的功能就是,当生物被发射出去后,会一直执行指令,产生飞行粒子,直到射中目标后生物消失或者射中方块后停留在方块上,停留在方块上时不执行指令,不产生粒子,但是,如果此时生物停留的方块没了,生物开始往下坠落,直到射中目标或方块,下坠过程中会继续执行指令,继续产生粒子,但是,原版的粒子很少很难看,我的更多弓,都会产生自定义的粒子,且每个生物产生的粒子颜色都不一样,所以我们要进行下一步—— **自定义粒子** 。
|
||||
|
||||
|
||||
|
||||
## 自定义粒子
|
||||
|
||||
这里用到了一个非常好用的粒子制作网站[暴雪粒子网](https://snowstorm.app/),可惜这个网站不支持中文,但是也有中文版,只要下载下来就能用,详情看这个视频:[【Minecraft基岩版 粒子效果制作器汉化版】](https://www.bilibili.com/video/BV1GL4y1M7kd?vd_source=f27a2fcb40972f864c9259a5c844d5b7),我是因为用熟练了,直接用浏览器自带的在线翻译就能看懂了,看不懂的可以下载这个中文版试试,然后,这里简要描述一下粒子制作步骤。
|
||||
|
||||
1. 修改粒子贴图和粒子大小:从下图能看到,(粒子)里面的外观可以控制粒子的大小,(粒子)里面的质地可以控制粒子的贴图,通过鼠标点击设置和手动输入具体数值,可以制作出自己想要的好看粒子,非常简单,多试几次就懂了。
|
||||
|
||||

|
||||
|
||||
**附加步骤、修改粒子的颜色:在(粒子)里面的颜色和光线里面我们可以设置粒子的颜色,甚至可以做变色粒子,心细的能看到我粒子贴图里面的颜色是白色的,但生成的粒子却是黄色的,就是在这里修改了粒子颜色。**
|
||||
|
||||
2. 修改粒子的数量和存在时长:
|
||||
|
||||
从下图能看到,(发射)里面的率和发射器寿命可以控制粒子的数量,我图里这样写的意思是一次指令就最多生成4个粒子,然后(粒子)里面的辈子可以控制粒子的存在时长,在辈子的最大年龄这里我写的是`math.random(3,8)`,这里用到了一个函数,`math.random(x,y)`,它可以自动生成一个大于等于x,小于不等于y的数字,我图里这样写的意思是这个粒子会最少存在时间持续3秒,最多存在时间不超过8秒。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
3. 修改粒子的运动起点和运动方式:
|
||||
|
||||
从下图能看到,(发射)里面的形状可以控制粒子的运动起点,然后(粒子)里面的运动和旋转可以控制粒子的运动方式,涉及到速度、方向、加速度等操作,这里也一样经常用到`math.random()`函数,因为它可以做到每次产生粒子时不出现重复的情况,让粒子更加好看。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
4. 修改粒子id:
|
||||
|
||||
从下图能看到,(影响)里面的元可以控制粒子的粒子id,也就是我执行`/particle hejin:yyaflz ~ ~ ~`这个指令时,里面输入的`hejin:yyaflz`就是粒子id,可以自己设置为好记的。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
5. 把粒子导出网站并导入mcs:
|
||||
|
||||
点击文件,再点击Download,下载文件后去找这个文件在哪,一般都在浏览器的默认下载文件夹里面,打开mcs,在编辑界面的导入中选择导入原版粒子特效,如果无法导出导入,你也可以点开网站右上角的(法典),里面是文件内的内容,我们复制下来,在mcs编辑界面的资源管理里的搜索中输入particles,找到材质包中的粒子文件夹,右键然后点击(打开当前文件夹),在这个文件夹里面新建一个txt文本文档(或者你直接新建json文件也行),右键新建的文本,选择重命名,把文件的后缀名(.txt)改为(.json),文件名随意,用vsc打开,在里面粘贴你在(法典)中复制的内容。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
6. 修改文件中贴图的位置:
|
||||
|
||||
当导入好粒子后,还要点开这个粒子的json文件,然后手动修改`"basic_render_parameters": {"material": "particles_alpha","texture": "textures/particle/yya"}`里texture的内容,它是个文件路径,通过这个路径可以找到你的粒子贴图,textures是文件夹名称,particle也是文件夹名称,yya是这个贴图图片的文件名。
|
||||
|
||||
这里我分享一个我自己做的粒子的json文件:
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version":"1.10.0",
|
||||
"particle_effect":{
|
||||
"description":{
|
||||
"identifier":"hejin:yyaflz",
|
||||
"basic_render_parameters":{
|
||||
"material":"particles_alpha",
|
||||
"texture":"textures/particle/yya"
|
||||
}
|
||||
},
|
||||
"components":{
|
||||
"minecraft:emitter_local_space":{
|
||||
"position":true,
|
||||
"rotation":true
|
||||
},
|
||||
"minecraft:emitter_rate_steady":{
|
||||
"spawn_rate":100,
|
||||
"max_particles":4
|
||||
},
|
||||
"minecraft:emitter_lifetime_looping":{
|
||||
"active_time":1
|
||||
},
|
||||
"minecraft:emitter_shape_disc":{
|
||||
"surface_only":true,
|
||||
"direction":"outwards"
|
||||
},
|
||||
"minecraft:particle_lifetime_expression":{
|
||||
"max_lifetime":"math.random(3, 8)"
|
||||
},
|
||||
"minecraft:particle_initial_speed":"Math.random(0, 0.3)",
|
||||
"minecraft:particle_motion_dynamic":{
|
||||
"linear_acceleration":[
|
||||
"Math.random(-0.5, 0.5)",
|
||||
"Math.random(-0.5, 0.5)",
|
||||
"Math.random(-0.5, 0.5)"
|
||||
]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard":{
|
||||
"size":[
|
||||
0.15,
|
||||
0.15
|
||||
],
|
||||
"facing_camera_mode":"rotate_xyz",
|
||||
"uv":{
|
||||
"texture_width":32,
|
||||
"texture_height":9,
|
||||
"flipbook":{
|
||||
"base_UV":[
|
||||
0,
|
||||
1
|
||||
],
|
||||
"size_UV":[
|
||||
7,
|
||||
7
|
||||
],
|
||||
"step_UV":[
|
||||
8,
|
||||
0
|
||||
],
|
||||
"max_frame":4,
|
||||
"stretch_to_lifetime":true
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_lighting":{
|
||||
|
||||
},
|
||||
"minecraft:particle_appearance_tinting":{
|
||||
"color":[
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
上面都做完后,当你游戏里输入指令后,例如`/particle hejin:yyaflz ~ ~ ~`,就会执行成功,产生粒子,当然我们做这么多是为了让我们发射的生物有飞行粒子,让它看起来更好看,然后需要几个不同颜色、样子的粒子就复制粘贴这个文件几遍,再修改文件名、粒子id和粒子颜色。
|
||||
|
||||
|
||||
|
||||
**然后,到现在一个完整的模组基本就做好了** 。
|
||||
|
||||
接下来,优化一下各种弓的事件或组件即可,全程很多地方是改模板和复制粘贴,也该有几个地方要动脑筋了,比如我做了个爆炸弓,发射的箭不管射中目标还是碰到方块都会产生爆炸,这里说一下我的思路,首先在爆炸弓对应生物的实体行为包配置文件里的minecraft:projectile这个组件的on_hit中加入:
|
||||
|
||||
```json
|
||||
{
|
||||
"spawn_chance":{
|
||||
"first_spawn_chance":1,
|
||||
"second_spawn_chance":9999,
|
||||
"first_spawn_count":1,
|
||||
"second_spawn_count":1,
|
||||
"spawn_definition":"customrangedweapon:xjbzwbzg",
|
||||
"spawn_baby":false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
这部分是用来生成一个生物的,生物id叫做customrangedweapon:xjbzwbzg,在这个生物的实体行为包配置文件中加入组件:
|
||||
|
||||
```json
|
||||
{
|
||||
"minecraft:explode":{
|
||||
"fuse_lit":true,
|
||||
"breaks_blocks":true,
|
||||
"causes_fire":false,
|
||||
"fuse_length":0,
|
||||
"power":3
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
意思就是这个生物刚刚召唤出来后就会立刻自爆,然后众所周知,生物只做了实体行为包配置文件,没做实体资源包配置文件,那这个生物就没办法看见,所以这个生物id叫`customrangedweapon:xjbzwbzg`的生物就是个工具生物,只负责实现爆炸弓的效果。
|
||||
|
||||
|
||||
|
||||
**恭喜你,到了现在,一个完整的模组就做好了** 。
|
||||
|
||||
**感谢你的耐心观看,世上无难事,只怕有心人,希望这期教程能给你带来收获!谢谢!**
|
||||
25
docs/mconline/90-知识库获奖教程/3-自定义内容/6-基岩版粒子效果制作器(汉化版).md
Normal file
25
docs/mconline/90-知识库获奖教程/3-自定义内容/6-基岩版粒子效果制作器(汉化版).md
Normal file
@@ -0,0 +1,25 @@
|
||||
# 基岩版粒子效果制作器(汉化版)
|
||||
|
||||
> 本篇教程获得第二期知识库必看教程奖。
|
||||
>
|
||||
> 获奖作者:日月潭。
|
||||
|
||||
Snowstorm是由Jannis大神发布的一款基岩版粒子效果制作器,具有实时预览,代码同步,操作简单的优点。但对于新手开发者来说,这款软件全英文的界面可能会成为学习路上的绊脚石,因此我汉化了这款软件。
|
||||
|
||||
目前的汉化程度为100%,本人具有三年的基岩版开发经验,以及足够的英语水平,在翻译时力求做到描述准确,符合我们的阅读习惯。在原作者描述不够详细的地方也进行了补充。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**下载地址:**
|
||||
|
||||
[基岩版粒子效果制作器(汉化版)_网易我的世界论坛 (netease.com)](https://mc.netease.com/thread-916458-1-1.html)
|
||||
|
||||
**使用方法:** 下载附件,解压zip,双击Snowstorm.html用浏览器打开。
|
||||
|
||||
目前中国版有两套粒子系统,一个是游戏自带,一套是网易开发。游戏自带的粒子系统,在功能性、运行速度、可定制性上,全方位优于网易版。例如支持环境光、碰撞箱、变量和表达式等。
|
||||
|
||||
使用原版粒子系统,可以用ModAPI调用指令/particle。你也可以将原版粒子挂接到微软模型上,详见[特效挂接到模型 | 我的世界开发者官网 (163.com)](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/16-%E7%BE%8E%E6%9C%AF/9-%E7%89%B9%E6%95%88/40-%E7%89%B9%E6%95%88%E6%8C%82%E6%8E%A5%E5%88%B0%E6%A8%A1%E5%9E%8B.html?key=%E5%BE%AE%E8%BD%AF%E7%B2%92%E5%AD%90&docindex=1&type=0#%E7%89%B9%E6%95%88%E6%8C%82%E6%8E%A5%E5%88%B0%E6%A8%A1%E5%9E%8B)。
|
||||
|
||||
也可以通过网易的API使用微软粒子系统,详见 [微软粒子 | 我的世界开发者官网 (163.com)](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/%E6%8E%A5%E5%8F%A3/%E7%89%B9%E6%95%88/%E5%BE%AE%E8%BD%AF%E7%B2%92%E5%AD%90.html?catalog=1) 。
|
||||
87
docs/mconline/90-知识库获奖教程/3-自定义内容/7-自定义物品与原版生物资源导入.md
Normal file
87
docs/mconline/90-知识库获奖教程/3-自定义内容/7-自定义物品与原版生物资源导入.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# 自定义物品与原版生物资源导入
|
||||
|
||||
>本篇教程获得第二期知识库优秀教程奖。
|
||||
>
|
||||
>获奖作者:志愿者-顾宇。
|
||||
|
||||
看到有很多新人开发作者有需要问题不会,只能尽我所能去教学。
|
||||
|
||||
|
||||
|
||||
## 自定义物品
|
||||
|
||||
第一步打开新建。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
第二步找到要自定义的主体(我这里选的是武器) 。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后查看右边的状态栏,有自定义武器的名称,各种属性,最重要的的是如何选择自己做好的武器贴图。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
找到正下方的状态栏,其中有一个是贴图,打开这个。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
打开之后,右键第一个贴图,找到打开文件所在位置,点击把做好的贴图复制进去即可【注意:贴图文件名不能含有中文】。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
如果你想做的是自定义食物,还需要在资源包组件一栏添加动作属性【eat】 。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 原版生物纹理导入
|
||||
|
||||
首先你需要一个原版生物模型,使用绘画软件 **{这里推荐blockbench}** 。
|
||||
|
||||
做好之后导出选择json文件 。
|
||||
|
||||
导入进编辑器 。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
然后让我们进游戏看看效果吧。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
模型导入同上。错误的地方欢迎指正。
|
||||
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_1.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_1.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_2.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_2.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_3.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_3.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_4.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_4.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_5.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_5.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_6.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_6.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_7.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_7.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_8.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/0_8.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_1.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_1.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_2.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_2.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_3.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_3.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_4.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_4.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_5.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_5.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_6.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_6.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_7.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/1_7.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_1.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_1.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_2.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_2.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_3.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_3.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_4.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/2_4.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/3_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/3_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/3_1.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/3_1.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_1.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_1.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_2.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_2.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_3.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_3.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_4.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/4_4.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_1.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_1.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_10.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_10.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_11.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_11.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_12.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_12.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_13.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_13.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_14.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_14.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_15.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_15.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_16.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_16.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_17.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_17.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_18.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_18.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_19.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_19.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_2.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_2.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_20.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_20.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_21.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_21.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_22.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_22.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_23.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_23.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_24.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_24.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_25.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_25.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_26.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_26.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_27.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_27.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_28.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_28.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_29.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_29.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_3.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_3.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_30.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_30.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_31.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_31.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_32.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_32.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_33.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_33.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_34.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_34.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_35.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_35.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_36.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_36.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_37.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_37.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_38.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_38.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_4.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_4.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_5.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_5.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_6.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_6.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_7.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_7.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_8.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_8.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_9.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/5_9.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/6_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/6_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_0.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_0.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_1.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_1.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_10.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_10.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_11.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_11.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_12.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_12.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_2.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_2.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_3.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_3.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_4.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_4.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_5.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_5.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_6.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_6.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_7.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_7.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_8.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_8.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_9.png
LFS
Normal file
BIN
docs/mconline/90-知识库获奖教程/3-自定义内容/images/7_9.png
LFS
Normal file
Binary file not shown.
Reference in New Issue
Block a user