본문 바로가기
마인크래프트/플러그인 제작 강좌(자바)

[인텔리제이로 마크 플러그인 개발하기](보충) 플레이어 퇴장시 공지사항(PlayerQuitEvent 와 PlayerKickEvent의 관계)

by Zepelown 2023. 1. 21.

*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다.

 

이전 화

https://zepelown.tistory.com/50

 

[인텔리제이로 마크 플러그인 개발하기](보충) 플레이어 입장 시 공지사항 수정하기

*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다. 이전 화 https://zepelown.tistory.com/49 [인텔리제이로 마크 플러그인 개발하기]10. config.yml 제작하기 2편 ( config에 변수 및 색깔 코드 넣 *이

zepelown.tistory.com


퇴장 이벤트에 크게 두 가지가 있습니다.

 

플레이어가 무슨 이유로든 간에 서버에서 나간 경우인

 

PlayerQuitEvent

 

플레이어가 서버에서 퇴장당했을 경우인

 

PlayerKickEvent

 

가 있습니다.

 

퇴장에는 /kick, /ban을 제외하고도 다양한 이유가 있으며

 

https://namu.wiki/w/마인크래프트/서버/강제%20퇴장%20메시지

 

https://namu.wiki/w/%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8/%EC%84%9C%EB%B2%84/%EA%B0%95%EC%A0%9C%20%ED%87%B4%EC%9E%A5%20%EB%A9%94%EC%8B%9C%EC%A7%80

 

namu.wiki

위 문서를 참고하시길 바랍니다.

 


 

먼저 아셔야 할 것이 있습니다.

 

위 이벤트는 서로 독립적으로 작동합니다.

 

이게 뭔 소리냐면 

 

만약 플레이어 A가 킥을 당해 서버에 나가졌다고 하면

 

언뜻 생각하기로 kick을 당했으니까 quit 이벤트는 발생하지 않을 것 같이 보이지만

 

두 이벤트는 차례대로 PlayerKickEvent -> PlayerQuitEvent 발생합니다.

 

이로 인해 플레이어의 퇴장 메시지를 만들 때

 

단순히 PlayerQuitEvent만 생각할 것이 아니라

 

PlayerKickEvent 또한 생각해야 합니다.

 

 

이를 가장 쉽게 해결하는 방법으로는

 

quit 메시지를 그대로 출력하되

 

추가로 강퇴를 당했을 경우에 강퇴 메시지를 추가로 출력하는 방식입니다.

 


Config에 퇴장 메시지를 추가하여 수정할 수 있도록 하겠습니다.

 

또한 저번 강의에서 놓친 메시지 출력 여부도 포함하여 작성하겠습니다.

 

 

config.yml

TestPlugin.java

(메인 클래스)

private void initConfig(){
    config.addDefault("message.join-message.display-message", true);
    config.addDefault("message.join-message.message", "&7{playername} 님이 접속하였습니다.");
    config.addDefault("message.quit-message.display-message", true);
    config.addDefault("message.quit-message.message", "&7{playername} 님이 접속을 종료하셨습니다.");
    config.addDefault("message.kick-message.display-message", true);
    config.addDefault("message.kick-message.message", "&4{playername} 님이 {reason} 이유로 인해 퇴장당하셨습니다.");
    config.options().copyDefaults(true);
    saveConfig();
}

 

이제 이벤트를 관리하는 클래스를 만들어줍니다.

LeaveEvent.java

package io.github.zepelown.testplugin.event;

import io.github.zepelown.testplugin.ChatManager;
import io.github.zepelown.testplugin.TestPlugin;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;

public class LeaveEvent implements Listener {

    private TestPlugin plugin = TestPlugin.getPlugin();

    @EventHandler
    public void onPlayerQuit(PlayerQuitEvent e){
        if(plugin.getConfig().getBoolean("message.quit-message.display-message"))
            e.setQuitMessage(ChatManager.getConfigMessage("message.quit-message.message").replace("{playername}",e.getPlayer().getName()));
    }

    @EventHandler
    public void onPlayerKick(PlayerKickEvent e){
        if(plugin.getConfig().getBoolean("message.quit-message.display-message"))
            plugin.getServer().broadcastMessage(ChatManager.getConfigMessage("message.kick-message.message").replace("{playername}",e.getPlayer().getName())
                .replace("{reason}",e.getReason()));
    }
}

{reason}으로 이유를 적는 구간을 넣어주고

 

이를 적절하게 바꾼 모습입니다.

 

결과는 다음과 같습니다.

 

 

댓글