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

[인텔리제이로 마크 플러그인 개발하기](보충)Config 분할하기

by Zepelown 2023. 3. 7.

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

 

이전 강의

https://zepelown.tistory.com/58

 

[인텔리제이로 마크 플러그인 개발하기]13. Custom Config에 관하여 (Config 파일 여러 개 만들기, 플레

이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다. 이전 강좌 https://zepelown.tistory.com/57 [인텔리제이로 마크 플러그인 개발하기]12. 채팅 및 탭리스트에 칭호 달기 이 글은 Spigot 1.19.3 버전을

zepelown.tistory.com

 

 


이전 화에서 rank.yml을 만들었지만

 

기존에 만들어놓은 message와 player은 없었습니다.

 

이 부분을 수정해 보도록 하겠습니다.

 


ConfigManager.java

package io.github.zepelown.testplugin.config;

import io.github.zepelown.testplugin.TestPlugin;
import io.github.zepelown.testplugin.config.ConfigMaker;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

import java.util.*;

public class ConfigManager {
    private final TestPlugin plugin = TestPlugin.getPlugin();
    private final String path = plugin.getDataFolder().getAbsolutePath();

    private HashMap<String, ConfigMaker> configSet = new HashMap<>();

    public ConfigManager() {
        configSet.put("message", new ConfigMaker(path, "message.yml"));
        configSet.put("rank", new ConfigMaker(path, "rank.yml"));
        configSet.put("player",new ConfigMaker(path,"player.yml"));
        loadSettings();
        saveConfigs();
    }

    public void reloadConfigs() {
        for (String key : configSet.keySet()){
            plugin.getLogger().info(key);
            configSet.get(key).reloadConfig();
        }
    }

    public void reloadConfig(String fileName){
        configSet.get(fileName).reloadConfig();
    }

    public void saveConfigs(){
        for (String key : configSet.keySet())
            configSet.get(key).saveConfig();
    }

    public void saveConfig(String fileName){
        configSet.get(fileName).saveConfig();
    }

    public FileConfiguration getConfig(String fileName) {
        return configSet.get(fileName).getConfig();
    }

    public String getConfigColorString(String fileName, String path){ return ChatColor.translateAlternateColorCodes('&',
            getConfig(fileName).getString(path));
    }

    public void loadSettings(){
        FileConfiguration messageConfig = getConfig("message");
        FileConfiguration rankConfig = getConfig("rank");

        getConfig("player").options().copyDefaults(true);
        messageConfig.options().copyDefaults(true);
        rankConfig.options().copyDefaults(true);

        messageConfig.addDefault("join-message.display-message", true);
        messageConfig.addDefault("join-message.message", "&7{playername} 님이 접속하였습니다.");
        messageConfig.addDefault("quit-message.display-message", true);
        messageConfig.addDefault("quit-message.message", "&7{playername} 님이 접속을 종료하셨습니다.");
        messageConfig.addDefault("kick-message.display-message", true);
        messageConfig.addDefault("kick-message.message", "&4{playername} 님이 {reason} 이유로 인해 퇴장당하셨습니다.");
        messageConfig.addDefault("new-player-join-message.display-message", true);
        messageConfig.addDefault("new-player-join-message.message", "&e{playername} 님! 첫 접속을 환영합니다!!!");

        rankConfig.addDefault("ranks.admin.prefix", "[Admin]");
        rankConfig.addDefault("ranks.newbie.prefix","[Newbie]");
    }


}

  message와 player에 대한 정보를 추가해 줍니다.

 

방식은 이전 강의와 똑같습니다.

 

message.yml

player.yml

이제 플레이어가 서버에 접속했을 때 player.yml에 정보를 저장하게 하면 됩니다.

 

JoinEvent.java

package io.github.zepelown.testplugin.event;

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 {

    FileConfiguration messageConfig = TestPlugin.getConfigManager().getConfig("message");
    FileConfiguration playerConfig = TestPlugin.getConfigManager().getConfig("player");

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent e) {
        Player player = e.getPlayer();
        String rank, job, prefix;
        String playerName = player.getName();
        //만약 월드 데이터에 플레이어 정보가 없다면
        if(!player.hasPlayedBefore()){
            rank = "newbie"; job = "jobless";
            if(messageConfig.getBoolean("new-player-join-message.display-message"))
                e.setJoinMessage(TestPlugin.getConfigManager().getConfigColorString("message","new-player-join-message.message")
                        .replace("{playername}", playerName));
            playerConfig.set("players."+player.getName()+".rank", rank);
            playerConfig.set("players."+player.getName()+".job", job);
        } else {
            rank = playerConfig.getString("players."+playerName+".rank");
            job = playerConfig.getString("players."+playerName+".job");
            //config 데이터가 손실됐을 경우
            if(rank == null || job == null){
                rank = "newbie";
                job = "jobless";
                player.sendMessage(TestPlugin.pluginPrefix +"등급과 직업이 존재하지 않아 기본값을 부여하였습니다");
                playerConfig.set("players."+player.getName()+".rank", rank);
                playerConfig.set("players."+player.getName()+".job", job);
            }
            if (messageConfig.getBoolean("join-message.display-message"))
                e.setJoinMessage(TestPlugin.getConfigManager().getConfigColorString("message","join-message.message")
                        .replace("{playername}", playerName));
        }

        prefix = TestPlugin.getConfigManager().getConfig("rank").getString("ranks." + rank + ".prefix");
        player.setPlayerListName(prefix + playerName);

        TestPlugin.getConfigManager().saveConfig("player");
        
    }


}

player.hasPlayedBefore() 메서드를 사용해

 

월드 데이터에 플레이어의 데이터가 없으면 신규 접속자이므로

 

환영 공지를 출력하고 기본 값을 부여해 줍니다.

 

그리고 월드 데이터에 플레이어가 있더라도

 

config가 손실된 경우엔 버그가 발생하므로 null check도 해주었습니다.

 

※참고※

월드 데이터에서 플레이어 데이터 찾기

더보기

서버 폴더 안에 world가 있습니다.

 

기본 월드 맵 정보를 가지고 있습니다.

 

 playerdata 폴더 안에 dat 파일로 플레이어 데이터들이 존재합니다.

이제 빌드를 하고 결과를 확인해 보겠습니다.

 

player.yml

 

 

댓글