Files
netease-modsdk-wiki/docs/wiki/items/throwable.md
2025-03-20 11:52:46 +08:00

388 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 投掷物
category: 巧思案例
tags:
- 中级
mentions:
- Fabrimat
- MedicalJewel105
- Luthorius
- IlkinQafarov
- seeit360
- TheItsNameless
- SmokeyStack
- ThomasOrs
---
# 投掷物
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
::: tip
本教程假定您已掌握 Molang、动画控制器和实体定义的基础知识。
:::
类似喷溅药水或三叉戟这样的物品属于可投掷的特殊物品。目前有两种方式可以在附加包中实现类似效果,一种适用于稳定版,另一种需要开启 `Holiday Creator Features` 实验性功能。
## 稳定版实现方案
此方案通过动画控制器检测 `minecraft:food` 组件的使用情况,并通过修改 `player.json` 在投掷时生成实体。
### 物品定义
首先创建可投掷物品:
::: code-group
```json [BP/items/throwable_item.item.json]
{
"format_version": "1.16.0",
"minecraft:item": {
"description": {
"identifier": "wiki:throwable_item"
},
"components": {
"minecraft:max_stack_size": 16,
"minecraft:use_duration": 12000,
"minecraft:food": {
"can_always_eat": true
}
}
}
}
```
:::
关键点解析:
- `format_version` 必须为 `1.16.0`
- `minecraft:use_duration` 需设置较大值以防止播放进食音效
- `minecraft:food` 组件用于启用物品使用检测
由于格式版本为 `1.16.0`,需添加资源包定义:
::: code-group
```json [RP/items/throwable_item.item.json]
{
"format_version": "1.16.0",
"minecraft:item": {
"description": {
"identifier": "wiki:throwable_item",
"category": "Equipment"
},
"components": {
"minecraft:icon": "throwable_item"
}
}
}
```
:::
### 实体定义
该实体将作为实际投掷物,具有弹射物特性。注意添加雪球运行时标识使实体具有投射行为,也可尝试其他投射物标识。
::: code-group
```json [BP/entities/throwable_item_entity.se.json]
{
"format_version": "1.16.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:throwable_item_entity",
"is_spawnable": false,
"is_summonable": true,
"is_experimental": false,
"runtime_identifier": "minecraft:snowball"
},
"components": {
"minecraft:collision_box": {
"width": 0.25,
"height": 0.25
},
"minecraft:projectile": {
"on_hit": {
"grant_xp": {
"minXP": 3,
"maxXP": 5
},
"impact_damage": {
"damage": 16
},
"remove_on_hit": {}
},
"power": 0.7,
"gravity": 0.03,
"angle_offset": -20.0,
"hit_sound": "glass"
},
"minecraft:physics": {},
"minecraft:pushable": {
"is_pushable": true,
"is_pushable_by_piston": true
},
"minecraft:conditional_bandwidth_optimization": {
"default_values": {
"max_optimized_distance": 80.0,
"max_dropped_ticks": 10,
"use_motion_prediction_hints": true
}
}
}
}
}
```
:::
此实体基于原版喷溅药水设计,可通过修改 `minecraft:projectile` 组件调整行为(示例中投掷物将造成伤害并给予经验)。
### 动画控制器
动画控制器负责检测物品使用并触发投掷事件:
::: code-group
```json [BP/animation_controllers/throwables.ac.json]
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.player.throwables": { // 将在玩家实体描述中引用的ID
"states": {
"default": {
"transitions": [
{
// "q.is_item_name_any" 接受三个参数槽位名称、槽位ID、检测物品
"throw_item": "q.is_item_name_any('slot.weapon.mainhand', 0, 'wiki:throwable_item') && q.is_using_item"
// "q.is_using_item" 返回布尔值表示物品使用状态
}
],
"on_entry": [
// 重置玩家状态以支持连续投掷
"@s wiki:reset_player"
]
},
"throw_item": {
"transitions": [
{
"default": "1.0"
}
],
"on_entry": [
// 触发投掷事件
"@s wiki:throw_item",
// 移除玩家物品
"/clear @s wiki:throwable_item -1 1"
]
}
}
}
}
}
```
:::
#### player.json 配置
:::tip
请确保您的 `player.json` 文件与当前游戏版本保持同步,可在此处获取最新版本:[bedrock.dev](https://bedrock.dev/packs)
:::
:::warning
请勿随意修改或删除 `player.json` 原有内容,否则可能导致游戏异常
:::
注册动画控制器至玩家实体:
::: code-group
```json [BP/entities/player.json]
{
"format_version": "1.18.20",
"minecraft:entity": {
"description": {
"identifier": "minecraft:player",
"is_spawnable": false,
"is_summonable": false,
"is_experimental": false,
"scripts": {
"animate": [
"throwables_controller" // 需与下方定义保持一致
]
},
"animations": {
"throwables_controller": "controller.animation.player.throwables" // 动画控制器ID
}
},
"components": {
"minecraft:breathable": { // 防止显示呼吸气泡
"total_supply": 15,
"suffocate_time": -1,
"inhale_time": 3.75,
"generates_bubbles": false
}
},
...
}
```
:::
添加组件组和事件:
::: code-group
```json [BP/entities/player.json#minecraft:entity]
"component_groups": {
"wiki:throw_entity": { // 包含实体生成组件
"minecraft:spawn_entity": {
"entities": {
"min_wait_time": 0,
"max_wait_time": 0,
"single_use": true,
"spawn_entity": "wiki:throwable_item_entity",
"num_to_spawn": 1
}
}
}
},
"events": {
"wiki:reset_player": {
"remove": {
"component_groups": [
"wiki:throw_entity"
]
}
},
"wiki:throw_item": {
"add": {
"component_groups": [
"wiki:throw_entity"
]
}
}
}
```
:::
## 实验版实现方案
此方案需启用 `Holiday Creator Features` 实验性功能。
### 物品定义
::: code-group
```json [BP/items/throwable_item.item.json]
{
"format_version": "1.16.100",
"minecraft:item": {
"description": {
"identifier": "wiki:throwable_item"
},
"components": {
"minecraft:max_stack_size": 16,
"minecraft:on_use": {
"on_use": {
"event": "throw"
}
},
"minecraft:icon": {
"texture": "apple"
}
},
"events": {
"throw": {
"shoot": {
"projectile": "wiki:throwable_item_entity",
"launch_power": 2,
"angle_offset": 1
},
"swing": {},
"decrement_stack": {},
"run_command": {
"command": [
"playsound fire.ignite",
"playsound mob.witch.throw"
]
}
}
}
}
}
```
:::
关键点说明:
- `format_version` 必须为 `1.16.100`
- `minecraft:on_use` 用于响应右键事件
事件参数:
- `shoot` 投射实体
- `swing` 播放挥动动画
- `decrement_stack` 减少物品堆叠
- `run_command` 执行音效指令
### 实体定义
实体文件与稳定版相同。
<Spoiler title="BP/entities/throwable_item_entity.se.json">
::: code-group
```json [BP/entities/throwable_item_entity.se.json]
{
"format_version": "1.16.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:throwable_item_entity",
"is_spawnable": false,
"is_summonable": true,
"is_experimental": false,
"runtime_identifier": "minecraft:snowball"
},
"components": {
"minecraft:collision_box": {
"width": 0.25,
"height": 0.25
},
"minecraft:projectile": {
"on_hit": {
"grant_xp": {
"minXP": 3,
"maxXP": 5
},
"impact_damage": {
"damage": 16
},
"remove_on_hit": {}
},
"power": 0.7,
"gravity": 0.03,
"angle_offset": -20.0,
"hit_sound": "glass"
},
"minecraft:physics": {},
"minecraft:pushable": {
"is_pushable": true,
"is_pushable_by_piston": true
},
"minecraft:conditional_bandwidth_optimization": {
"default_values": {
"max_optimized_distance": 80.0,
"max_dropped_ticks": 10,
"use_motion_prediction_hints": true
}
}
}
}
}
```
:::
</Spoiler>
## 扩展应用
完成基础投掷物后,您可以尝试以下扩展:
- 调整投射力度和弹道参数
- 添加粒子效果和高级动画
- 组合使用[区域效果云](/wiki/entities/introduction-to-aec)
- 实现不同命中效果(燃烧、中毒等)
通过灵活运用组件和事件系统,可以创造出丰富的投掷物玩法。