This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -0,0 +1,102 @@
# 制作生物死亡动画
> 本篇教程获得第一期知识库必看教程奖。
>
> 获奖作者:艾诺德。
今天的教程将教各位开发者制作实体死亡动画。这项技术经常被应用于包含动作优化/Boss生物的模组中。
**教程概述:**
主要功能:在实体死亡时播放自定义死亡动画。
实现步骤:
- 检测实体死亡。
- 实体死亡时替换原版动画。
- 动画播放完成后清除实体。
**学习本教程的前置技术要求:**
- 了解json语法格式。
- 了解生物行为代码并能熟练自定义 **component_groups****events** 中的内容。
- 会使用生物动画控制器且会制作原版生物动画。
**让我们先看看最终效果:**
如下图所示,连弩实体死亡时并没有和原版一样表现出全身泛红倒下,而是播放了我们自定义的死亡动画。
![img](./images/0_0.png)
首先我们需要在BlockBench内制作一个生物死亡动画。
![img](./images/0_1.png)
**注意:**
1. 该动画必须是循环播放。
2. 无论你实际的动画时长多少你都需要将该动画时长设置为999见下图所示毕竟我们不想看见生物反复去世对吧
![img](./images/0_2.png)
3. 该动画可设置"override_previous_animation",设置后可避免生物死亡后在播放动画时发生位移而同时播放行走动画产生诡异的效果。
在准备工作完成后,我们先制作动画控制器(代码如下图所示) 。
![img](./images/0_3.png)
由于实体死亡并没有提供molang因此我们使用`query.variant`进行自定义的死亡状态判定。
**在将动画控制器及动画挂载到entity文件中后材质包中的工作就算完成了。**
接下来我们开始编写实体的行为文件。首先我们需要在`component_groups`创建`death``alive`两个group根据动画控制器里的条件我们需要将两个组的`variant`分别设置为1和0。核心部分代码如下图所示
![img](./images/0_4.png)
为了判定生物死亡,我们需要在`alive`组里加入如下代码:
![img](./images/0_5.png)
该代码会在生物受到致命伤害时执行`event`中定义的`minecraft:death`事件,同时阻止最后一次伤害,从而达到屏蔽实体原版死亡动画的效果,同时为了防止实体在死后仍受到伤害/移动,我们需要在`death`组中加入如下代码:
![img](./images/0_6.png)
完成上述步骤后我们需要在`event`中添加如下代码实现状态的转换:
![img](./images/0_7.png)
由于实体进入死亡状态后将进入无敌状态,在正常状况下很难让它消失,因此需要在`death`组中添加如下代码移除实体:
![img](./images/0_8.png)
上图所示代码将执行一个无破坏力的自爆对实体进行清除1.5为延迟时间,我们可以将时间调为和死亡动画实际所用时间相同的值以达到播放完动画清除实体的性格,也可以设置更多时间让实体停留一段时间。
最后我们只需要在alive组中添加实体行为代码(如攻击、仇恨目标、行走等,但如`minecraft:health``minecraft:physics`等实体基本属性组件需要添加在`components`中,并在`components`中设置`variant`为0就大功告成了感谢大家的阅读。

View File

@@ -0,0 +1,49 @@
# 生物生成建筑
> 本篇教程获得第一期知识库必看教程奖。
>
> 获奖作者:橘子气泡水。
**效果图**
![img](./images/1_0.png)
**效果视频**
<iframe frameborder="0" height="600" width="800" allowfullscreen="allowfullscreen" src="http://cc.163.com/v/core/externplayer/63e38f8529279d2f4acfc1bb/"/>
**目标**
![img](./images/1_1.png)
![img](./images/1_2.png)
![img](./images/1_3.png)
![img](./images/1_4.png)
**结构位置**
![img](./images/1_5.png)
**动画控制器**
![img](./images/1_6.png)
**Function**
![img](./images/1_7.png)
这样你就可以让你的猪帮你把房子盖好了。

View 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可以随意写但要足够个性化防止冲突。
因此,不推荐参考官方教程的以下部分:
![img](./images/2_0.png)
第二点,`minecraft:use_duration`应该设为72000也就是一小时因为1秒对应20帧而不是40100这些。
因此,不推荐参考官方教程的以下部分:
![img](./images/2_1.png)
那么什么时候需要这种较小的数字呢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)")
```
**最后效果如图:**
![img](./images/2_2.png)
![img](./images/2_3.png)
![img](./images/2_4.png)

View File

@@ -0,0 +1,33 @@
# 创建生物背包
> 本篇教程获得第一期知识库优秀教程奖。
>
> 获奖作者:橘子气泡水。
出门捡东西装不下了怎么办,让猪猪来帮你解决。
**效果图**
![img](./images/3_0.png)
**效果视频**
<iframe frameborder="0" height="600" width="800" allowfullscreen="allowfullscreen" src="http://cc.163.com/v/core/externplayer/63e3906c308c57165bcfd40e/"/>
目标:让你的猪猪帮你背东西(移动猪包)。
需求了解生物json。
原理:在猪猪身上添加背包组件。
过程:创建一个自定义生物然后在他身上添加背包组件。
![img](./images/3_1.png)
然后驯服它,他就是你的移动猪包了。

View File

@@ -0,0 +1,40 @@
# 生物的简单小知识
>本篇教程获得第一期知识库优秀教程奖。
>
>获奖作者:素笺淡墨。
1. 你的生物受到攻击后会飞上天是因为你没有在这个生物组件里面定义重力。
![img](./images/4_0.png)
2. 你的生物无法被命名牌命名或者使用`SetName`没有效果,是因为你没有在组件定义这个行为。
![img](./images/4_1.png)
3. 我们都知道用这个方法可以取消实体受到的伤害。
![img](./images/4_2.png)
但是,你会发现实体还是会变红。这个时候我们需要用这个方法来取消:
![img](./images/4_3.png)
这样子就能完美的取消伤害并且生物也不会有任何的变红效果。
4. 关于生物更多的json行为随便找到一个原版生物。可以使用图中的网站进行搜索。原版生物的组件名字如果看不懂英文可以像我一样使用谷歌翻译。
![img](./images/4_4.png)
如果看不懂英文可以像我一样使用谷歌翻译。如果网站里面没有对应的组件名字,可以直接把组件名字放到谷歌翻译里面,自己结合上下文看一看。

View File

@@ -0,0 +1,677 @@
# 手把手教你制作网易模组更多弓
> 本篇教程获得第二期知识库必看教程奖。
>
> 获奖作者:沦陷的王国-某只苦力怕。
## 开头的话
大家好我是某只苦力怕今天给大家带来更多弓模组教程现在这个模组在网易为免费模组截止2022年12月20日下载量为202813为什么这个看起来很简单的模组会有这么高的下载量呢今天就让我来给大家从0开始教大家做这个模组 **有不足之处欢迎指正**
![img](./images/5_0.png)
首先是图片贴图,我在某个游戏素材平台下载到了下面这张图片。
![img](./images/5_1.png)
然后用texturepackerGUI这个软件把这张图片处理一下变为大小一样的多张贴图。
![img](./images/5_2.png)
![img](./images/5_3.png)
然后再打开ps这里我直接用了个很笨但很方便的方法手动选择像素点然后分成新图层最后我们得到我们要的贴图一张不带箭、弦不动的贴图和三张不同时期带箭、时长越久弦拉越长的贴图。
![img](./images/5_4.png)
![img](./images/5_5.png)
然后打开我的世界编辑器(mcs),点击页面左侧栏里的内容库,点击作品模板,下载自定义远程武器,然后导入,打开编辑 。
导入所有贴图。
![img](./images/5_6.png)
## 物品设置
模板自带3个物品三叉戟弓弩、弓、苹果箭我的自定义弓用的是原版箭那就直接用这个弓就行点击精简分类里的物品鼠标移动到其中一个json文件上面不点击然后看到它会说明这个是物品行为包配置文件还是物品资源包配置文件先对一个物品行为包配置文件右键再点打开文件所在位置文件夹里中间这个文件customrangedweapon_bow.json就是我要的其他删掉。
![img](./images/5_7.png)
但他还是不够完整我们用Visual Studio Codevsc打开然后修改一下identifier改为自己能记得住的物品id后面的bow要留下我改为`zcbdg:bow`,筑创冰冻弓的拼音缩写,再增加`minecraft:use_duration``minecraft:use_animation`这2个物品组件前者是使用物品的最大时长后者是定义这个物品被使用时要使用bow这个动画下图左边为我模组里的文件右边为模板里的文件。
![img](./images/5_8.png)
然后自己要做几个物品就复制几份修改文件名称和对应文件里面的identifier。
![img](./images/5_9.png)
![img](./images/5_10.png)
再用同样的方法对一个物品资源包json文件右键打开文件所在位置一样是中间那个文件修改一下identifier下图左边为我模组里的文件右边为模板里的文件。
![img](./images/5_11.png)
物品行为包json和物品资源包json文件的identifier一样的话2个文件就绑定在一起然后几个物品复制几份每份都要改identifier。
![img](./images/5_12.png)
然后在mcs的关卡编辑界面的左下角的配置里面点物品这里说一下物品名字怎么快速改点你要修改的物品在界面右侧会出现属性点击其中的基础属性右侧的添加属性能看到有个name把它点一下右边的勾自己会点上然后点调整就可以在属性里面改物品名称了
![img](./images/5_13.png)
![img](./images/5_14.png)
然后修改你的物品贴图为之前准备的不带箭、弦不动的贴图。
![img](./images/5_15.png)
然后点开完整目录中常用目录里的贴图找到item_texture.json这个文件右键用vsc打开这里我直接放几张图然后再说他们的意思是什么。
![img](./images/5_16.png)
![img](./images/5_17.png)
![img](./images/5_18.png)
![img](./images/5_19.png)
会一点的应该看出来了,这里在定义序列帧,上面的最后一张图是物品属性里面的,我们需要给每个物品手动修改这个。
![img](./images/5_20.png)
改为item_texture.json这个文件里面定义的名称我举个例子。
![img](./images/5_21.png)
![img](./images/5_22.png)
这里数字3的意思就是使用我们之前准备好的三张不同时期带箭、时长越久弦拉越长的贴图至此自定义物品做好了但它没有任何事件所以下面进入程序部分。
## 程序部分
*他不难!!他不难!!他不难!!不要怕他!!*
首先需要打开python脚本文件在目录上面的搜索里面搜索脚本可以看到在根目录的行为包里面点开其中2个文件是我们现在需要注意的`customRangedWeaponClient.py``customRangedWeaponServer.py`,我们都右键打开。
![img](./images/5_23.png)
这里请记住2个知识点
- `customRangedWeaponClient.py`里面写的是客户端事件关键词Client。
- `customRangedWeaponServer.py`里面写的是服务端事件关键词Server。
为了让我们编辑python脚本更加方便我们点击左侧栏里面的![img](./images/5_24.png)——扩展搜索python点击安装安装好后重新启动就装好了
然后,你应该注意到了,在花花绿绿的英文字母和符号中,有一串绿色的中文,绿色部分开头为井字符号(#)。
![img](./images/5_25.png)
这个叫做注释在python中行注释用#,块注释用"""。
![img](./images/5_26.png)
注释在python文件中不参与事件所以可以随便使用方便自己看得懂这个模板里面非常好心的加了几处注释可以很容易上手。
然后稍微解释一下现在有的部分:
1. 这个部分是客户端文件的最后2个自定义函数`createParticle()``CreateSfx()`,依靠注释并结合上文能看出来`createParticle()`是自定义弓发射子弹(先暂时叫它子弹)后,碰到方块上后,子弹不会消失,会留在方块上,持续播放粒子特效,`CreateSfx()`是自定义弓发射的子弹命中生物后,会产生一个序列帧动画特效,来表示玩家命中生物了,我的更多弓模组,每个箭都有对应的飞行粒子效果,所以`createParticle()`对我没用,我就直接删掉,包括上面的`elif args['hitTargetType'] == "BLOCK": self.createParticle(args)`
![img](./images/5_27.png)
改完后的样子:
```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或者其他你自定义的物品只要是其中一个都能执行所以叫或者
![img](./images/5_28.png)
改完后的样子:
```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。
![img](./images/5_29.png)
改完后的样子:
```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)`去掉x9改36然后将需要被检测为发射物品的物品id修改一下因为我的更多弓只发射原版的箭所以我改为`minecraft:arrow`。
![img](./images/5_30.png)
改好的样子:
```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)
```
![img](./images/5_31.png)
然后要做几个不同效果的箭(不同生物)就复制几份,修改文件名和文件内的内容。
再看实体资源包配置文件,文件`custom_arrow.entity.json`正是我们要用的修改文件名及其文件里的identifier要和实体行为包配置文件里的identifier一样identifier一样的话2个文件就绑定在一起然后几个物品复制几份每份都要改identifier有基础的开发者如果学会了改生物的模型和贴图这里可以自己改讲到生物模型了再讲一下这个模板里面提供的模型它在材质包文件夹models的entity文件夹中叫`custom_arrow.geo.json`我们用建模软件Blockbench打开它后能看到这个模型居然有一点点位置上的错误虽然错误不明显不改也能用但建议会用Blockbench可以把它改一下
![img](./images/5_32.png)
前面说过我的更多弓模组,每个箭都有对应的飞行粒子效果,在实体行为包配置文件中有这么一段:
```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. 修改粒子贴图和粒子大小:从下图能看到,(粒子)里面的外观可以控制粒子的大小,(粒子)里面的质地可以控制粒子的贴图,通过鼠标点击设置和手动输入具体数值,可以制作出自己想要的好看粒子,非常简单,多试几次就懂了。
![img](./images/5_33.png)
**附加步骤、修改粒子的颜色:在(粒子)里面的颜色和光线里面我们可以设置粒子的颜色,甚至可以做变色粒子,心细的能看到我粒子贴图里面的颜色是白色的,但生成的粒子却是黄色的,就是在这里修改了粒子颜色。**
2. 修改粒子的数量和存在时长:
从下图能看到发射里面的率和发射器寿命可以控制粒子的数量我图里这样写的意思是一次指令就最多生成4个粒子然后粒子里面的辈子可以控制粒子的存在时长在辈子的最大年龄这里我写的是`math.random(3,8)`,这里用到了一个函数,`math.random(x,y)`它可以自动生成一个大于等于x小于不等于y的数字我图里这样写的意思是这个粒子会最少存在时间持续3秒最多存在时间不超过8秒。
![img](./images/5_34.png)
3. 修改粒子的运动起点和运动方式:
从下图能看到,(发射)里面的形状可以控制粒子的运动起点,然后(粒子)里面的运动和旋转可以控制粒子的运动方式,涉及到速度、方向、加速度等操作,这里也一样经常用到`math.random()`函数,因为它可以做到每次产生粒子时不出现重复的情况,让粒子更加好看。
![img](./images/5_35.png)
4. 修改粒子id
从下图能看到影响里面的元可以控制粒子的粒子id也就是我执行`/particle hejin:yyaflz ~ ~ ~`这个指令时,里面输入的`hejin:yyaflz`就是粒子id可以自己设置为好记的。
![img](./images/5_36.png)
5. 把粒子导出网站并导入mcs
点击文件再点击Download下载文件后去找这个文件在哪一般都在浏览器的默认下载文件夹里面打开mcs在编辑界面的导入中选择导入原版粒子特效如果无法导出导入你也可以点开网站右上角的法典里面是文件内的内容我们复制下来在mcs编辑界面的资源管理里的搜索中输入particles找到材质包中的粒子文件夹右键然后点击打开当前文件夹在这个文件夹里面新建一个txt文本文档或者你直接新建json文件也行右键新建的文本选择重命名把文件的后缀名.txt改为.json文件名随意用vsc打开在里面粘贴你在法典中复制的内容。
![img](./images/5_37.png)
![img](./images/5_38.png)
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`的生物就是个工具生物,只负责实现爆炸弓的效果。
**恭喜你,到了现在,一个完整的模组就做好了**
**感谢你的耐心观看,世上无难事,只怕有心人,希望这期教程能给你带来收获!谢谢!**

View File

@@ -0,0 +1,25 @@
# 基岩版粒子效果制作器(汉化版)
> 本篇教程获得第二期知识库必看教程奖。
>
> 获奖作者:日月潭。
Snowstorm是由Jannis大神发布的一款基岩版粒子效果制作器具有实时预览代码同步操作简单的优点。但对于新手开发者来说这款软件全英文的界面可能会成为学习路上的绊脚石因此我汉化了这款软件。
目前的汉化程度为100%,本人具有三年的基岩版开发经验,以及足够的英语水平,在翻译时力求做到描述准确,符合我们的阅读习惯。在原作者描述不够详细的地方也进行了补充。
![img](./images/6_0.png)
**下载地址:**
[基岩版粒子效果制作器汉化版_网易我的世界论坛 (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) 。

View File

@@ -0,0 +1,87 @@
# 自定义物品与原版生物资源导入
>本篇教程获得第二期知识库优秀教程奖。
>
>获奖作者:志愿者-顾宇。
看到有很多新人开发作者有需要问题不会,只能尽我所能去教学。
## 自定义物品
第一步打开新建。
![img](./images/7_0.png)
第二步找到要自定义的主体(我这里选的是武器) 。
![img](./images/7_1.png)
![img](./images/7_2.png)
然后查看右边的状态栏,有自定义武器的名称,各种属性,最重要的的是如何选择自己做好的武器贴图。
![img](./images/7_3.png)
找到正下方的状态栏,其中有一个是贴图,打开这个。
![img](./images/7_4.png)
打开之后,右键第一个贴图,找到打开文件所在位置,点击把做好的贴图复制进去即可【注意:贴图文件名不能含有中文】。
![img](./images/7_5.png)
如果你想做的是自定义食物还需要在资源包组件一栏添加动作属性【eat】 。
![img](./images/7_6.png)
![img](./images/7_7.png)
## 原版生物纹理导入
首先你需要一个原版生物模型,使用绘画软件 **{这里推荐blockbench}** 。
做好之后导出选择json文件 。
导入进编辑器 。
![img](./images/7_8.png)
![img](./images/7_9.png)
![img](./images/7_10.png)
![img](./images/7_11.png)
然后让我们进游戏看看效果吧。
![img](./images/7_12.png)
模型导入同上。错误的地方欢迎指正。