自定义活板门
intermediate
scripting
格式与最低引擎版本 1.21.70
本教程假设您已熟练掌握方块相关知识并具备基础脚本编写能力。 开始前建议先阅读方块指南。
活板门是功能多样的方块,既可作为门扉组件、围栏装饰,当然也能发挥其原本的陷阱功能!想要为Minecraft世界增添独特的活板门设计?以下是详细实现方法:
方块JSON配置
这是实现基础活板门功能所需的JSON配置。包含所有朝向变体的旋转参数,确保能像原版活板门一样多方向放置。
BP/blocks/custom_trapdoor.json
json
{
"format_version": "1.21.70",
"minecraft:block": {
"description": {
"identifier": "wiki:custom_trapdoor",
"menu_category": {
"category": "construction",
"group": "minecraft:itemGroup.name.trapdoor"
},
"states": {
"wiki:open": [false, true]
},
"traits": {
"minecraft:placement_position": {
"enabled_states": ["minecraft:vertical_half"]
},
"minecraft:placement_direction": {
"enabled_states": ["minecraft:cardinal_direction"]
}
}
},
"components": {
"minecraft:custom_components": ["wiki:custom_trapdoor"],
"minecraft:collision_box": {
"origin": [-8, 0, -8],
"size": [16, 3, 16]
},
"tag:one_way_collidable": {}, // 与原版一致,防止玩家被活板门碰撞箱推出
"tag:trapdoors": {},
"minecraft:selection_box": {
"origin": [-8, 0, -8],
"size": [16, 3, 16]
},
"minecraft:geometry": "geometry.trapdoor",
"minecraft:material_instances": {
"*": {
"texture": "wiki:custom_trapdoor",
"render_method": "alpha_test_single_sided"
}
}
},
"permutations": [
// 顶部关闭状态
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'north' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [0, 0, 180] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'south' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [180, 0, 0] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'east' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [180, -270, 0] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'west' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [180, 270, 0] }
}
},
// 顶部开启状态
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [-270, 0, 0] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [270, 0, -180] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [0, 270, 90] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'top' && q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [180, -270, -270] }
}
},
// 底部关闭状态
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'north' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [0, 0, 0] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'south' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [0, 180, 0] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'east' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [0, 270, 0] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'west' && !q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [0, -270, 0] }
}
},
// 底部开启状态
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [90, 0, 180] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [270, 0, 0] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [0, -270, 90] }
}
},
{
"condition": "q.block_state('minecraft:vertical_half') == 'bottom' && q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('wiki:open')",
"components": {
"minecraft:transformation": { "rotation": [180, 270, -270] }
}
}
]
}
}自定义组件脚本
以下脚本将实现玩家交互开关活板门的功能。请记得将此脚本导入您的主脚本入口文件。
BP/scripts/custom_trapdoor.js
js
import { world } from "@minecraft/server";
/** @type {import("@minecraft/server").BlockCustomComponent} */
const BlockCustomTrapdoorComponent = {
onPlayerInteract({ block, dimension }) {
const isOpen = block.permutation.getState("wiki:open");
const sound = isOpen ? "close.wooden_trapdoor" : "open.wooden_trapdoor";
block.setPermutation(block.permutation.withState("wiki:open", !isOpen));
dimension.playSound(sound, block.center(), {
pitch: 0.9,
volume: 0.9,
});
},
};
world.beforeEvents.worldInitialize.subscribe(({ blockComponentRegistry }) => {
blockComponentRegistry.registerCustomComponent(
"wiki:custom_trapdoor",
BlockCustomTrapdoorComponent
);
});方块模型
这是自定义活板门使用的几何模型。
几何模型JSON
RP/models/blocks/trapdoor.geo.json
json
{
"format_version": "1.21.70",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.trapdoor",
"texture_width": 16,
"texture_height": 16
},
"bones": [
{
"name": "trapdoor",
"pivot": [0, 0, 0],
"cubes": [
{
"origin": [-8, 0, -8],
"size": [16, 3, 16],
"uv": {
"north": { "uv": [16, 3], "uv_size": [-16, -3] },
"east": { "uv": [16, 3], "uv_size": [-16, -3] },
"south": { "uv": [16, 3], "uv_size": [-16, -3] },
"west": { "uv": [16, 3], "uv_size": [-16, -3] },
"up": { "uv": [16, 16], "uv_size": [-16, -16] },
"down": { "uv": [0, 0], "uv_size": [16, 16] }
}
}
]
}
]
}
]
}TIP
原版活板门存在两个问题:特定面纹理方向异常,以及高度本应为3却设为2.95。本模板提供的方块配置和几何模型已修复这些问题。


