效果:
代码:(显然放在server_scripts)
onEvent("entity.spawned", (event) => {
if (event.entity.type == 'minecraft:lightning_bolt')
{
let x = parseInt(event.entity.x)
let y = parseInt(event.entity.y)
let z = parseInt(event.entity.z)
event.server.getEntities("@e[type=minecraft:item]").forEach(entity => {
if (entity.item == "minecraft:sand" &&
parseInt(entity.x) == x && parseInt(entity.y) == y &&
parseInt(entity.z) == z)
event.server.runCommandSilent(`summon minecraft:item ${event.entity.x} ${event.entity.y} ${event.entity.z}
{Item:{id:"minecraft:glass",Count:1},Invulnerable:true}`)
})
}
})
代码原理:
检测闪电实体生成,获取其位置;
检测服务器内的所有实体,如果在闪电实体位置有沙子掉落物实体;
在闪电实体位置处用指令生成玻璃掉落物实体,并设置 Invulnerable:true 使其不被闪电引燃的火烧毁;
存在的问题:
其一,函数 forEach(entity => {} 内的 runCommandSilent() 指令执行函数会被运行三遍
(仅有一个沙子被雷击,会生成三个玻璃),原因猜测:
游戏的最小时间单位是tick,游戏内任何变化都以 1tick 为最小单位;而事件,检测实体并执行指令是每 1ms 执行一次
1tick = 3ms,因此事件执行了三次;
其二,丢在一起的掉落物实体会堆叠到一起,函数 getEntities().size() 判断的结果是沙子实体仅一个;
所以这种闪电合成的方法,一次只能一个物品参与合成,多的物品只能被闪电留下的火烧掉;