마인크래프트 플러그인 개발해보기 [12] - 광물 알람 플러그인 만들기 (3)
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에 있는 좌표면 좌표를 삭제시키고,
이벤트를 종료합니다.
이제 메시지는 딱 한번만 뜨게 됩니다!
이제 세부적으로 수정하면 서버에 쓸만한 플러그인이 될 듯 합니다!