이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다.
이전 강좌
https://zepelown.tistory.com/57
전체적으로 코드를 수정하였습니다.
Event 관련(특히 JoinEvent, LeaveEvent)메서드 안 주석 처리 또는 삭제해 주세요.
또한 ChatManager를 삭제하였습니다.
만약 끝까지 정확히 진행하였는데도 오류가 발생한다면
그 코드를 주석 또는 지워주시면 됩니다.
주석이란?
이번 강의에선 기존 코드와 충돌할 가능성이 높습니다.
이후 강의들에서 코드를 재정리할 것이니
불편을 드려서 죄송합니다.
제가 이 강좌에 사용한 코드는 맨 마지막에 다 정리하겠습니다.
저희는 이때까지 기본 Config를 사용했습니다.
하지만 개발을 하다 보면 파일을 분할하는 것이
직관적으로 좋습니다.
이번 강의에선 기존에 사용하던 config 말고
등급에 대한 정보를 적는 config 파일을 추가로 만들어보겠습니다.
파일명은 rank.yml이고 내용은 다음과 같습니다.
config 파일은 자바의 File API를 사용하여 만듭니다.
(자세한 정보는 구글에 검색하시면 정말 많이 있어요)
먼저 클래스 구조를 설명해 드리겠습니다.
config라는 패키지(폴더)를 만들고
ConfigMaker.java 와 ConfigManager.java를 생성합니다.
ConfigMaker.java
Config 파일을 생성하는 클래스이자 Config의 정보를 가지고 있습니다.
쉽게 말해 이 인스턴스 하나가 Config라고 생각하시면 됩니다.
package io.github.zepelown.testplugin.config;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
public class ConfigMaker {
private File file;
private FileConfiguration config;
public ConfigMaker(String path, String fileName){
this.file = new File(path + "/" + fileName);
this.config = YamlConfiguration.loadConfiguration(this.file);
}
public FileConfiguration getConfig(){
return config;
}
public void saveConfig(){
if(config == null)
return;
try{
this.config.save(this.file);
} catch (Exception e){
e.printStackTrace();
return;
}
}
public boolean exists(){
return file != null && file.exists();
}
public void reloadConfig(){
if(!exists())
return;
config = YamlConfiguration.loadConfiguration(file);
}
}
변수 또는 메소드 | 용도 |
private File file | 파일을 가지고 있는 인스턴스입니다. |
private FileConfiguration config | 만든 파일을 config로 사용하기 위해 로드했다고 생각하시면 편합니다. 이 변수로 기존에 사용했던 config 메소드들을 사용합니다. |
ConfigMaker(String path, String fileName) | 생성자로 파일이 없으면 만들고 있을 경우 로드합니다. |
getConfig() | 위 config 변수는 private이기 때문에 리턴해주기 위해 사용합니다. |
saveConfig() | config 파일을 저장합니다. |
exists() | null 값 체크용도입니다. (없어도 작동엔 문제가 없습니다) |
reloadConfig() | Config를 reload하는 것으로 수정했을 경우 다시 불러와 데이터를 갱신하는 용도입니다. |
ConfigManager.java
Config 파일들을 관리하는 클래스입니다.
Config 개수가 많아지더라도 문제가 없도록 합니다.
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("rank", new ConfigMaker(path, "rank.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 rankConfig = getConfig("rank");
rankConfig.options().copyDefaults(true);
rankConfig.addDefault("ranks.admin.prefix", "[Admin]");
rankConfig.addDefault("ranks.newbie.prefix","[Newbie]");
}
}
변수 또는 메소드 | 용도 |
HashMap<String, ConfigMaker> configSet = new HashMap<>(); |
Config 파일을 저장할 HashMap입니다. String 값을 키값으로 가지기 때문에 바로 데이터를 검색할 수 있습니다. (자세한 내용은 자바 HashMap 또는 자료구조를 공부하셔야합니다) |
ConfigManager() | config를 HashMap에 저장하고 config 기본값을 저장합니다. |
reloadConfigs() reloadConfig() |
하나의 Config 또는 모든 Config를 reload 합니다 |
saveConfigs() saveConfig() |
하나의 Config 또는 모든 Config를 save합니다. |
getConfig(String fileName) | fileName에 해당하는 config를 가져옵니다. ex. getConfig.getString(path) 이런 식으로 사용가능합니다. |
getConfigColorString(String fileName, String path) | 기존 ChatManager에 있던 기능으로 ColorCode를 적용해줍니다. |
loadSettings() | default 값들을 지정해줍니다. |
TestPlugin.jar
메인클래스
메인 클래스에서 ConfigManager가 실행될 수 있도록 해줍니다.
여기서 ConfigManager는 정적 클래스로 선언해 줍니다.
하나의 ConfigManager가 여러 개의 ConfigMaker를 관리한다고 생각하시면 됩니다.
package io.github.zepelown.testplugin;
import io.github.zepelown.testplugin.commands.*;
import io.github.zepelown.testplugin.config.ConfigManager;
import io.github.zepelown.testplugin.event.*;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;
public final class TestPlugin extends JavaPlugin {
private static ConfigManager configManager;
public static String pluginPrefix = ChatColor.GRAY+"["+ChatColor.YELLOW+"플러그인"+ChatColor.GRAY+"]";
private void registerEvents(){
getServer().getPluginManager().registerEvents(new BreakEvent(), this);
getServer().getPluginManager().registerEvents(new InvClickEvent(), this);
getServer().getPluginManager().registerEvents(new JoinEvent(), this);
getServer().getPluginManager().registerEvents(new LeaveEvent(), this);
getServer().getPluginManager().registerEvents(new ChatEvent(), 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() {
getConfigManager();
registerCommands();
registerEvents();
getLogger().info(configManager.getConfig("rank").getString("ranks.admin.prefix"));
}
@Override
public void onDisable() {
}
public static TestPlugin getPlugin() {
return JavaPlugin.getPlugin(TestPlugin.class);
}
public static ConfigManager getConfigManager(){
if(configManager == null)
configManager = new ConfigManager();
return configManager;
}
}
추가로 잘 작동하는지 콘솔에 로그를 남겨보았습니다.
(어드민 등급의 칭호를 표시)
이러면 커스텀 Config는 설정이 끝났습니다.
하지만 이전 강의에서 작성했던 것과 다르게 많은 게 변경됐습니다.
기존에 사용하던 Config를 커스텀 Config로 변경하기 위해 변경하였습니다.
빌드하시기 전에
제가 테스트를 할 때 사용한 코드를 보여드리겠습니다.
기존 Config 코드와 관련된 것을 다 지우거나 주석처리 하시면 됩니다.
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 {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
}
}
LeaveEvent.java
package io.github.zepelown.testplugin.event;
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 {
@EventHandler
public void onPlayerQuit(PlayerQuitEvent e){
}
@EventHandler
public void onPlayerKick(PlayerKickEvent e){
}
}
ChatEvent.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.AsyncPlayerChatEvent;
public class ChatEvent implements Listener {
@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
}
}
이제 빌드해 보겠습니다.
정상적으로 작동합니다.
'마인크래프트 > 플러그인 제작 강좌(자바)' 카테고리의 다른 글
[인텔리제이로 마크 플러그인 개발하기](보충)Config Reload 명령어 만들기 (2) | 2023.03.20 |
---|---|
[인텔리제이로 마크 플러그인 개발하기](보충)Config 분할하기 (0) | 2023.03.07 |
[인텔리제이로 마크 플러그인 개발하기]12. 채팅 및 탭리스트에 칭호 달기 (2) | 2023.02.06 |
[인텔리제이로 마크 플러그인 개발하기]11. config.yml 제작하기 3편 (플레이어 데이터 저장 및 신규 유저 환영 메시지 작성하기) (13) | 2023.01.27 |
[인텔리제이로 마크 플러그인 개발하기](보충) 플레이어 퇴장시 공지사항(PlayerQuitEvent 와 PlayerKickEvent의 관계) (5) | 2023.01.21 |
댓글