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

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

by Zepelown 2023. 1. 13.

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

 

지난 화

https://zepelown.tistory.com/47

 

[인텔리제이로 마크 플러그인 개발하기]8. 나만의 포션 제작하기 (커스텀 포션)

*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다. 지난 화 https://zepelown.tistory.com/45 [인텔리제이로 마크 플러그인 개발하기]7. 나만의 인벤토리 GUI 만들기 2편 (인벤토리와 관련된 이 *이

zepelown.tistory.com

준비물

NotePad++와 같은 인코딩 기능 있는 텍스트 에디터

https://notepad-plus-plus.org/

 

Notepad++

What is Notepad++ Notepad++ is a free (as in “free speech” and also as in “free beer”) source code editor and Notepad replacement that supports several languages. Running in the MS Windows environment, its use is governed by GNU General Public Lice

notepad-plus-plus.org


config 파일이란?

 

플러그인이 작동하기 위해 필요한 데이터를 저장한 일종의 방식으로

 

이를 이용하여 서버 운영자가 플러그인을 커스터마이징 할 수 있도록 하기도 합니다.

 

한 번쯤 서버를 운영해 보셨다면 밑과 같이 config 파일이 있는 플러그인을 보신 적이 있으실 겁니다.

에센셜 플러그인입니다

보시다시피 사용자가 커스터마이징 할 수 있게 해 놓았습니다.

 

이번 강의에서는 가장 기본적인 config 파일부터 제작하고

 

간단하게 플레이어 입장 시 메시지를 전달하는 플러그인을 만들어보겠습니다.


먼저 plugin.yml이 있는 resources 패키지에 config.yml 파일을 만들어줍니다.

파일만 만들어주시면 끝납니다.

 

이제 플레이어가 입장 이벤트가 발생 시에

 

config에 저장한 데이터를 보내주면 됩니다.

 

저장할 데이터는

 

플레이어가 입장 시 메시지를 전달할 여부

(display-message)

그리고 이 메시지 값입니다.

(message)

 

 

config.yml에 데이터를 직접 적어도 되지만

 

프로그램이 config.yml를 작성해 주면 더 좋겠죠?

 

TestPlugin.java

(메인클래스)

public final class TestPlugin extends JavaPlugin {
    public static String prefix = ChatColor.GRAY+"["+ChatColor.YELLOW+"테스트"+ChatColor.GRAY+"]";

    FileConfiguration config = this.getConfig();

    @Override
    public void onEnable() {
        // Plugin startup logic
        getLogger().info("플러그인 활성화");
        getServer().getPluginManager().registerEvents(new BreakEvent(), this);
        getServer().getPluginManager().registerEvents(new InvClickEvent(), this);
        getServer().getPluginManager().registerEvents(new JoinEvent(), this);
        getServer().getPluginCommand("thelp").setExecutor(new Help());
        getServer().getPluginCommand("tgivedia").setExecutor(new GiveDia());
        getServer().getPluginCommand("topeninv").setExecutor(new OpenInv());
        getServer().getPluginCommand("tgetpotion").setExecutor(new GetPotion());

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

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

위와 같이 작성해 주시면 됩니다.

 

addDefault는 config를 처음 생성시킬 때 값이 없을 경우 자동으로 넣어주는 함수

 

첫 번째 인자는 경로를, 두 번째 인자는 값을 의미합니다.

 

여기서 경로란?

 

데이터를 가져오기 위해 config를 탐색 시에

 

기준이 되는 겁니다.

 

만약 위 코드를 실행하게 된다면

이런 config 파일이 생성됩니다.

 

만약 한글이 깨지게 된다면 NotePad++를 사용하시고 인코딩 UTF-8로 설정해주셔야 합니다.

 

마지막으로 이 config를 저장하기 위해 saveConfig()를 사용합니다.

 

이 saveConfig는

 

config 파일이 존재하지 않을 시에 폴더와 파일을 만들어줍니다.

 

이때, this.getConfig().options().copyDefaults(true); 를 사용하지 않으면

 

default 값이 사라져도 다시 만들어주지 않습니다.


config 파일 작성이 끝났으므로

 

플레이어의 입장 이벤트를 관리하는 JoinEvent 클래스를 만들어봅시다.

 

JoinEvent.java

package io.github.zepelown.testplugin.event;

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.java

(메인클래스)

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

일단 플레이어가 접속 시에 그 플레이어의 데이터를 가져오긴 했습니다만

 

config에 적혀 있는 데이터를 어떻게 가져오죠??

 

config를 사용하기 위해서 메인 클래스의 인스턴스를 사용해야 합니다

(JavaPlugin의 상속이 필요함으로)

 

하지만 저희는 이전에 event를 다른 패키지로 분할을 했었습니다.

이를 해결하기 위해

 

메인 클래스의 인스턴스를 JoinEvent 클래스에 전달해야 합니다.

 

TestPlugin.java

(메인클래스)

package io.github.zepelown.testplugin;


import io.github.zepelown.testplugin.commands.GetPotion;
import io.github.zepelown.testplugin.commands.GiveDia;
import io.github.zepelown.testplugin.commands.Help;
import io.github.zepelown.testplugin.commands.OpenInv;
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.Plugin;
import org.bukkit.plugin.java.JavaPlugin;

public final class TestPlugin extends JavaPlugin {
    public static String prefix = ChatColor.GRAY+"["+ChatColor.YELLOW+"테스트"+ChatColor.GRAY+"]";

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

    @Override
    public void onEnable() {
        plugin = this;
        // Plugin startup logic
        getLogger().info("플러그인 활성화");
        getServer().getPluginManager().registerEvents(new BreakEvent(), this);
        getServer().getPluginManager().registerEvents(new InvClickEvent(), this);
        getServer().getPluginManager().registerEvents(new JoinEvent(), this);
        getServer().getPluginCommand("thelp").setExecutor(new Help());
        getServer().getPluginCommand("tgivedia").setExecutor(new GiveDia());
        getServer().getPluginCommand("topeninv").setExecutor(new OpenInv());
        getServer().getPluginCommand("tgetpotion").setExecutor(new GetPotion());

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

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

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

다른 클래스에서 getPlugin()으로 메인 클래스의 인스턴스를 받을 수 있게 됩니다.

 

다시 돌아가보겠습니다.

 

JoinEvent.java

package io.github.zepelown.testplugin.event;

import io.github.zepelown.testplugin.TestPlugin;
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();
        if(!plugin.getConfig().getBoolean("display-message"))
            return;
        player.sendMessage(TestPlugin.prefix + plugin.getConfig().getString("message"));
    }
}

 getPlugin()으로 config 관련 데이터를 사용할 수 있게 되었고

 

 getBoolean과 getString으로 데이터를 가져오는 모습입니다.

 

여기서 위에서 언급한 경로가 사용됩니다.

아까 이렇게 config를 설계했습니다.

 

그러면 display-message는 Boolean 값을 가지고 있게 되고

 

message는 String값을 가지게 됩니다.

 

그렇기 때문에 getBoolean과 getString 사용하여 데이터를 가져온 것입니다.

 


 

이제 빌드하여 확인해 보겠습니다.

config.yml

정상적으로 작동이 잘 됐습니다.

 

이제 서버에 접속하여 확인해 보겠습니다.

 

 

이제 config 파일을 바꿔볼까요?

메시지를 꺼볼까요?

정상적으로 작동이 잘 되네요!

 

댓글