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

[인텔리제이로 마크 플러그인 개발하기]6. 나만의 인벤토리 GUI 만들기 1편 (기본적인 인벤토리 작성법)

by Zepelown 2022. 9. 18.

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

 

지난 화

https://zepelown.tistory.com/43

 

[인텔리제이로 마크 플러그인 개발하기]5. 나만의 명령어 만들기 (give, help 명령어 만들어보기)

*이 글은 Spigot 1.19.2 버전을 기준으로 하여 제작되었습니다. 이전화 https://zepelown.tistory.com/41 [인텔리제이로 마크 플러그인 개발하기]4. 나만의 아이템 제작하기 (ItemStack, ItemMeta에 관하여) *이..

zepelown.tistory.com


지난 화가 내용이 좀 분할되지 못하고 길게 된 것 같아

 

이번 인벤토리로 gui 만들기에서는 여러 편으로 나누어 작성할 예정입니다.

(그만큼 내용이 많습니다)

 

오늘 사용할 주 api는

https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/Inventory.html

 

Inventory (Spigot-API 1.19.2-R0.1-SNAPSHOT API)

getStorageContents Return the contents from the section of the inventory where items can reasonably be expected to be stored. In most cases this will represent the entire inventory, but in some cases it may exclude armor or result slots. It is these conten

hub.spigotmc.org

이고 오늘 만들 건 간단하게 자신만의 인벤토리 GUI를 제작해보는 겁니다.

 

또한 마지막에 가서는 gui에 각종 기능을 넣어보는 것이 이번 강좌 시리즈의 목표입니다.

 

인벤토리의 제작을 쉽게 하기 위해 각종 유저들이 만든 api들이 많습니다만, 그 api 사용은 후에 하는 걸로 하고

 

지금은 spigot에서 기본적으로 지원하는 걸로만 제작할 예정입니다.


기본적으로 인벤토리를 만든다는 뜻은 마크 상에서 창고를 여는 것과 같은 개념입니다.

 

우리가 플러그인으로 아이템들을 넣은 상자를 가상으로 만들고 그걸 유저에게 보여주는 거죠.

 

당연하게도 크기는 큰 상자(두 개 연결한 상자)에서 못 벗어납니다.

 

GUI를 만들려면 당연히 아이콘 역할을 하는 아이템을 인벤토리에 넣어줘야 합니다.

 

그때 위치를 정해야 하는데 이건 왼쪽 맨 위부터 0 1 2 3 4 5 6 7 8 로 진행됩니다.

 

당연하게도 다음 줄은 9 10 11 12 13 14 15 16 17 이고

 

마지막 줄은 45 46 47 48 49 50 51 52 53 입니다.

 


이제 클래스를 만들어봅시다.

명령어 때와 마찬가지로 간단히 구분하기 위해 하나의 인벤토리에 하나의 클래스를 사용하는 걸로 하겠습니다.

 

TestGUI.java

package io.github.zepelown.testplugin.inventory;

import io.github.zepelown.testplugin.ItemManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory;

public class TestGUI implements Listener {
    private final Inventory inv;

    private void initItemSetting() {
        inv.setItem(0,ItemManager.dia);
    }

    public TestGUI() {
        this.inv = Bukkit.createInventory(null,9,"TESTGUI");
        initItemSetting();
    }

    public void open(Player player){
        player.openInventory(inv);
    }

}

위 형태가 기본적으로 필요한 요소만 딱 넣은 인벤토리 형태입니다.

 

여기서 중요하게 봐야 하는 건

private final Inventory inv;

 

 

public TestGUI() {
    this.inv = Bukkit.createInventory(null,9,"TESTGUI");
    initItemSetting();
}

입니다.

 

이 inv 라는 인스턴스가 주인공입니다.

 

여기에 살을 붙인다고 생각하시면 됩니다.

 

그 살이 바로

public TestGUI() {
    this.inv = Bukkit.createInventory(null,9,"TESTGUI");
    initItemSetting();
}

생성자로 만든 겁니다.

 

this.inv = Bukkit.createInventory(null,9,"TESTGUI");

Bukkit.createInventory("주인",전체인벤토리슬롯수,"인벤토리이름") 으로 주인은 null 설정하시는 게 맞습니다.

 

슬롯수와 이름은 원하시는 대로 하셔도 무방합니다만 전 위와 같이 작성하였습니다 ㅎㅎ

 

그리고 인벤토리에 들어갈 아이콘 역할을 할 아이템을 설정해주는 메서드가 바로

private void initItemSetting() {
    inv.setItem(0,ItemManager.dia);
}

가 되는 겁니다.

 

여기선 0번째 즉 왼쪽 맨 위 칸에 이전에 만든 다이아를 넣은 상황입니다.

 

public void open(Player player){
    player.openInventory(inv);
}

마지막으로 인벤토리를 열어주는 메서드입니다.

 

한번 이대로 실행시켜보겠습니다만

 

어떻게 인벤토리를 여는 게 좋을까요?

 

당연히 많은 방식이 존재하지만 전 가장 쉽게 명령어로 처리해보았습니다.

 

이전 강좌에서 설명한 내용이니 빠르게 넘어가 보겠습니다.

 

OpenInv.java

package io.github.zepelown.testplugin.commands;

import io.github.zepelown.testplugin.inventory.TestGUI;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class OpenInv implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(sender instanceof Player){
            Player player = (Player) sender;
            TestGUI inv = new TestGUI();
            inv.open(player);
        }
        return false;
    }
}

TestPlugin.java

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

plugin.yml

name: TestPlugin
version: '${project.version}'
main: io.github.zepelown.testplugin.TestPlugin
api-version: 1.19
commands:
  thelp:
    description: help command
    aliases:
      - thelp2
  tgivedia:
    description: givedia
  topeninv:
    description: open gui

 


정상적으로 9칸이 완성되었고, 인벤토리 이름도 TESTGUI로 잘 만들어진 것을 확인할 수 있습니다

 

근데 위에서 왜 템이 가져가질까요?

 

바로 첫 부분에서 설명했다시피 하나의 창고를 만드는 것이기 때문에 저대로만 하면 창고에서 다이아 꺼내는 것처럼

 

유저가 가져갈 수가 있습니다.

 

이 문제를 해결하기 위해 우린 강좌 3편에서 나온 이벤트를 관리하는 리스너를 사용할 겁니다.

 

바로 InventoryClickEvent를 말이죠.

https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/inventory/InventoryClickEvent.html

 

InventoryClickEvent (Spigot-API 1.19.2-R0.1-SNAPSHOT API)

All Implemented Interfaces: Cancellable Direct Known Subclasses: CraftItemEvent, InventoryCreativeEvent, SmithItemEvent This event is called when a player clicks in an inventory. Because InventoryClickEvent occurs within a modification of the Inventory, no

hub.spigotmc.org

 

다음 편에서 구현해보겠습니다.

댓글