반응형
SMALL

 

이전강의

https://syntaxack.tistory.com/entry/%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B83%EA%B0%95

 

마인크래프트 플러그인 강좌 3강 - 커스텀 인벤토리 구현

이전 강의https://syntaxack.tistory.com/entry/%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B82%EA%B0%95 마인크래프트 플러그인 강좌 2강 - 커스텀 커맨드 구현이전 강의https://syntaxack.ti

syntaxack.tistory.com

아직 3강을 보지 않으신 분들은 3강을 보고 오시는 것을 추천드립니다!

 

커스텀 스코어보드

대규모 서버를 접속시 오른쪽 스코어보드에 플레이어 수가 나타나는 것을 볼 수 있습니다. 오늘은 그것을 한 번 구현해보도록 하겠습니다.

 

① 코드 작성 준비하기

 

코드는 PluginExample 클래스에서 진행하도록 하겠습니다. 위의 코드에서 그 전 강의와 다른 모습이 보이는 것은 제가 실험하면서 남은 코드이니까 신경 안 쓰셔도 됩니다. 여러분은 onEnable과 onDisable 함수만 구현되어 있을 것입니다.

 

② 코드 작성하기

package org.blog.pluginExample;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;

import org.bukkit.scoreboard.*;

import java.util.Objects;

public final class PluginExample extends JavaPlugin implements Listener {////코드 추가

    @Override
    public void onEnable() {
        // Plugin startup logic
        getLogger().info("플러그인이 활성화되었습니다.");
        Objects.requireNonNull(this.getCommand("test")).setExecutor(new MyCommand());
        Objects.requireNonNull(this.getCommand("openInventory")).setExecutor(new MyCommand());
        getServer().getPluginManager().registerEvents(this, this);////코드 추가
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
        getLogger().info("플러그인이 비활성화되었습니다.");
    }

    @EventHandler ///코드 추가
    public void onPlayerJoinBoard(PlayerJoinEvent e) {
        createScoreBoard(e.getPlayer());
        updateScoreBoard();
    }

    @EventHandler ///코드 추가
    public void onPlayerQuitEventBoard(PlayerQuitEvent e) {
        updateScoreBoard();
    }


    public void createScoreBoard(Player player) { ///코드 추가
        ScoreboardManager manager = Bukkit.getScoreboardManager();
        Scoreboard board = manager.getNewScoreboard();
        Objective o = board.registerNewObjective("My Server", "dummy");
        o.setDisplayName(ChatColor.BOLD + "My Server");
        o.setDisplaySlot(DisplaySlot.SIDEBAR);
        Score score = o.getScore("Players: ");
        score.setScore(Bukkit.getOnlinePlayers().size());
        player.setScoreboard(board);
    }

    public void updateScoreBoard() { ///코드 추가
        for(Player online : Bukkit.getOnlinePlayers()) {
            Score score = online.getScoreboard().getObjective(DisplaySlot.SIDEBAR).getScore("Players: ");
            score.setScore(Bukkit.getOnlinePlayers().size());
        }
    }


}

일단 전체적인 코드는 이렇습니다. 이제 하나 하나 설명해드리겠습니다.'

코드 추가라고 되어 있는 부분이 새로 추가된 코드입니다. 만약에 작성하시면서 글자가 빨간색이면서 import를 해야한다고 뜨면 다 import 해주세요. 

이렇게 빨갛게 된 부분에 마우스를 올리시면은 Import class라고 파란색으로 되어 있는 부분이 나올 것입니다. 이거 그냥 눌러주시면 됩니다.

<코드 설명>

public final class PluginExample extends JavaPlugin implements Listener {

먼저 이 코드는 저번에 extends JavaPlugin을 해준 것 이외에 implements Listener를 추가해주었습니다. 이는 Bukkit에서 제공하는 인터페이스로, 해당 인터페이스를 구현하고 특정 이벤트에 대한 동작을 정의하면, 플러그인은 플레이어의 행동(접속, 명령어 입력) 등에 반응할 수 있습니다. 말 그대로 플레이어의 행동을 감지하는 리스너입니다.

 

getServer().getPluginManager().registerEvents(this, this);

 

이 코드는 BUkkit 플러그인에서 이벤트 리스너를 등록하기 위해 사용하는 메서드입니다. 이 코드의 역할은 플러그인 시스템에 현재 클래스(this)가 이벤트를 처리하도록 알려주는 것입니다. getServer()은 서버 인스턴스를 가져옵니다. getPluginManger()은 플러그인과 관련된 작업을 관리하는 객체를 반환합니다. registerEvents()는 이벤트 리스너를 등록하는 리스너로, 두 개의 인자값을 받습니다. 첫 번째 인자값은 이벤트를 처리하는 클래스의 인스턴스입니다(this). 두 번째 인자값은 플러그인의 메인 클래스 인스턴스(this) 입니다.

이 코드는 이벤트를 처리하는 메서드를 가진 클래스를 Bukkit에 등록하여, 플레이어가 서버에 접속하거나 특정 행동을 할 때 정의된 이벤트 핸들러가 호출되도록 합니다.

이 코드는 onEnable 메서드에 작성해주었습니다. 그 이유가 궁금하시면 3강을 보고 오시면 됩니다.

 

@EventHandler
    public void onPlayerJoinBoard(PlayerJoinEvent e) {
        createScoreBoard(e.getPlayer());
        updateScoreBoard();
    }

이 메서드는 PlayerJointEvent 이벤트가 발생했을 때 실행됩니다. 즉 플레이어가 서버에 접속하면 호출됩니다. createScoreBoard는 우리가 직접 만든 커스텀 스코어보드 구현 함수입니다. 이는 아래에 코드 설명으로 이어가겠습니다. e.getPlayer()는 접속한 플레이어 객체를 가져오며, 해당 플레이어를 위한 새로운 점수판을 설정합니다. updateScoreBoard()도 우리가 직접 만든 커스텀 스코어보드 업데이트 구현 함수입니다. 이것도 아래에서 코드 설명으로 이어가겠습니다.

 

@EventHandler
    public void onPlayerQuitEventBoard(PlayerQuitEvent e) {
        updateScoreBoard();
    }

이것도 위의 onPlayerJoinBoard 이벤트랑 비슷한 맥락입니다. 플레이어가 종료했을 때 스코어보드도 업데이트 해주어야 하기 때문에 updateScoreBoard 라는 함수를 불러온 것입니다.

 

public void createScoreBoard(Player player) {
        ScoreboardManager manager = Bukkit.getScoreboardManager();
        Scoreboard board = manager.getNewScoreboard();
        Objective o = board.registerNewObjective("My Server", "dummy");
        o.setDisplayName(ChatColor.BOLD + "My Server");
        o.setDisplaySlot(DisplaySlot.SIDEBAR);
        Score score = o.getScore("Players: ");
        score.setScore(Bukkit.getOnlinePlayers().size());
        player.setScoreboard(board);
    }

- scoreboardManager : 서버에서 점수판 관리자를 가져옵니다.

- manager.getNewScoreboard(): 새로운 빈 점수판 객체를 생성합니다.

- board.registerNewObjective("My Server", "dummy"): "My Server"라는 이름과 "dummy"(수동 업데이트) 유형의 objective를 생성합니다. 이는 점수판에서 기록하고 관리하기 위한 목표를 의미합니다.

- o.setDisplayName(ChatColor.BOLD + "My Server"): 점수판의 제목을 설정하고 굵은 글씨로 표시합니다.

- o.setDisplaySlot(DisplaySlot.SIDEBAR): 점수판을 화면의 사이드바에 표시하도록 설정합니다.

- Score score = o.getScore("Players: ");: Players라는 텍스트로 점수를 추가합니다.

- score.setScore(Bukkit.getOnlinePlayers().size()): 현재 온라인 플레이어 수를 점수로 설정합니다. 즉 현재 접속해 있는 플레이어를 의미합니다.

- player.setScoreboard(board);: 생성된 점수판을 해당 플레이어에게 적용합니다. 즉 플레이어들에게 점수판이 보이도록 설정하는 것입니다.

 

public void updateScoreBoard() {
        for(Player online : Bukkit.getOnlinePlayers()) {
            Score score = online.getScoreboard().getObjective(DisplaySlot.SIDEBAR).getScore("Players: ");
            score.setScore(Bukkit.getOnlinePlayers().size());
        }
    }

플레이어가 게임을 종료하거나 들어올 시에 플레이어 수도 변해야 합니다. 이를 위해 스코어보드를 업데이트 해주는 작업을 해야 합니다.

- Bukkit.getOnlinePlayers(): 현재 서버에 접속중인 모든 플레이어의 목록을 가져옵니다.

- for(반복문): 각 온라인인 플레이어에 대해 반복합니다.

- online.getScoreboard().getObjective(DisplaySlot.SIDEBAR): 플레이어의 현재 점수판에서 사이드바에 표시된 Objective를 가져옵니다.

- getScore("Plyers: "): "Players: "라는 이름의 점수를 가져옵니다.

- score.setScore(Bukkit.getOnlinePlayers().size()): 현재 서버의 온라인 플레이어 수를 점수로 설정합니다.

 

③ JAR 파일 빌드하기

Gradle로 가셔서 jar 파일을 빌드해주세요.

④ 테스트하기

이제 server.bar과 마인크래프트를 실행시키고 확인해보세요.

정상적으로 커스텀 스코어보드가 뜨는 것을 확인해 볼 수 있습니다.

 

마무리

오늘은 커스텀 스코어보드를 구현하여 플레이어 접속자 수를 띄우는 작업을 하였습니다. 오늘 작성한 코드에서 조금 변형하여 여려분만의 스코어보드를 구현해보세요. 궁금한 것이 있으시면 댓글로 달아주시고 성심성의껏 답변해드리겠습니다. 좋아요랑 구독도 눌러주세요!

반응형
LIST