Skip to content

自定义传送门方块 ​

自定义传送门方块允许玩家站上去后传送到指定的维度,类似原版下界传送门。你可以通过 base_block: "portal" 和 netease:portal 组件快速创建一个维度传送入口,并配置目标维度、粒子特效和动画纹理。

前置条件

本功能不需要开启实验性玩法。请先阅读 自定义基础方块 了解方块注册流程,并阅读 自定义维度 了解如何创建自定义维度。如果你的目标维度 ID ≥ 21,需要先注册对应的自定义维度。

概述 ​

自定义传送门的核心流程:在行为包中通过 base_block: "portal" 声明方块类型,然后在 netease:portal 组件中配置目标维度和粒子特效。方块放入世界后,玩家站在上面即可触发维度传送。

传送门方块通常需要动态纹理(类似原版紫色传送门的流动效果),可通过资源包的 flipbook_textures.json 实现。

关键特性:

  • 只有玩家能通过自定义传送门传送,生物和其他实体不会触发传送
  • 当前维度与目标维度相同时不会发生传送
  • 同一玩家存在传送冷却时间,短时间内不会连续传送
  • 传送前后玩家的坐标不发生改变(不同于原版下界传送门的坐标换算)

netease:portal 组件 ​

键类型默认值说明
target_dimensionint—必填,目标维度 ID
particle_east_weststring—可选,方块延伸方向与 Z 轴同向时播放的粒子特效标识符
particle_north_southstring—可选,方块延伸方向与 X 轴同向时播放的粒子特效标识符

target_dimension 取值规则 ​

值说明
0主世界(Overworld)
1下界 — 引擎会视作 0 处理,不可使用
2末地 — 引擎会视作 0 处理,不可使用
3 ~ 20原版预留维度 ID,不建议使用
≥ 21自定义维度 ID,需要先注册对应维度

注意

target_dimension 设为 1(下界)或 2(末地)时,引擎内部会将其替换为 0(主世界)。如果你需要传送到下界或末地,请使用脚本接口而非传送门方块。

方块朝向与 aux 值 ​

传送门方块拥有两种朝向,通过附加值(aux)控制:

aux 值朝向播放的粒子
1延伸方向与 X 轴相同particle_north_south
2延伸方向与 Z 轴相同particle_east_west

避免 aux = 0

手动放置(右键放置)的传送门方块 aux 始终为 0,此时方块朝向和粒子表现异常。不建议通过手动放置创建传送门方块,应使用 /setblock 指令或脚本的 SetBlockNew 接口,并明确指定 aux 为 1 或 2。

setblock 指令示例:

/setblock 100 65 200 mymod:blue_portal 2

Python 脚本放置示例:

python
import server.extraServerApi as serverApi

comp = serverApi.GetEngineCompFactory().CreateBlockInfo(levelId)
blockDict = {'name': 'mymod:blue_portal', 'aux': 2}
comp.SetBlockNew((100, 65, 200), blockDict, dimensionId=0)

动画纹理 ​

传送门方块通常需要动态纹理效果。在资源包的 textures/flipbook_textures.json 中配置帧动画:

json
[
    {
        "flipbook_texture": "textures/blocks/blue_portal",
        "atlas_tile": "mymod:blue_portal",
        "ticks_per_frame": 4,
        "frames": [0, 1, 2, 3, 4, 5, 6, 7],
        "replicate": 1,
        "blend_frames": true
    }
]

贴图文件为竖向排列的帧动画图片,每帧大小相同(如 16×16),整张图片高度 = 帧高 × 帧数。放在 textures/blocks/blue_portal.png。

完整 JSON 示例 ​

以下示例创建一个蓝色传送门,传送到自定义维度 21。

行为包 — 方块定义 ​

文件路径:行为包/netease_blocks/blue_portal.json

json
{
    "format_version": "1.10.0",
    "minecraft:block": {
        "description": {
            "identifier": "mymod:blue_portal",
            "base_block": "portal",
            "register_to_create_menu": true,
            "category": "Nature"
        },
        "components": {
            "netease:portal": {
                "target_dimension": 21,
                "particle_east_west": "mymod:blue_portal_particle_ew",
                "particle_north_south": "mymod:blue_portal_particle_ns"
            }
        }
    }
}

资源包 — terrain_texture.json ​

文件路径:资源包/textures/terrain_texture.json

json
{
    "resource_pack_name": "mymod",
    "texture_name": "atlas.terrain",
    "texture_data": {
        "mymod:blue_portal": {
            "textures": "textures/blocks/blue_portal"
        }
    }
}

资源包 — blocks.json ​

文件路径:资源包/blocks.json

json
{
    "mymod:blue_portal": {
        "textures": "mymod:blue_portal",
        "sound": "glass"
    }
}

资源包 — flipbook_textures.json ​

文件路径:资源包/textures/flipbook_textures.json

json
[
    {
        "flipbook_texture": "textures/blocks/blue_portal",
        "atlas_tile": "mymod:blue_portal",
        "ticks_per_frame": 4,
        "frames": [0, 1, 2, 3, 4, 5, 6, 7],
        "replicate": 1,
        "blend_frames": true
    }
]

资源包 — 本地化 ​

文件路径:资源包/texts/zh_CN.lang

tile.mymod:blue_portal.name=蓝色传送门

常见问题 ​

玩家站在传送门上没有被传送 ​

排查步骤:

  1. 确认 target_dimension 的值合法(不为 1 或 2,且对应维度已注册)
  2. 确认玩家当前维度与目标维度不同(同维度不会触发传送)
  3. 确认方块的 aux 值为 1 或 2(不是 0)
  4. 确认传送冷却时间已过(短时间内多次进出不会重复传送)

传送门没有粒子特效 ​

原因: particle_east_west 和 particle_north_south 是可选字段。如果需要粒子效果,请配置对应的粒子标识符,并确保粒子资源已在资源包中注册。

传送门贴图没有动画效果 ​

原因: 未配置 flipbook_textures.json,或贴图帧数与 frames 数组不匹配。

确认贴图文件是竖向排列的帧动画图,帧数与 JSON 配置一致。

传送后坐标不对 ​

自定义传送门传送时不会改变玩家坐标。如果你需要在传送后将玩家移动到特定位置,请在脚本中监听维度切换事件并手动设置坐标。

提示

如果需要实现更复杂的传送逻辑(如坐标映射、传送前确认 UI、多人同步传送等),建议使用脚本接口配合普通方块的 netease:on_entity_inside 组件自行实现传送逻辑,而非使用 base_block: "portal"。

下一步 ​