연습장

마인크래프트 플러그인 개발해보기 [12] - 광물 알람 플러그인 만들기 (3)

조강철10 2023. 8. 4. 23:55
반응형

https://gangchul.tistory.com/299

 

마인크래프트 플러그인 개발해보기 [11] - 광물 알람 플러그인 만들기 (2)

마인크래프트 플러그인 개발해보기 [10] - 광물 알람 플러그인 만들기 (2) https://gangchul.tistory.com/298 마인크래프트 플러그인 개발해보기 [10] - 광물 알람 플러그인 만들기 (1) 마인크래프트 플러그인

gangchul.tistory.com

 

전편에서 이어집니다.

 

지금까지 개발한 내용을 다시 정리해보면, 철, 석탄 , 다이아몬드 등의 광물을 부술 때 마다 

서버 전체에 광석을 발견하였다는 메시지를 출력하도록 만들었습니다.

 

그러나 문제가 있는데, 광물 1개를 부술 때 마다 계속해서 메시지가 나오기 때문에

채팅창이 도배가 될 수 있다는 점입니다.

 

이번에는 이 문제를 해결해보도록 하겠습니다.

 

 

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Alarm implements Listener {

    ArrayList<List> loc = new ArrayList<>();

    @EventHandler
    public void onBreak(BlockBreakEvent e){
        String player = e.getPlayer().getName();
        Material block = e.getBlock().getType();
        if (block==Material.DIAMOND_ORE || block == Material.DEEPSLATE_DIAMOND_ORE) {
            int x = e.getBlock().getX();
            int y = e.getBlock().getY();
            int z = e.getBlock().getZ();
            int count = 0;
            for(int i=x-3; i<=x+6; i++) {
                for (int k = y - 3; k <= y + 6; k++) {
                    for (int j = z - 3; j <= z + 6; j++) {
                        if (e.getBlock().getWorld().getBlockAt(i, k, j).getType() == block) {
                            loc.add(Arrays.asList(i,k,j));
                            count++;
                        }
                    }
                }
            }
            Bukkit.getServer().broadcastMessage(player + " 님이 " + ChatColor.AQUA + "다이아몬드 광석" + ChatColor.WHITE + " " + count + " 개를 발견하였습니다!");
            Bukkit.getServer().broadcastMessage(loc.toString());
        }
    }
}

 

먼저 코드를 전체적으로 수정했습니다.

기존 철, 석탄을 포함한 대부분의 광석을 포함시켰지만

이제 다이아몬드를 발견할 때만 알림이 뜨게 됩니다.

 

그리고, 다이아몬드를 발견하면

최초로 부순 다이아몬드 좌표의 -6 ~ +6의 범위를 조사하여

다른 다이아몬드 광석이 있을 시 , Arraylist에 추가하도록 했습니다.

그리고 확인하기 위하여 추가된 좌표를 메시지로 띄우도록 하였습니다.

 

 

 

다이아몬드 광석을 캘 때 마다 광석이 위치한 좌표가 뜹니다!

 

이제 광석을 부수면, 좌표를 삭제하는 기능만 넣으면 끝날 것 같습니다.

 

 

ArrayList<List> loc = new ArrayList<>();

@EventHandler
public void onBreak(BlockBreakEvent e){
    String player = e.getPlayer().getName();
    Material block = e.getBlock().getType();
    if (block==Material.DIAMOND_ORE || block == Material.DEEPSLATE_DIAMOND_ORE) {
        int x = e.getBlock().getX();
        int y = e.getBlock().getY();
        int z = e.getBlock().getZ();
        if(loc.contains(Arrays.asList(x,y,z))){
            loc.remove(Arrays.asList(x,y,z));
            return;
        }

 

블럭을 부수면, 부순 블럭의 좌표를 확인하여 ArrayList에 있는 좌표면 좌표를 삭제시키고,

이벤트를 종료합니다.

 

 

 

이제 메시지는 딱 한번만 뜨게 됩니다!

 

이제 세부적으로 수정하면 서버에 쓸만한 플러그인이 될 듯 합니다!

반응형