잡다한 개발/마크플러그인

마크 플러그인 만들기 (#1)

오잎 클로버 2021. 8. 30. 12:00
728x90

마크 버전은 작성일 기준 최신 버전은 1.17.1를 사용할 것이고, spigot 1.17.1를 사용할 것입니다.

외부라이브러리로 spigot 1.17.1 .jar를 설정합니다.

자바 버전은 16 버전의 자바로 하였습니다. (16.0.2)

※자바 버전을 16버전의 JDK를 설치하여야 서버가 열릴 겁니다.

 

먼저 src에 Main.java 를 추가하여 메인 클래스를 만듭니다.

Main에 extends JavaPlugin과 implements Listener를 추가합니다.

public class Main extends JavaPlugin implements Listener {

}

플러그인을 실행하였을 때에 콘솔창에서 나올 텍스트를 추가하기위해

ConsoleCommandSender consol = Bukkit.getConsoleSender();

를 추가합니다.

 

가장 기본적인 틀인 onEnable과 onDisable 메소드를 오버라이딩합니다.

@Override
public void onEnable() {
    // 시작시, 작동할 코드
    consol.sendMessage("[플러그인 활성화 중 입니다.]");
    getServer().getPluginManager().registerEvents(this, this);
}

@Override
public void onDisable() {
    // 종료시, 작동할 코드
    consol.sendMessage( "[플러그인 비활성화 중 입니다.]");
}

 

RPG플러그인을 개발하면서 처음에 제일로 있었으면 하는 기능 중 하나는 책을 사용하여 텍스트를 클릭하면 해당 명령어를 사용하는 것을 구현하는 것이었습니다.

 

먼저 책을 사용할 것이기에 book이라는 패키지를 만들고 Book.java를 만들어 개발하였습니다.

접속하였을 때, 해당 플레이어에게 특수한 책이 없을 때에만 책을 지급하도록 하였습니다.

 

접속하였을 때를 인식하기 위해 implements Listener와 더불어 PlayerJoinEvent를 사용합니다.

public class Book implements Listener {
    
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent e) {
        Player player = e.getPlayer();    // 입장한 유저
    }
}

책을 만드는 방법은 매우 단순합니다.

ItemStack book = new ItemStack(Material.WRITTEN_BOOK);

아이템에게 Meta와 함께 지급을 해야 하므로 ItemStack으로 지정합니다.

Material에 존재하는 BOOK의 종류는 5가지가 존재합니다.

BOOK, WRITTEN_BOOK, ENCHANTED_BOOK, KNOWLEDGE_BOOK, WRITABLE_BOOK 중 저희는 이미 작성이 완료된 책을 사용해야 합니다.

(그냥 BOOK을 사용할 경우 작성 불가능한 책이므로 에러가 뜨고, ENCHANTED_BOOK 같은 경우에도 마찬가지입니다.

그 외에도 마찬가지의 에러가 발생합니다.)

※WRITABLE_BOOK은 테스트해보지 않아 잘 모르겠습니다.

 

그런 다음 BaseComponent배열을 사용하여 페이지(내용)를 추가하도록 하겠습니다.

BaseComponent[] page = new ComponentBuilder("보일 텍스트")
    .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "사용할 명령어"))
    .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("마우스 올라갈 때 보일 텍스트").create()))
    .create();

ComponentBuilder를 사용하여 보일 텍스트를 설정하고, ClickEvent으로 클릭 시, 작동할 코드를 작성하고

HoverEvent로 마우스가 텍스트에 닿았을 때 반응할 코드를 작성하였습니다.

 

BookMeta를 변수로 설정한 후 페이지(내용)를 추가하였습니다.

BookMeta bookMeta = (BookMeta) book.getItemMeta();
bookMeta.spigot().addPage(page);    // 책 메타 타입에 페이지를 하나 추가함

그리고 개인적으로 제목과 작가를 설정하는 것은 개인적으로 하여도 되고 하지 않아도 되지만, 하지 않는 다면 Default값으로 설정이 됩니다.

bookMeta.setTitle("JUST BOOK");     // 책 제목
bookMeta.setAuthor("ME");   // 책 지은이

책에게 위 작성한 메타를 설정한 다음 플레이어에게 해당 책이 없다면 지급을 합니다.

book.setItemMeta(bookMeta);     // 해당 책에게 메타타입 적용

if (player.getInventory().contains(book))
    return;

player.getInventory().addItem(book);    // 들어오는 사람한테 책 한 권 지급

 

틀을 만들었으니, 이제 명령어를 개발해봅시다.

command라는 패키지와 RPGCommand.java 파일을 만듭니다.

implements CommandExecutor와 onCommand 메소드를 오버라이딩합니다.

public class RPGCommand implements CommandExecutor {
    
    @Override
    public void onCommand(CommandSender sender, Command command, String s, String[] strings) {
    
    }
}

명령어를 보낸 이가 참조하고 있는 실제 타입이 플레이어타입일때에만 사용하도록 하였습니다.

if (!(sender instanceof Player)) return false;

변수를 사용하여 플레이어를 정하고, 명령어를 개발합니다.

Player player = (Player) sender;

if (strings.length == 0) {
    // TODO help 명령어 사용하게 추후 개발
}
else {
    if (strings[0].equals("setCharacter")) {
        if (strings.length >= 2) {
            if (strings[1].equals("Fighter")) {
                sender.sendMessage("파이터 클래스로 설정하였습니다.");
            }
        }
        else {
            sender.sendMessage("미지정 명령어 사용함");   // TODO 추후 빨간색 텍스트로 에러 문자열 전송
        }
    }
}

return true;

이후 Main.java에

Book과 명령어를 세팅합니다.

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

getCommand("명령어 접두사").setExecutor(new RPGCommand());

위 코드를 onEnable메소드에 추가합니다.

 

플러그인을 적용시키기위해서는 plugin.yml이 있어야합니다.

※만일 Intellij를 사용하신다면 .jar를 만들 때에 src파일에 추가하여야 적용됩니다.

yml파일은 띄여쓰기와 :를 잘못 사용해도 에러를 미친듯이 뱉어내기 때문에 틀리면 안된다.

이를 방지하기위해서 yaml검사 사이트에서 검사하길 바란다. [사이트]

plugin.yml파일에 

---
author: 플러그인 개발자
description: 플러그인 설명
main: 프로젝트 Main위치 예) com.tistory가 패키지라면 com.tistory.Main
name: 플러그인명
version: "버전"
commands:
  접두사:
    description: 명령어 설명
    usage: /접두사

 

위처럼 세팅을 전부한 뒤, jar 파일로 export하면 플러그인은 준비된 것입니다.

 

이제 마크 서버를 열 준비를 합니다.

파일을 하나 만들고

해당 파일에 해당 spigot.jar 파일을 넣고 텍스트 파일을 하나 만듭니다.

자신의 컴퓨터 사양에 맞게 세팅하시길 바랍니다.

@echo off
java -Xms512M -Xmx1024M -jar spigot-1.17.1.jar
pause

-Xms 옵션은 jar 파일 실행 초기에 할당하는 동적 메모리이다. 초기에 로드하는 값이 많은 경우에 최소 메모리를 크게 잡아주세요.

-Xmx 옵션은 jar 파일이 가질 수 있는 최대 동적 메모리이다. 처리하는 쓰레드가 많거나, 메모리에 들고있어야하는 데이터가 많은 경우에 크게 잡아주세요.

 

위 처럼을 설정을 한 후, 확장명을 배치파일로 바꿔주세요.

.txt → .bat

그런다음 배치파일을 실행하면 여러 파일이 생성되고 에러가 뜨면서 멈춥니다.

대충 에러를 읽어보면 elua.txt파일에 있는 elua=false라서 에러가 뜬다는 의미입니다.

이를 false에서 true로 바꾼후 저장. 다시 배치파일을 실행합니다.

서버를 여는 데에 꽤 시간이 걸리기에 그동안 마인크래프트를 설치하거나 이미 마인크래프트가 설치되어있다면 유튜브나 웹툰 1, 2편 보면 서버가 성공적으로 완료될것입니다.

이후 마인크래프트를 실행합니다.

마인크래프트 버전은 1.17.1로 합니다.

멀티플레이 → 서버 추가 → 서버 주소: localhost → 완료

서버를 세팅하였으니, 플러그인을 적용시키기 위해 서버를 stop명령어로 종료합니다.

이후 서버 파일 안에 있는 plugins 파일에 만든 플러그인 .jar를 넣고 다시 실행하시면 플러그인이 적용된 서버를 여신 겁니다.

'잡다한 개발 > 마크플러그인' 카테고리의 다른 글

마크 가챠 1편  (0) 2021.11.20
마크 가챠 0편  (0) 2021.11.19
마크 플러그인 만들기 (#3)  (0) 2021.09.01
마크 플러그인 만들기 (#2)  (0) 2021.08.31
마크 플러그인 만들기 (#0)  (0) 2021.08.26