망망대해
일반인
Leeke_ 4c24772864594b42932ce49715f62f76
이해도 | 초보자 |
---|---|
게임버전 (JE) | 관련없음 |
게임버전 (BE) | 관련없음 |
아래는 서버 로그입니다!
서버 로그.txt
br
일단 제 코드를 보여드리겠습니다.
package org.example.code.rpg.Event; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.Directional; import org.bukkit.block.BlockFace; public class StructureBuilding { private final Material[][][] structure = { { // 1층 {Material.STONE_BRICK_SLAB, Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICK_SLAB, Material.STONE_BRICK_SLAB, Material.STONE_BRICK_SLAB}, {Material.STONE_BRICK_WALL, Material.AIR, Material.AIR, Material.AIR, Material.STONE_BRICK_WALL}, {Material.MOSSY_STONE_BRICK_WALL, Material.AIR, Material.AIR, Material.AIR, Material.STONE_BRICK_WALL}, {Material.MOSSY_STONE_BRICK_WALL, Material.END_ROD, Material.AIR, Material.END_ROD, Material.MOSSY_STONE_BRICK_WALL}, {Material.END_ROD, Material.AIR, Material.AIR, Material.AIR, Material.END_ROD}, }, { // 2층 {Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICKS, Material.STONE_BRICKS, Material.STONE_BRICKS, Material.MOSSY_STONE_BRICK_SLAB}, {Material.AIR, Material.STONE_BRICKS, Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICKS, Material.AIR}, {Material.AIR, Material.END_ROD, Material.AIR, Material.END_ROD, Material.AIR}, {Material.END_ROD, Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICK_SLAB, Material.END_ROD}, {Material.AIR, Material.AIR, Material.STONE_BRICK_SLAB, Material.AIR, Material.AIR} }, { // 3층 {Material.MOSSY_STONE_BRICK_SLAB, Material.STONE_BRICKS, Material.STONE_BRICKS, Material.MOSSY_STONE_BRICKS, Material.STONE_BRICK_SLAB}, {Material.AIR, Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICK_WALL, Material.STONE_BRICK_SLAB, Material.AIR}, {Material.AIR, Material.AIR, Material.BEACON, Material.AIR, Material.AIR}, {Material.AIR, Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICK_WALL, Material.STONE_BRICK_SLAB, Material.AIR}, {Material.AIR, Material.MOSSY_STONE_BRICK_SLAB, Material.CHISELED_STONE_BRICKS, Material.STONE_BRICK_SLAB, Material.AIR}, {Material.AIR, Material.AIR, Material.END_ROD, Material.AIR, Material.AIR} }, { // 4층 {Material.STONE_BRICK_SLAB, Material.STONE_BRICKS, Material.MOSSY_STONE_BRICKS, Material.STONE_BRICKS, Material.STONE_BRICK_SLAB}, {Material.AIR, Material.MOSSY_STONE_BRICKS, Material.STONE_BRICK_SLAB, Material.STONE_BRICKS, Material.AIR}, {Material.AIR, Material.END_ROD, Material.AIR, Material.END_ROD, Material.AIR}, {Material.END_ROD, Material.MOSSY_STONE_BRICK_SLAB, Material.STONE_BRICK_SLAB, Material.STONE_BRICK_SLAB, Material.END_ROD}, {Material.AIR, Material.AIR, Material.MOSSY_STONE_BRICK_SLAB, Material.AIR, Material.AIR} }, { // 5층 {Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICK_SLAB, Material.STONE_BRICK_SLAB, Material.STONE_BRICK_SLAB, Material.MOSSY_STONE_BRICK_SLAB}, {Material.STONE_BRICK_WALL, Material.AIR, Material.AIR, Material.AIR, Material.MOSSY_STONE_BRICK_WALL}, {Material.MOSSY_STONE_BRICK_WALL, Material.AIR, Material.AIR, Material.AIR, Material.STONE_BRICK_WALL}, {Material.STONE_BRICK_WALL, Material.END_ROD, Material.AIR, Material.END_ROD, Material.STONE_BRICK_WALL}, {Material.END_ROD, Material.AIR, Material.AIR, Material.AIR, Material.END_ROD} } }; // 반블럭 유형 및 기타 블록 데이터를 지정하는 메타데이터 배열 private final String[][][] metadata = { // 1층 { {"bottom", "bottom", "bottom", "bottom", "bottom"}, {null, null, null, null, null}, {null, null, null, null, null}, {null, "east", null, "west", null}, {"up", null, null, null, "up"} }, // 2층 { {"bottom", null, null, null, "bottom"}, {null, null, "bottom", null, null}, {null, "up", null, "up", null}, {"south", "top", "bottom", "top", "south"}, {null, null, "bottom", null, null} }, // 3층 { {"bottom", null, null, null, "bottom"}, {null, "bottom", null, "bottom", null}, {null, null, null, null, null}, {null, "bottom", null, "bottom", null}, {null, "bottom", null, "bottom", null}, {null, null, "up", null, null} }, // 4층 { {"bottom", null, null, null, "bottom"}, {null, null, "bottom", null, null}, {null, "up", null, "up", null}, {"north", "top", "bottom", "top", "north"}, {null, null, "bottom", null, null} }, // 5층 { {"bottom", "bottom", "bottom", "bottom", "bottom"}, {null, null, null, null, null}, {null, null, null, null, null}, {null, "east", null, "west", null}, {"up", null, null, null, "up"} } }; public void generate(World world, int x, int y, int z) { for (int i = 0; i < structure.length; i++) { for (int j = 0; j < structure[i].length; j++) { for (int k = 0; k < structure[i][j].length; k++) { Block block = world.getBlockAt(x + i, y + j, z + k); Material material = structure[i][j][k]; block.setType(material); String data = metadata[i][j][k]; // 메타데이터를 기반으로 블록 방향 조정 if ((material == Material.STONE_BRICK_SLAB || material == Material.MOSSY_STONE_BRICK_SLAB) && data != null) { Slab slab = (Slab) block.getBlockData(); if ("top".equals(data)) { slab.setType(Slab.Type.TOP); } else if("bottom".equals(data)) { slab.setType(Slab.Type.BOTTOM); } block.setBlockData(slab); } else if (material == Material.END_ROD && data != null) { Directional directional = (Directional) block.getBlockData(); switch (data) { case "up": directional.setFacing(BlockFace.UP); break; case "down": directional.setFacing(BlockFace.DOWN); break; case "north": directional.setFacing(BlockFace.NORTH); break; case "south": directional.setFacing(BlockFace.SOUTH); break; case "east": directional.setFacing(BlockFace.EAST); break; case "west": directional.setFacing(BlockFace.WEST); break; } block.setBlockData(directional); } } } } } }
package org.example.code.rpg.Event; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; import org.bukkit.event.world.WorldLoadEvent; import java.util.Random; import static org.bukkit.Bukkit.getLogger; import static org.bukkit.Bukkit.getWorld; public class WorldInitListener implements Listener { @EventHandler public void createTemple(WorldInitEvent event) { Bukkit.getLogger().info("World가 새로 생성되었습니다."); } @EventHandler public void onWorldLoad(WorldLoadEvent event) { String worldName = event.getWorld().getName(); Bukkit.getLogger().info("월드가 로드되었습니다: " + worldName); World world = getWorld(worldName); assert world != null; Location location = world.getSpawnLocation(); double x = location.getX(); double z = location.getZ(); double a = Math.random(); double b = Math.random(); a *= 3000; b *= 3000; double c = Math.random(); c *= 4; c = (int)c; if(c % 4 == 0) { x += a; z += b; } else if(c % 4 == 1) { x -= a; z -= b; } else if(c % 4 == 2) { x += a; z -= b; } else if(c % 4 == 3) { x -= a; z += b; } String posX = String.valueOf(x); Bukkit.getLogger().info(posX); String posZ = String.valueOf(z); Bukkit.getLogger().info(posZ); int intX = (int) x; int intZ = (int) z; // y좌표 61~75 랜덤 Random random = new Random(); int intY = 61 + random.nextInt(75 - 61 + 1); StructureBuilding building = new StructureBuilding(); building.generate(world, intX, intY, intZ); } }
일단 문제가 뭐냐면, 제가 미리 건축해놓은 걸 보고서 그대로 array에 옮겼습니다.
그런데 그 과정에서 반블록과 엔드막대기를 사용한 탓에 원래 위로 올라가야 하는 반블록이 아래에 있고.. 뭐 그런 상황입니다.
방향 다른거 말이에요.
그래서 설정을 좀 해주려고 하는데 제가 블록 방향 조절은 처음이라 gpt한테 좀 맡기고 제가 수정할 부분은 수정했습니다.
다 수정하고 난 뒤, 실행해보니까 null 파티여서 어디를 수정하면 될지 감이 안잡힙니다. (메인클래스에는 잘 적어놨습니다. 구조물 생성은 되는데 방향이 안바뀌는 겁니다.) 어디를 수정해야 되는지 알려주실 수 있나요?..
노을넴
2024.08.11https://www.koreaminecraft.net/review/3669278. 구조물은 구조물 블록을 사용해서 파일로 저장한 후, 해당 구조물을 불러와서 배치하는 것을 권장하는 것이에욘. 저렇게 작성하면 오버헤드일 뿐더러, 성능에도 별로 좋지 않은 것이에욘. 구조물 파일은 플러그인 리소스 내에 데이터 팩 형식으로 저장해두면 될 것 같네욘. 소스 파일이 긴 경우에는 파일로 첨부하세욘
망망대해
2024.08.11알려주셔서 감사합니다!