替换块中的每个块会使服务器崩溃
Replacing every block in a chunk crashes server
我正在逐块替换块。每次加载一个块时,我都会用一个随机的其他块替换生成块。所以这是我的代码
package de.belinked.chunkrandomizer;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class ChunkRandomizer extends JavaPlugin implements Listener {
public List<Material> blocks = Arrays.asList(
Material.ACACIA_LEAVES,
Material.ACACIA_LOG,
// I'll leave this out, just every full, solid block
Material.YELLOW_STAINED_GLASS,
Material.YELLOW_TERRACOTTA,
Material.YELLOW_WOOL
);
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
Bukkit.broadcastMessage(this.prefix + "Der Chunk-Randomizer wurde erfolgreich geladen");
}
@Override
public void onDisable() {
}
public Material getRandomMaterial(List l) {
int rnd = ThreadLocalRandom.current().nextInt(l.size());
Material m = (Material) l.get(rnd);
return m;
}
@EventHandler
public void onChunkLoad(ChunkLoadEvent e) {
if(e.isNewChunk()) {
Chunk chunk = e.getChunk();
Block b;
Material m = getRandomMaterial(this.blocks);
for(int y = -64; y <= 320; y++) {
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
b = chunk.getBlock(x, y, z);
if(!b.getType().isAir()
&& b.getType() != Material.BEDROCK
&& b.getType() != Material.WATER
&& b.getType() != Material.LAVA
&& b.getType() != Material.END_PORTAL_FRAME
&& b.getType() != Material.END_PORTAL) {
b.setType(m);
}
}
}
}
}
}
}
但是当我加入服务器并加载几个块时,我得到了这个日志:
谁能帮我解决这个问题?
编辑:现在我被踢了,有一段时间没有任何反应,然后我得到这个日志,对于控制台来说甚至太长了:https://pastebin.com/8eZ4Ja4m
在错误中,第 77 行,它说:
Cannot get data for not block BRICK
我认为问题出在您的列表中blocks
。
在某处,肯定有一个Material.BRICK
,但实际上,我认为material应该是Material.BRICKS
,Bricks是整个方块,而Brick是煮熟的粘土物品来制作砖块。
您应该检查您的 plugin.yml 中是否有 api-version: 1.13
。
这是因为一些映射名称发生了变化,如果没有这个选项,它们将无法被 spigot 很好地检测到。
我正在逐块替换块。每次加载一个块时,我都会用一个随机的其他块替换生成块。所以这是我的代码
package de.belinked.chunkrandomizer;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class ChunkRandomizer extends JavaPlugin implements Listener {
public List<Material> blocks = Arrays.asList(
Material.ACACIA_LEAVES,
Material.ACACIA_LOG,
// I'll leave this out, just every full, solid block
Material.YELLOW_STAINED_GLASS,
Material.YELLOW_TERRACOTTA,
Material.YELLOW_WOOL
);
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
Bukkit.broadcastMessage(this.prefix + "Der Chunk-Randomizer wurde erfolgreich geladen");
}
@Override
public void onDisable() {
}
public Material getRandomMaterial(List l) {
int rnd = ThreadLocalRandom.current().nextInt(l.size());
Material m = (Material) l.get(rnd);
return m;
}
@EventHandler
public void onChunkLoad(ChunkLoadEvent e) {
if(e.isNewChunk()) {
Chunk chunk = e.getChunk();
Block b;
Material m = getRandomMaterial(this.blocks);
for(int y = -64; y <= 320; y++) {
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
b = chunk.getBlock(x, y, z);
if(!b.getType().isAir()
&& b.getType() != Material.BEDROCK
&& b.getType() != Material.WATER
&& b.getType() != Material.LAVA
&& b.getType() != Material.END_PORTAL_FRAME
&& b.getType() != Material.END_PORTAL) {
b.setType(m);
}
}
}
}
}
}
}
但是当我加入服务器并加载几个块时,我得到了这个日志:
谁能帮我解决这个问题?
编辑:现在我被踢了,有一段时间没有任何反应,然后我得到这个日志,对于控制台来说甚至太长了:https://pastebin.com/8eZ4Ja4m
在错误中,第 77 行,它说:
Cannot get data for not block BRICK
我认为问题出在您的列表中blocks
。
在某处,肯定有一个Material.BRICK
,但实际上,我认为material应该是Material.BRICKS
,Bricks是整个方块,而Brick是煮熟的粘土物品来制作砖块。
您应该检查您的 plugin.yml 中是否有 api-version: 1.13
。
这是因为一些映射名称发生了变化,如果没有这个选项,它们将无法被 spigot 很好地检测到。