阻止方块放置
本教程分为两个部分:稳定版方法和测试版方法。您可以根据所使用的Script API版本选择对应章节。
WARNING
Script API目前处于活跃开发阶段,经常会有破坏性更新。本文内容基于Minecraft 1.21.20版本格式编写。
是否需要阻止特定方块的放置?在1.20.10版本中,某些危险的不可获取方块可能被玩家获得,这个脚本可以帮助您保护世界或服务器的安全!
准备工作
TIP
在创建脚本前,建议先掌握JavaScript基础知识、附加包和Script API相关内容。要了解Script API的功能,请参阅微软官方文档。
与其他脚本相同,您需要在manifest.json中添加依赖项。我们将使用@minecraft/server模块,具体版本为1.14.0-beta。
{
"format_version": 2,
"header": {
"name": "阻止方块放置",
"description": "使用Script API阻止特定方块放置",
"uuid": "6f3a4325-4ce5-42f5-b141-12641c8823c3",
"min_engine_version": [1, 20, 10],
"version": [1, 0, 0]
},
"modules": [
{
"description": "行为包模块",
"type": "data",
"uuid": "5a080d1d-bef8-47ce-aae1-a2ec3e0010ab",
"version": [1, 0, 0]
},
{
"description": "游戏测试模块",
"type": "script",
"language": "javascript",
"entry": "scripts/main.js",
"uuid": "53a5804b-fb35-4f7d-a89e-e4a925fadb77",
"version": [1, 0, 0]
}
],
"dependencies": [
{
// Minecraft原生模块 - 使用"@minecraft/server"模块必需
"module_name": "@minecraft/server",
"version": "1.14.0-beta"
}
]
}在清单文件中,我们添加了脚本模块。entry字段指定了脚本文件的存储位置(位于行为包的scripts文件夹内)。依赖项配置允许我们在代码中使用所需的脚本模块。
- 📝manifest.json
- 🖼️pack_icon.png
- 📝main.js
第一种阻止方案(稳定版)
即使您打算阻止其他方块,如果是首次创建此类脚本,请严格遵循本教程操作。确认脚本运行无误后,再修改目标方块。
这是因为方块的内部标识符可能与您的认知不同。例如,发光物品框的内部名称是minecraft:glow_frame。
首先添加代码中需要使用的模块导入:
import { world, system } from "@minecraft/server";TIP
关于system的更多信息,请参阅系统事件。
导入模块后,我们将添加方块放置的阻止逻辑:
world.beforeEvents.playerPlaceBlock.subscribe((event) => {
const player = event.source;
if (event.permutationBeingPlaced.type.id === "minecraft:bedrock") {
event.cancel = true;
system.run(() => {
player.sendMessage("禁止放置基岩");
});
}
});这是执行代码的主函数。world.beforeEvents.playerPlaceBlock.subscribe()会在任何方块放置前触发。
const player = event.source;将变量player定义为事件源(放置方块的玩家)。使用const而非var或let表示该引用不可更改。if()语句需要条件判断为真时才会执行括号内的代码:event.permutationBeingPlaced.type.id === 'minecraft:bedrock'验证被放置的方块是否为基岩event.block.typeId != "minecraft:frame" && event.block.typeId != "minecraft:glow_frame"检查目标方块不是物品框,确保被阻止的方块仍可放入物品框中
event.cancel = true;取消该事件原本要执行的放置动作system.run()是系统调用,指示Minecraft将代码执行推迟到下一个游戏刻。由于前置事件不能修改世界状态(本例中需要向玩家发送消息),使用系统调用可以突破这个限制。更多关于系统回调与循环的信息请参阅此处。player.sendMessage()向玩家发送提示信息
结语(稳定版)
您可以根据需要修改禁止放置基岩这条提示信息,或替换为其他逻辑。
也可以更改event.permutationBeingPlaced.type.id === 'minecraft:bedrock'中的方块类型ID,将命名空间和标识符替换为其他方块。

