개인 자료란 (JE)

  서버 커뮤니티

Profile 망망대해 일반인

Leeke_ 4c24772864594b42932ce49715f62f76

Profile

이해도 초보자 
게임버전 (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 파티여서 어디를 수정하면 될지 감이 안잡힙니다. (메인클래스에는 잘 적어놨습니다. 구조물 생성은 되는데 방향이 안바뀌는 겁니다.) 어디를 수정해야 되는지 알려주실 수 있나요?..




2개의 댓글

노을넴
2024.08.11

https://www.koreaminecraft.net/review/3669278. 구조물은 구조물 블록을 사용해서 파일로 저장한 후, 해당 구조물을 불러와서 배치하는 것을 권장하는 것이에욘. 저렇게 작성하면 오버헤드일 뿐더러, 성능에도 별로 좋지 않은 것이에욘. 구조물 파일은 플러그인 리소스 내에 데이터 팩 형식으로 저장해두면 될 것 같네욘. 소스 파일이 긴 경우에는 파일로 첨부하세욘

망망대해
2024.08.11
@노을넴

알려주셔서 감사합니다!