• 【MineBBS社区发展意见征集】

    欢迎参与MineBBS社区调查,助力打造更好Minecraft社区!完成问卷可获赠200金粒,优质回答可额外获得200金粒(限5名),快来参与吧!【点击参与】

教程 [BDS][Script APIs]官方脚本教程:世界事件监听

本文简单撰写一个监听类脚本
准备工作:自行下载搭建拥有实验性玩法全开的原生bds服务端
1.创建行为包:
该部分不多说,可自行参考相关教程,如: https://www.minebbs.com/bds-script-api.t27171/
2.翻阅官方脚本文档:
脚本运行的入口一般从system和world两个类开始。
官方脚本文档:https://learn.microsoft.com/zh-cn/m...ver/world?view=minecraft-bedrock-experimental
首先,我们在脚本中引入world和system类
JavaScript:
import { world, system} from "@minecraft/server";
打开我们的文档,看到world里有许多方法,如下图
1719744761895.png
以及很多属性,如下图
1719744830157.png
本文我们重点关注afterEvent和beforeEvent。
顾名思义,事件前中的事件可被拦截,但可监听事件少,事件后的中的事件不可被拦截,但可监听事件多,我们点击PlayerBreakBlockBeforeEventSignal,可以看到详细可监听事件列表:
1719745014879.png
在事件前列表中,我们找到playerBreakBlock事件,该事件可监听玩家破坏方块。
点击Type旁的PlayerBreakBlockEvent,可以看到该事件有两个属性,一个订阅,一个取消订阅。
订阅后,会返回该事件的对象,这是我们需要的
1719745130048.png
点击该对象查看有哪些方法和属性
1719745194860.png
我们可以看到该对象有cancel属性,itemStack属性以及player属性,我们可以通过将该对象的cancel属性变为true,此时能将该事件拦截
同时我们还可以进一步获取事件中玩家的信息和玩家手持物品的信息。
但是,貌似我们无法获得被破坏方块的信息?
当然可以获得,在该页面中有个Extends,下面有BlcokEvent,也就是说,玩家破坏方块事件前事件属于方块事件的一部分,我们仍然可以通过该对象访问方块事件的属性和方法,我们点开BlockEvent的链接,看到方块中有许多属性和方法,这里不一一解释。

那么我们了解了事件后,尝试在控制台输出我们的信息该怎么做呢
JavaScript:
import { world, system} from "@minecraft/server";
world.beforeEvents.playerBreakBlock.subscribe((event) => {
    let player = event.player;
    let block = event.block;
    let player_position = `(${player.location.x}, ${player.location.y}, ${player.location.z})`; //所有的位置都是一个三维的对象:{x: Num, y: Num, z: Num}
    let block_position = `(${block.location.x}, ${block.location.y}, ${block.location.z})`;
    let block_name = block.typeId;
    console.log(`玩家 ${player.name} 在位置 ${player_position} 破坏了方位于 ${block_position}的${block_name} 方块`);
})
由此我们可以向控制台输出玩家破坏方块的部分信息。
我们启动服务器,这里注意,请使用bat进行启动,否则会出现中文乱码
在根目录新建Start.bat,写入
CHCP 65001
cd /d %~dp0
bedrock_server.exe
pause
即可,双击Start.bat
1719745968218.png
我们可以看到后台详细输出了破坏方块事件的信息。
接下来,我们更进一步实现拦截破坏方块,并且向玩家发送消息
我们稍稍修改代码
JavaScript:
import { world, system} from "@minecraft/server";
world.beforeEvents.playerBreakBlock.subscribe((event) => {
    let player = event.player;
    let block = event.block;
    let player_position = `(${player.location.x}, ${player.location.y}, ${player.location.z})`; //所有的位置都是一个三维的对象:{x: Num, y: Num, z: Num}
    let block_position = `(${block.location.x}, ${block.location.y}, ${block.location.z})`;
    let block_name = block.typeId;
    console.log(`玩家 ${player.name} 在位置 ${player_position} 破坏了方位于 ${block_position}的${block_name} 方块`);

    event.cancel = true;//拦截该事件
    player.sendMessage("你不能破坏方块!")
    world.sendMessage(`玩家 ${player.name} 试图破坏方块 ${block_name} 在位置 ${block_position}!`)
})
更新脚本后,我们无需重启服务器,只需要在后台输入reload即可热重载我们撰写的新脚本
1719746163284.png
显示上面的消息表明脚本已成功重载,此时我们再尝试破坏一个方块
1719746209009.png
我们可以看到破坏的方块复原了!并且在世界中给所有玩家发送了消息,且给该玩家进行了消息警告。
由此我们可以根据文档监听和拦截许多事件来完成一系列的功能,包括领地插件等,这里就不一一列举,大家可自行参考官方文档来实现更多有趣的功能。
如果有需要读写文件,可以参考该篇教程https://www.minebbs.com/bds-script-api.t27171/
有什么问题可以在评论区讨论
本文的服务端环境以及脚本下载:https://gitee.com/blockartheart/test/releases/download/1.0.1/bedrock-server.zip
下载解压后双击Start.bat使用
 
当然可以呐,脚本可以直接获取玩家的标签,记分板,或者你可以为玩家添加额外的动态属性,条件判断后是否可以拦截该事件。
例如在本例中,可以if(event.player.hasTag("no_break")){event.cancel = true}就可以实现拥有“no_break”标签的玩家禁止破坏方块
 

在线会员

  • nonvioce
  • kygomc
  • 魑魅 魍魉
  • cxh123
  • mc506lw
  • 繁雨
  • 承影
  • 炎之火风
  • 云淡风轻.
  • 索普
  • 爱无差异
  • apfsds
  • 名の知れない人
  • 爱鹿关的黑酒一个温馨的rpg服务器
  • panqiukuigege
  • xhz666
  • 不要i我
后退
顶部 底部