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

[인텔리제이로 마크 플러그인 개발하기]11. config.yml 제작하기 3편 (플레이어 데이터 저장 및 신규 유저 환영 메시지 작성하기)

by Zepelown 2023. 1. 27.

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

 

 

이전 강의

https://zepelown.tistory.com/51

 

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

*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다. 이전 화 https://zepelown.tistory.com/50 [인텔리제이로 마크 플러그인 개발하기](보충) 플레이어 입장 시 공지사항 수정하기 *이 글은 Spigot 1.1

zepelown.tistory.com

https://zepelown.tistory.com/49

 

[인텔리제이로 마크 플러그인 개발하기]10. config.yml 제작하기 2편 ( config에 변수 및 색깔 코드 넣

*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다. 이전 화 https://zepelown.tistory.com/48 [인텔리제이로 마크 플러그인 개발하기]9. config.yml 파일 제작하기 1편 (플레이어 입장 메시지 만 *이

zepelown.tistory.com


config를 통해 플레이어의 데이터를 저장해 보겠습니다.

 

저장할 데이터

1. 플레이어 이름

2. 플레이어 직업

3. 플레이어 랭크

4. 플레이어 최근 접속 시간

 

※참고

직업이랑 랭크는 이후 이어지는 강의에서 사용할 계획입니다.

 

기본 직업은 jobless, 랭크는 newbie 입니다.


 

먼저 완성된 config를 보여드리겠습니다.

위 config를 완성하고

 

처음 입장한 플레이어를 환영하는 메시지를 보내봅시다.

 


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.addDefault("message.new-player-join-message.display-message", true);
    config.addDefault("message.new-player-join-message.message", "&e{playername} 님! 첫 접속을 환영합니다!!!");
    config.options().copyDefaults(true);
    saveConfig();
}

처음 접속 메시지를 config로 수정하기 위해 위의 값을 추가해 줍니다.

 

그리고 플레이어의 데이터를 추가해 주면 됩니다.

 

JoinEvent.java

package io.github.zepelown.testplugin.event;

import io.github.zepelown.testplugin.ChatManager;
import io.github.zepelown.testplugin.TestPlugin;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

public class JoinEvent implements Listener {


    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent e){

        Player player = e.getPlayer();
        TestPlugin plugin = TestPlugin.getPlugin();
        String playerName = player.getName();
        FileConfiguration config = plugin.getConfig();

        //만약 플레이어의 정보가 없다면
        if(!config.contains("players."+playerName)) {
            if(config.getBoolean("message.new-player-join-message.display-message"))
                plugin.getServer().broadcastMessage(ChatManager.getConfigMessage("message.new-player-join-message.message").replace("{playername}",playerName));
            config.set("players."+playerName+".rank", "newbie");
            config.set("players."+playerName+".job", "jobless");
        } else {
            ChatManager.sendMessageToPlayer(player, "최근 접속 시간 : "+ config.getString("players."+playerName+".recent-join-date"));
        }
        if(config.getBoolean("message.join-message.display-message"))
            e.setJoinMessage(ChatManager.getConfigMessage("message.join-message.message").replace("{playername}",playerName));
        plugin.saveConfig();
    }


}

 생각보다 간단합니다.

 

PlayerJoinEvent가 발생했을 때 

 

config를 탐색해 players.+playerName 경로가 존재하지 않으면

 

config의 정보를 가져와 새로운 플레이어 입장 메시지를 broadcast 하고

 

config.set 메서드를 통해 플레이어의 하위 경로로 데이터를 추가합니다.

 

마지막으로 write를 했으므로 save를 해줍니다.

 

참고

e.setJoinMessage를 여러 번 사용할 경우 마지막의 코드만 최종적으로 적용됩니다.

 

이제 최근 접속 시간을 저장해야 하는데 이는 PlayerQuitEvent가 발생했을 때 저장해 주면 됩니다.

 

 

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;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LeaveEvent implements Listener {

    private TestPlugin plugin = TestPlugin.getPlugin();

    @EventHandler
    public void onPlayerQuit(PlayerQuitEvent e){
        String playerName = e.getPlayer().getName();
        if(plugin.getConfig().getBoolean("message.quit-message.display-message"))
            e.setQuitMessage(ChatManager.getConfigMessage("message.quit-message.message").replace("{playername}",playerName));
        if(plugin.getConfig().contains("players."+playerName)){
            LocalDateTime now = LocalDateTime.now();
            String formatedNow = now.format(DateTimeFormatter.ofPattern("yyyy년 MM월 dd일 HH시 mm분"));
            plugin.getConfig().set("players."+e.getPlayer().getName()+".recent-join-date",formatedNow);
            plugin.saveConfig();
        }
    }

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

 

 

 

자바 API인 LocalDateTime 를 사용해 퇴장 시 시간을 불러오고

 

그걸 format으로 String으로 만든 다음 

 

config에 저장해 줍니다.

 

단, 만약 플레이어의 정보가 있을 경우에만 시간을 저장하도록 합니다.

(플레이어가 서버에 있는 상태에서 config 데이터가 사라졌을 경우를 대비합니다)

(조건문을 추가 안 해도 크게 상관은 없습니다)

 


이제 빌드를 해보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

댓글