【问题标题】:Creating lighting within Minecraft from the server?从服务器在 Minecraft 中创建照明?
【发布时间】:2014-04-13 19:45:34
【问题描述】:

我正在创建一个 bukkit 插件,它需要添加照明,我希望能够仅在服务器端完成此操作,这样用户就不需要特殊的插件来查看照明。这可以做到吗?如果我没记错渲染光照之前一直在服务器端?我还希望这种照明是彩色的,并且光源是不可见的(坐标照明是可以接受的,因为将设置地图)

我的恐惧,可以做到吗?

【问题讨论】:

  • 你可以使用萤石,然后向玩家发送方块更新,使其不可见......如果玩家走进它会出现故障,这会不会有问题? (我所说的小故障是指进入半个街区然后传送回来,所以是一种生涩的运动)
  • @jojodmo 我对此没意见,有什么线索可以告诉我该怎么做吗?并且猜想添加彩色光没有太多选择?
  • @TonyBibly 你总是可以只用树叶,在树叶下面放萤石,或者在萤石上面铺地毯,这样看起来好像没有,但实际上真的有......
  • @jojodmo 我不能这样做,因为我希望能够在没有任何可见方块的情况下从上方照亮建筑物和地方,或者改变方块来发光?

标签: lighting bukkit


【解决方案1】:

你可以这样做:

p.sendBlockChange(Location, Material, Byte);
  • Lo​​cation 是方块的位置
  • 材质是您希望玩家看到的材质
  • 字节是数据,所以在块43:8,你可以使用8。如果没有,只需使用 0。

因此,您可以这样做以将块更新发送给所有玩家:

Location[] invisibleBlocks; //all Invisible locations    

for(Player p : Bukkit.getOnlinePlayers()){ //get all online players
  for(Location l : invisibleBlocks){ //get all invisible blocks
    p.sendBlockChange(l, Material.AIR, 0); //send block change of AIR to the player
  }
}

唯一的问题是,当玩家卸载/加载更改所在的区块时,块更改会被重置。因此,要解决此问题,您可以安排一个计时器:

Location[] invisibleBlocks; //set this to the locations of all of the blocks you want to make invisible

plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){
  public void run(){
    for(Player p : Bukkit.getOnlinePlayers()){ //get all online players
      for(Location l : invisibleBlocks){ //get all invisible blocks
        p.sendBlockChange(l, Material.AIR, 0); //send block change of AIR to the player
      }
    }
  }
},100);//delay time is 5 seconds (5 seconds * 20 ticks per second)

然后您需要做的就是将萤石放在invisibleBlocks 位置,它会显示为空气,但(应该)仍会发光。

这样做的一个问题是,如果玩家试图走进街区,他们会走到一半,然后被传送回来。这是因为客户端认为那里没有方块,但服务器知道有,当玩家走进方块时,服务器会将他们传送回来,做出一种生涩的动作。

如果你把它放在玩家无法进入的地方,你应该很好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2014-02-04
    • 2021-04-28
    • 2019-07-19
    相关资源
    最近更新 更多