#마크 기본 모루 인벤토리가 아닌,만들어낸 모루 인벤토리에서 모루 기능 구현

1 messages · Page 1 of 1 (latest)

wheat flame
#

제가 플러그인에서 만들어낸 모루 인벤토리를 통해
아이템의 이름을 바꾼 뒤 그 아이템의 이름을 가져오는
작업을 수행하려고 합니다.

하지만 Bukkit.createInventory(holder, InventoryType.ANVIL);
를 통해 만들어낸 모루 인벤토리는
아이템을 넣고 이름을 바꾼 뒤 결과칸을 누르면 결과칸에 있던
아이템이 사라지며 바꾼 이름도 초기화됩니다.

다른 빈 칸을 누르면 아이템이 초기화되지는 않기에
혹시나 해서 이름을 바꾼 뒤 다른 칸을 눌렀을때
결과 칸에 있는 아이템을 가져오는 메시지를 띄워봤지만
역시나 null로 뜨는걸 봐서는..
그냥 아이템 자체가 결과칸에 세팅되지 않은 판정인 것 같습니다.

또 한 InventoryClickEvent에서
Rename 값을 받아오기 위해 AnvilInventory로 캐스팅하자니

createInventory로 만든 인벤토리는
CraftInventoryCustom 이고
마크의 모루 인벤토리는
CraftInventoryAnvil 이라
당연히 캐스팅도 안됩니다.

PrepareAnvilEvent 도 시도해봤지만
이것 또한 마크의 기본 모루(CraftInventoryAnvil)에서만 작동하며
따로 만들어준 모루 인벤토리에선 작동하지 않습니다.

모루와 관련된 모든 상호작용이
CraftInventoryAnvil에서만 작동하는거같은데

제가 따로 만든 모루 인벤토리에서
모루 상호작용이 일어나게끔 구현이 불가능한걸까요?
정확히는 아이템의 바꾼 이름 값만 가져올 수 있으면 됩니다.

wheat flame
#

nms로 해결해야하는군요.

gloomy willow
#

그렇긴 하져

wheat flame
#

https://www.spigotmc.org/threads/anvil-gui.623075/

해당 링크에 작성되있는걸 참고하여

val nmsPlayer = (event.player as CraftPlayer).handle

val containerId = nmsPlayer.nextContainerCounter()
val nmsAnvilMenu = AnvilMenu(containerId, nmsPlayer.inventory)

nmsPlayer.connection.send(
    ClientboundOpenScreenPacket(
        nmsAnvilMenu.containerId,
        nmsAnvilMenu.type,
        Component.literal("My custom GUI")
    )
)

nmsPlayer.initMenu(nmsAnvilMenu)

val nmsItemStack = net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.NAME_TAG)

nmsItemStack.hoverName = Component.literal("My text")

nmsAnvilMenu.getSlot(0).set(nmsItemStack)

이 코틀린 코드를

Player p = e.getPlayer();

ServerPlayer sp = ((CraftPlayer) p).getHandle();
int containerID = sp.nextContainerCounter();
AnvilMenu menu = new AnvilMenu(containerID, sp.getInventory());

sp.connection.send(new ClientboundOpenScreenPacket(containerID, menu.getType(),
Component.literal("CUSTOM GUI")));
sp.initMenu(menu);

ItemStack nmsIs = new ItemStack(Items.NAME_TAG);
nmsIs.setHoverName(Component.literal("TEXT"));
menu.getSlot(0).set(nmsIs);

이렇게 자바 코드로 써주었는데

net.minecraft.network.chat 패키지의 Component 인터페이스가
NoClassDefFoundError를 일으킵니다.
[ 오류 원문 : InvalidPluginException: java.lang.NoClassDefFoundError: net/minecraft/network/chat/Component ]

마인크래프트 버전은 1.20.4 이며
https://blog.jeff-media.com/nms-use-mojang-mappings-for-your-spigot-plugins/
NMS는 위 링크에 있는 내용대로 BuildTools를 통해 1.20.4 스피곳(모장매핑)을 가져왔고
Maven을 사용중이라 pom.xml에 설정해주었습니다.

도대체 뭐가 문제일까요?

If you need to access NMS classes from inside your Spigot plugin, it is a very good idea to use the so called Mojang mappings. Disclaimer: This post is written for 1.20.4. If you use another version, you of course have to replace every occurance of “1.20.4” with the version you actually use. What are...

wheat flame
#

페이퍼입니다.

wheat flame
#

paperweight를 이용하여 gradle로 해봐도,
리플렉션을 통해 클래스를 가져와보는 방식을 해봐도
결국 NoClassDefFoundError or ClassNotFoundException이 뜨네요..

모장 매핑된 spigot 컴파일 자체가 잘못됐나 싶어서
메이븐 로컬 저장소에 org\spigotmc 폴더를 확인해봤지만..
파일은 멀쩡하게 존재합니다.

무언가 놓친게 있는건지.. 뭐가 문제일까요..