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

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

by Zepelown 2023. 1. 16.

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

 

이전 화

https://zepelown.tistory.com/48

 

[인텔리제이로 마크 플러그인 개발하기]9. config.yml 파일 제작하기 1편 (플레이어 입장 메시지 만

*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다. 지난 화 https://zepelown.tistory.com/47 [인텔리제이로 마크 플러그인 개발하기]8. 나만의 포션 제작하기 (커스텀 포션) *이 글은 Spigot 1.19.3 버

zepelown.tistory.com


이전 강의에서 만들었던 플레이어 입장 메시지를

 

config 통해 사용자가 변수 및 색깔 코드까지 설정할 수 있게 해보겠습니다.

 


이전 화에서 저희는 '경로(path)'라는 걸 배웠습니다.

하지만 일대일로 대응하는 Map이라

 

저장할 데이터가 많아지면 가독성이 떨어져 불편함이 큽니다.

 

그래서 sub-path를 지원합니다.

 

이는 단순하게 .을 추가하면 됩니다.

 

TestPlugin.java

(메인 클래스)

config.addDefault("join-message.display-message", true);
config.addDefault("join-message.message", "안녕하세요!");
config.options().copyDefaults(true);
saveConfig();

사용자가 message 수정할 때 player 이름의 위치까지 설정할 수 있게 하면 더 좋겠죠??

 

이 player 이름을 {playername}으로 지정해 보겠습니다.

 

예를 들자면 {playername} 님 안녕하세요! 를 config에 작성 시

 

서버에 접속하게 되면 

 

TestNickName 님 안녕하세요! 

 

이렇게 출력하게 되는 겁니다.

 

먼저 config의 default 값부터 수정하겠습니다.

 

TestPlugin.java

(메인 클래스)

config.addDefault("join-message.display-message", true);
config.addDefault("join-message.message", "{playername} 님 안녕하세요!");
config.options().copyDefaults(true);
saveConfig();

그 후 접속 시에 플레이어에게 메시지를 전달하면 되는데

 

이때 String의 메서드 중 replace를 사용하여 {playername}을 실제 플레이어 이름으로 바꿔줍니다.

 

JoinEvent.java

player.sendMessage(config.getString("join-message.message").replace("{playername}",player.getName()))

정상적으로 출력이 되는 것을 알 수가 있습니다.


이제 여기서 색깔까지 config에 추가해 보겠습니다.

 

일반적으로 &를 사용합니다.

 

색깔코드는 https://www.digminecraft.com/lists/color_list_pc.php

 

Minecraft Color Codes (and Format Codes)

Minecraft Color Codes (and Format Codes) In Minecraft, there are a number of built-in color codes and format codes that you can use in chat and game commands. Color codes can be used to change the color of text in the game, assign team colors, and customiz

www.digminecraft.com

를 참고하시길 바랍니다.

 

예를 들어 노란색으로 메시지를 출력하고 싶다면

 

위와 같이 작성하게 하는 겁니다.

 

JoinEvent.java

player.sendMessage(ChatColor.translateAlternateColorCodes('&',config.getString("join-message.message")
        .replace("{playername}",player.getName())));

CharColor의 translateAlternateColorCodes 메서드를 사용하여 

 

String에 있는 &를 색깔코드로 바꿔주는 겁니다.

 

결과는 다음과 같습니다.


마지막으로 이를 관리하는 클래스를 만들어

 

다른 config message가 생기더라도 반복 작업을 하지 않게 해 보겠습니다.

 

ChatManager.Java 를 만들어줍니다.

 

 

package io.github.zepelown.testplugin;

import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;

public class ChatManager {

    public static String prefix = ChatColor.GRAY+"["+ChatColor.YELLOW+"테스트"+ChatColor.GRAY+"]";

    public static void sendConfigMessageToPlayer(Player player, String path){
        TestPlugin plugin = TestPlugin.getPlugin();
        FileConfiguration config = plugin.getConfig();
        player.sendMessage(prefix + ChatColor.translateAlternateColorCodes('&',config.getString(path)
                .replace("{playername}",player.getName())));
    }

    public static void sendMessageToPlayer(Player player, String string){
        player.sendMessage(prefix + string);
    }

}

prefix(접두사)를 만들어 플러그인의 메시지에 일종의 칭호를 달아주고

 

config의 메시지를 플레이어에게 전달할 메서드와

 

기존에 사용하던 player.sendMessage 메서드를 대체할 sendMessageToPlayer를 만들어주었습니다.

 

이제 이 메서드들을 사용하여 JoinEvent.java, TestPlugin.java를 정리 및 마무리해보겠습니다.

 

TestPlugin.java

(메인 클래스)

package io.github.zepelown.testplugin;


import io.github.zepelown.testplugin.commands.*;
import io.github.zepelown.testplugin.event.BreakEvent;
import io.github.zepelown.testplugin.event.InvClickEvent;
import io.github.zepelown.testplugin.event.JoinEvent;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.java.JavaPlugin;

public final class TestPlugin extends JavaPlugin {

    private static TestPlugin plugin;
    FileConfiguration config = this.getConfig();

    private void initConfig(){
        config.addDefault("join-message.display-message", true);
        config.addDefault("join-message.message", "&7{playername} 님 안녕하세요!");
        config.options().copyDefaults(true);
        saveConfig();
    }

    private void registerEvents(){
        getServer().getPluginManager().registerEvents(new BreakEvent(), this);
        getServer().getPluginManager().registerEvents(new InvClickEvent(), this);
        getServer().getPluginManager().registerEvents(new JoinEvent(), this);
    }

    private void registerCommands(){
        getServer().getPluginCommand("thelp").setExecutor(new Help());
        getServer().getPluginCommand("tgivedia").setExecutor(new GiveDia());
        getServer().getPluginCommand("topeninv").setExecutor(new OpenInv());
        getServer().getPluginCommand("tgetpotion").setExecutor(new GetPotion());
    }

    @Override
    public void onEnable() {
        plugin = this;
        // Plugin startup logic
        getLogger().info("플러그인 활성화!!");
        registerCommands();
        registerEvents();
        initConfig();
    }

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



    public static TestPlugin getPlugin() {
        return plugin;
    }
}

config의 default 값을 수정하고 기존에 있던 코드들을 가독성 좋게 변경하였습니다.

 

JoinEvent.java

package io.github.zepelown.testplugin.event;

import io.github.zepelown.testplugin.ChatManager;
import io.github.zepelown.testplugin.TestPlugin;
import org.bukkit.ChatColor;
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();

        ChatManager.sendConfigMessageToPlayer(player, "join-message.message");
    }


}

ChatManager를 사용하여 메시지를 전달하였습니다.

 

최종 결과물입니다.

 

댓글