- Баллы
- 61
Всем привет. Мне нужно вставлять схематик перед лицом игрока. Но так как схематик сохраняется относительно позиции игрока, мне нужно как-то избавиться от этого, чтобы вставлять схематик без этой относительности всегда туда, куда нужно.
К слову, схематик я сохранил, стоя передом к лицевой части постройки, посередине.
Если я убираю строчку "clipboard.setOrigin(BlockVector3.at(dx, dy, dz));", тогда схематик спавнится, но опять же так, как я его сохранял, а не перед лицом.
А если я оставляю эту строчку, схематик вообще рядом не появляется (скорее всего, где-то вне поле моего зрения).
Также пробовал убирать эту строчку и создавать BlockVector3.at(dx, dy, dz) в аргументе функции to() билдера PasteBuilder, но это так же не привело к успеху
К слову, схематик я сохранил, стоя передом к лицевой части постройки, посередине.
Код:
@EventHandler
public void onInteract(BlockPlaceEvent event) throws IOException {
if (event.getBlockPlaced().getType() == Material.DIAMOND_BLOCK) {
Player player = event.getPlayer();
event.getBlockPlaced().setType(Material.AIR);
File schematicFile = new File("/home/house.schem");
Location location = calculateLocation(player);
paste(location, schematicFile);
}
}
private Location calculateLocation(Player player) {
org.bukkit.World world = player.getWorld();
Location playerLocation = player.getLocation();
double x = playerLocation.getX();
double y = playerLocation.getY();
double z = playerLocation.getZ();
float yaw = playerLocation.getYaw();
float pitch = playerLocation.getPitch();
// рассчитываем новую координату Х, находясь на той же плоскости
x = x + (4 * Math.cos(Math.toRadians(-yaw - 90)) * Math.cos(Math.toRadians(-pitch)));
// рассчитываем новую координату Y
//y = y + (4 * Math.sin(Math.toRadians(-pitch)));
// рассчитываем новую координату Z, находясь на той же плоскости
z = z + (4 * Math.sin(Math.toRadians(-yaw - 90)) * Math.cos(Math.toRadians(-pitch)));
// изменяем направление игрока, чтобы он смотрел назад
yaw = yaw + 180;
return new Location(world, x, y, z, yaw, pitch);
}
public void paste(Location location, File file) {
ClipboardFormat clipboardFormat = ClipboardFormats.findByFile(file);
Clipboard clipboard;
BlockVector3 blockVector3 = BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ());
if (clipboardFormat != null) {
try (ClipboardReader clipboardReader = clipboardFormat.getReader(new FileInputStream(file))) {
if (location.getWorld() == null)
throw new NullPointerException("Failed to paste schematic due to world being null");
World world = BukkitAdapter.adapt(location.getWorld());
EditSession editSession = WorldEdit.getInstance().newEditSessionBuilder().world(world).build();
clipboard = clipboardReader.read();
BlockVector3 originVector = clipboard.getOrigin();
int dx = location.getBlockX() - originVector.getBlockX();
int dy = location.getBlockY() - originVector.getBlockY();
int dz = location.getBlockZ() - originVector.getBlockZ();
clipboard.setOrigin(BlockVector3.at(dx, dy, dz));
Operation operation = new ClipboardHolder(clipboard)
.createPaste(editSession)
.to(blockVector3)
.ignoreAirBlocks(true)
.build();
try {
Operations.complete(operation);
editSession.close();
} catch (WorldEditException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
А если я оставляю эту строчку, схематик вообще рядом не появляется (скорее всего, где-то вне поле моего зрения).
Также пробовал убирать эту строчку и создавать BlockVector3.at(dx, dy, dz) в аргументе функции to() билдера PasteBuilder, но это так же не привело к успеху
Последнее редактирование: