效果:

世界合成【闪电合成】-第1张图片

世界合成【闪电合成】-第2张图片

世界合成【闪电合成】-第3张图片


代码:(显然放在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() 判断的结果是沙子实体仅一个;

所以这种闪电合成的方法,一次只能一个物品参与合成,多的物品只能被闪电留下的火烧掉;