В настоящее время я программирую игру, которая включает в себя массивные настройки блока. Когда игрок движется, витражный путь будет проходить и следовать его пути и пройдет через 5 секунд.set Blocks Bukkit performance friendly
Я уже проверял, что только блоки установлены, если они не установлены, что только блоки проверяются, если игрок фактически меняет свое местоположение на другой блок.
Я также попытался сделать это с помощью sendBlockChange, но во-первых, это не помогает производительности, потому что sendBlockChange необходимо применять к каждому онлайн-плееру, а во-вторых, анти-чит-плагины сойдут с ума, и у меня нет время для программирования новой NCP.
Поэтому я размещаю здесь фактическую настройку блока во время moveEvent и хотел бы, чтобы здесь предлагалось сохранить производительность.
На данный момент серверу требуется около 5 ГБ оперативной памяти для 3-5 игроков.
Спасибо Ребята
public class MoveListener implements Listener {
@EventHandler
public void onMove(PlayerMoveEvent e) {
Location l = e.getTo();
if(Nyanfighters.getInstance().getSpawnpointsConfi().isSet("SpielSpawn.pos1.X"))
{
if(e.getFrom().getBlockY()<254&& YmlMethods.isInArea(e.getPlayer(),e.getPlayer().getLocation()) && !(e.getFrom().getBlockX() == e.getTo().getBlockX() && e.getFrom().getBlockY() == e.getTo().getBlockY() && e.getFrom().getBlockZ() == e.getTo().getBlockZ())){
if ((l.getYaw() <= -45 && l.getYaw() > -135.0) || (l.getYaw() <= 305 && l.getYaw() > 215)) {
setArea2(-1, 1, l, e.getPlayer(), e.getPlayer().isSneaking());
} else if ((l.getYaw() <= -305 || (l.getYaw() > -45 && l.getYaw() <= 0)) || ((l.getYaw() <= 45 && l.getYaw() >= 0) || l.getYaw() > 305)) {
setArea(1, 1, l, e.getPlayer(), e.getPlayer().isSneaking());
} else if ((l.getYaw() <= -215 && l.getYaw() > -305) || (l.getYaw() <= 135 && l.getYaw() > 45)) {
setArea2(-1, 1, l, e.getPlayer(), e.getPlayer().isSneaking());
} else {
setArea(-1, -1, l, e.getPlayer(), e.getPlayer().isSneaking());
}
}
}
}
private void setArea(int x, int z, Location start, Player p, boolean sneak) {
if (p.getLocation().getPitch()>75) {
setAir("start", 0, 0, start, 4);
setAir("left", x, 0, start, 14);
//setAir("lefttwice", x * 2, 0, start, 14);
setAir("right", -x, 0, start, 9);
//setAir("righttwice", (-x) * 2, 0, start, 9);
setAir("front", 0, z, start, 4);
setAir("back", 0, -z, start, 4);
setAir("leftfront", x, z, start, 14);
//setAir("lefttwicefront", x * 2, z, start, 14);
setAir("rightfront", -x, z, start, 9);
//setAir("righttwicefront", (-x) * 2, z, start, 9);
setAir("leftback", x, -z, start, 14);
//setAir("lefttwiceback", x * 2, -z, start, 14);
setAir("rightback", -x, -z, start, 9);
//setAir("righttwiceback", (-x) * 2, -z, start, 9);
} else {
setBlocks("start", 0, 0, start, 4);
setBlocks("left", x, 0, start, 14);
//setBlocks("lefttwice", x * 2, 0, start, 14);
setBlocks("right", -x, 0, start, 9);
//setBlocks("righttwice", (-x) * 2, 0, start, 9);
setBlocks("front", 0, z, start, 4);
setBlocks("back", 0, -z, start, 4);
setBlocks("leftfront", x, z, start, 14);
//setBlocks("lefttwicefront", x * 2, z, start, 14);
setBlocks("rightfront", -x, z, start, 9);
//setBlocks("righttwicefront", (-x) * 2, z, start, 9);
setBlocks("leftback", x, -z, start, 14);
//setBlocks("lefttwiceback", x * 2, -z, start, 14);
setBlocks("rightback", -x, -z, start, 9);
//setBlocks("righttwiceback", (-x) * 2, -z, start, 9);
}
}
private void setArea2(int x, int z, Location start, Player p, boolean sneak) {
if (p.getLocation().getPitch()>75) {
setAir("start", 0, 0, start, 4);
setAir("left", 0, x, start, 14);
//setAir("lefttwice", 0, x * 2, start, 14);
setAir("right", 0, -x, start, 9);
//setAir("righttwice", 0, (-x) * 2, start, 9);
setAir("front", z, 0, start, 4);
setAir("back", -z, 0, start, 4);
setAir("leftfront", z, x, start, 14);
//setAir("lefttwicefront", z, x * 2, start, 14);
setAir("rightfront", z, -x, start, 9);
//setAir("righttwicefront", z, (-x) * 2, start, 9);
setAir("leftback", -z, x, start, 14);
//setAir("lefttwiceback", -z, x * 2, start, 14);
setAir("rightback", -z, -x, start, 9);
//setAir("righttwiceback", -z, (-x) * 2, start, 9);
} else {
setBlocks("start", 0, 0, start, 4);
setBlocks("left", 0, x, start, 14);
//setBlocks("lefttwice", 0, x * 2, start, 14);
setBlocks("right", 0, -x, start, 9);
//setBlocks("righttwice", 0, (-x) * 2, start, 9);
setBlocks("front", z, 0, start, 4);
setBlocks("back", -z, 0, start, 4);
setBlocks("leftfront", z, x, start, 14);
//setBlocks("lefttwicefront", z, x * 2, start, 14);
setBlocks("rightfront", z, -x, start, 9);
//setBlocks("righttwicefront", z, (-x) * 2, start, 9);
setBlocks("leftback", -z, x, start, 14);
//setBlocks("lefttwiceback", -z, x * 2, start, 14);
setBlocks("rightback", -z, -x, start, 9);
//setBlocks("righttwiceback", -z, (-x) * 2, start, 9);
}
}
private void setBlocks(String s, int x, int z, Location start, int data) {
Location left = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 1, start.getBlockZ() + z);
//Location leftair = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY(), start.getBlockZ() + z);
/*if (leftair.getBlock().getType() == Material.AIR) {
for (Player p : Bukkit.getOnlinePlayers())
p.sendBlockChange(leftair, Material.AIR, (byte) id);
}
Location leftair2 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 1, start.getBlockZ() + z);
if (leftair2.getBlock().getType() == Material.AIR) {
for (Player p : Bukkit.getOnlinePlayers())
p.sendBlockChange(leftair2, Material.AIR, (byte) id);
}
Location leftair3 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 2, start.getBlockZ());
if (leftair3.getBlock().getType() == Material.AIR) {
for (Player p : Bukkit.getOnlinePlayers())
p.sendBlockChange(leftair3, Material.AIR, (byte) id);
}*/
Material block = left.getBlock().getType();
if (block == Material.AIR) {
left.getBlock().setType(Material.STAINED_GLASS);
BlockState bs= left.getBlock().getState();
bs.setRawData((byte)data);
bs.update();
removeBlock(left);
}
}
private void setAir(String s, int x, int z, Location start, int data) {
Location left = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 1, start.getBlockZ() + z);
if (left.getBlock().getType() == Material.STAINED_GLASS)
left.getBlock().setType(Material.AIR);
/*Location leftair = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY(), start.getBlockZ() + z);
if (leftair.getBlock().getType() == Material.AIR) {
for (Player p : Bukkit.getOnlinePlayers())
p.sendBlockChange(leftair, Material.AIR, (byte) id);
}
Location leftair2 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 1, start.getBlockZ() + z);
if (leftair2.getBlock().getType() == Material.AIR) {
for (Player p : Bukkit.getOnlinePlayers())
p.sendBlockChange(leftair2, Material.AIR, (byte) id);
}
Location leftair3 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 2, start.getBlockZ());
if (leftair3.getBlock().getType() == Material.AIR) {
for (Player p : Bukkit.getOnlinePlayers())
p.sendBlockChange(leftair3, Material.AIR, (byte) id);
}*/
Location right = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 3, start.getBlockZ() + z);
Material block = right.getBlock().getType();
if (block == Material.AIR) {
right.getBlock().setType(Material.STAINED_GLASS);
BlockState bs= right.getBlock().getState();
bs.setRawData((byte)data);
bs.update();
removeBlock(right);
}
}
private void removeBlock(Location remove) {
Bukkit.getScheduler().scheduleSyncDelayedTask(Nyanfighters.getInstance(),() -> remove.getBlock().setType(Material.AIR), 20 * 5);
}
}
Примечание: Есть некоторые кодовые скобки как комментарии отмечены. все это расширения, которые являются целью, но уже не используются для снижения производительности.
Я не верю, что вы должны использовать YML для этого, очень медленно открывать и закрывать файлы столько раз – Kerooker
Спасибо, я буду использовать yml для него, но сохраню все необходимые мне данные. Включите метод, не на каждом шагу. Спасибо, это определенно поможет – Scorix
Не могли бы вы рассказать о том, что именно вы пытаетесь достичь? Это немного непонятно: «Когда игрок движется, витражный путь будет вести и следовать за ним и пройдет через 5 секунд». И, похоже, у вас много несвязанного кода, если это все, что вы хотите сделать. – kmecpp