Compy's Blog
611 words
3 minutes
[Minecraft] 인벤토리 관리
2024-10-07
이 포스트에서는

JAVA 언어에 대한 기본적인 이해와 OOP를 코드에 적용할 수 있는 정도의 실력이 기본적으로 요구됩니다.

인벤토리를 효율적으로 기능을 넣고, 관리하는 것은 OOP를 이용하면 정말 쉽게 이용할 수 있어요..

Interface#

public interface InventoryHandler {
    void onClick(InventoryClickEvent event);
    void onOpen(InventoryOpenEvent event);
    boolean onClose(InventoryCloseEvent event);
}

이렇게 인터페이스를 정의합니다. 우리는 요 친구를 인벤토리 핸들러라고 얘기를 할 것이구요

함수 onClick, onOpen, onClose의 반환값은 자신이 알아서 뭐 설계하여도 됩니다..

지금 사용되는 코드는 제가 상점 구현할 때 쓰던 코드를 그대로 가져온 거라서 알아서 가공해서 쓰시면 될 것 같구요.

Manager#

public class InventoryManager {

    public static InventoryManager manager;

    private final Map<Inventory, InventoryHandler> inventories;

    public InventoryManager() {
        if(manager == null) manager = this;
        inventories = new HashMap<>();
    }

    public void RegisterInventory(Inventory inventory, InventoryHandler handler){
        this.inventories.put(inventory, handler);
    }

    public void UnRegisterInventory(Inventory inventory){
        this.inventories.remove(inventory);
    }

    public void HandleClick(InventoryClickEvent event){
        final InventoryHandler handler = this.inventories.get(event.getInventory());
        if(handler == null) return;
        handler.onClick(event);
    }

    public void HandleOpen(InventoryOpenEvent event){
        final InventoryHandler handler = this.inventories.get(event.getInventory());
        if(handler == null) return;
        handler.onOpen(event);
    }

    public void HandleClose(InventoryCloseEvent event){
        final Inventory inventory = event.getInventory();
        final InventoryHandler handler = this.inventories.get(inventory);
        if(handler == null) return;
        if(handler.onClose(event)) this.inventories.remove(inventory);
    }
}

이렇게 메니저를 선언해서 관리하도록 합니다.

이러면 메모리 관리 측면에서 전체적으로 관리하기 편하구요. 혹시나 어떤 경우에 대해서 핸들링하기 편합니다.

이렇게 쓰는게 보통적으로 쓰는 기본적인 형태인 것 같아요.

Listener#

public class InventoryListener implements Listener {

    private final InventoryManager inventoryManager;
    public InventoryListener(){
        this(new InventoryManager());
    }

    public InventoryListener(InventoryManager manager){
        this.inventoryManager = manager;
    }

    @EventHandler
    public void onInventoryOpen(InventoryOpenEvent event){
        this.inventoryManager.HandleOpen(event);
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event){
        this.inventoryManager.HandleClick(event);
    }

    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event){
        this.inventoryManager.HandleClose(event);
    }
}

이렇게 기본형으로 쓰다가 또 필요하면 수정하면 되구요. 사실 여기는 딱히 건들일 곳이 없긴 합니다.




갑자기 JAVA를 올린 이유는 아니 Bukkit을 올린 이유는.. 보통 코딩을 마인크래프트로 입문을 많이 하더라구요 그래서 입문자용으로 몇개의 활용성있는 방법들과 구현할만한 것들을 공유해드리려고 합니다. 이제부터 천천히 (스케줄링, 핸들링, 이펙트, 스킬, 패킷 관리, 모드-플러그인 통신 등)을 다룰 예정입니다.

모두 재미있는 개발하세용!!

[Minecraft] 인벤토리 관리
https://compy07.github.io/Blog/posts/development/bukkit/inventorymanagement/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2024-10-07