Anvilgui는 Anvil 인벤토리를 통해 마인 크래프트에서 사용자 입력을 캡처하는 라이브러리입니다. Minecraft / Bukkit / Spigot / Paper API의 영역 내의 모루 인벤토리는 극도로 지정되어 있으며 궁극적으로 사용자 입력 작업에 완전히 사용할 수있는 능력을 지원하지 않습니다. 결과적으로 모루 인벤토리를 사용하여 사용자 입력을 달성하는 유일한 방법은 난독 화 된 디렉팅 된 코드와의 상호 작용이 필요합니다. Anvilgui는 프로젝트가 버전 특정 코드에 의존하지 않고 간단하고 다양하며 사용하기 쉬운 솔루션을 제공합니다.
Anvilgui가 작동하려면 Spigot Mapping을 사용해야하지만 어떻게 확신 할 수 있습니까? 아래 질문은 상황을 해결하는 데 도움이됩니다.
플러그인이 Bukkit 플러그인입니까? 플러그인. plugin.yml
파일이 포함되어 있고 paper-plugin.yml
파일이 포함되어 있지 않은 경우 플러그인은 bukkit 플러그인입니다. 이 경우 기본적으로 Spigot Mapping을 사용하고 있습니다.
플러그인이 종이 플러그인입니까? plugin.yml
파일이 포함되어 있어도 paper-plugin.yml
파일이 포함 된 경우 플러그인은 항상 종이 플러그인입니다. 이 경우 기본적으로 Spigot Mapping을 사용 하지는 않지만 이러한 지침에 따라 매니페스트 항목을 통해이를 활성화 할 수 있습니다.
Paperweight userDev 도구 체인을 사용하고 있습니까? 이 경우 기본적으로 Spigot Mapping을 사용 하지는 않지만 ReobfartifactConfiguration 옵션을 사용하여 사용할 수 있습니다.
개발자 인 경우 버전에 래퍼 모듈을 추가하는 풀 요청을 제출하십시오. 그렇지 않으면 문제 탭에서 문제를 만듭니다.
Anvilgui는 Maven 또는 Maven 호환 빌드 시스템을 사용해야합니다.
< dependency >
< groupId >net.wesjd</ groupId >
< artifactId >anvilgui</ artifactId >
< version >1.10.3-SNAPSHOT</ version >
</ dependency >
< repository >
< id >codemc-snapshots</ id >
< url >https://repo.codemc.io/repository/maven-snapshots/</ url >
</ repository >
다른 플러그인과의 충돌을 방지하기 위해 좋은 시민이되고 네임 스페이스 내로 의존성을 이전하는 것이 가장 좋습니다. 다음은 종속성을 재배치하는 방법의 예입니다.
< build >
< plugins >
< plugin >
< groupId >org.apache.maven.plugins</ groupId >
< artifactId >maven-shade-plugin</ artifactId >
< version >${shade.version}</ version > <!-- The version must be at least 3.5.0 -->
< executions >
< execution >
< phase >package</ phase >
< goals >
< goal >shade</ goal >
</ goals >
< configuration >
< relocations >
< relocation >
< pattern >net.wesjd.anvilgui</ pattern >
< shadedPattern >[YOUR_PLUGIN_PACKAGE].anvilgui</ shadedPattern > <!-- Replace [YOUR_PLUGIN_PACKAGE] with your namespace -->
</ relocation >
</ relocations >
< filters >
< filter >
< artifact >*:*</ artifact >
< excludeDefaults >false</ excludeDefaults >
< includes >
< include >net/wesjd/anvilgui/**</ include >
</ includes >
</ filter >
</ filters >
</ configuration >
</ execution >
</ executions >
</ plugin >
</ plugins >
</ build >
참고 : <minimizeJar>
최종 병에서 anvilgui VerionWrapper
를 제거하고 라이브러리를 사용할 수 없도록하려면 <filters>
섹션에 위에서 볼 수 있듯이 <filter> 섹션에 <filter>
가 포함되어 있는지 확인하십시오.
AnvilGUI.Builder
클래스는 Anvilgui를 만드는 방법입니다. 다음 방법을 사용하면 표시된 GUI의 다양한 부분을 수정할 수 있습니다. Javadocs는 여기에서 제공됩니다.
onClose(Consumer<StateSnapshot>)
플레이어가 Anvil GUI를 닫을 때 호출되는 Consumer<StateSnapshot>
인수를 취합니다.
builder . onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
});
onClick(BiFunction<Integer, AnvilGUI.StateSnapshot, AnvilGUI.ResponseAction>)
클릭 한 슬롯과 현재 GUI 상태의 스냅 샷과 BiFunction
를합니다. 플레이어가 인벤토리에서 슬롯을 클릭하면 기능이 호출됩니다. 다음을 포함 할 수있는 List<AnvilGUI.ResponseAction>
을 반환해야합니다.
AnvilGUI.ResponseAction.close()
)AnvilGUI.ResponseAction.replaceInputText(String)
)AnvilGUI.ResponseAction.updateTitle(String, boolean)
)AnvilGUI.ResponseAction.openInventory(Inventory)
재고 개방AnvilGUI.ResponseAction.run(Runnable)
)Collections.emptyList()
)조치 목록은 제공되는 순서대로 진행됩니다.
builder . onClick (( slot , stateSnapshot ) -> {
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( stateSnapshot . getText (). equalsIgnoreCase ( "you" )) {
stateSnapshot . getPlayer (). sendMessage ( "You have magical powers!" );
return Arrays . asList (
AnvilGUI . ResponseAction . close (),
AnvilGUI . ResponseAction . run (() -> myCode ( stateSnapshot . getPlayer ()))
);
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
});
onClickAsync(ClickHandler)
ClickHandler
, BiFunction<Integer, AnvilGui.StateSnapshot, CompletableFuture<AnvilGUI.ResponseAction>>
의 속기를 취합니다. 이는 CompletableFuture
ResponseAction
반환하는 차이와 함께 onClick()
와 똑같이 동작하므로 문제가 발생합니다.
builder . onClickAsync (( slot , stateSnapshot ) -> CompletedFuture . supplyAsync (() -> {
// this code is now running async
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( database . isMagical ( stateSnapshot . getText ())) {
// the `ResponseAction`s will run on the main server thread
return Arrays . asList (
AnvilGUI . ResponseAction . close (),
AnvilGUI . ResponseAction . run (() -> myCode ( stateSnapshot . getPlayer ()))
);
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
}));
allowConcurrentClickHandlerExecution()
Anvilgui는 onClickAsync(ClickHandler)
가 설정 한 클릭 핸들러의 동시 실행을 방지하기 위해 설치된 메커니즘을 비활성화하도록 지시합니다.
builder . allowConcurrentClickHandlerExecution ();
interactableSlots(int... slots)
이를 통해 사용자는 제공되는 모루 슬롯에 항목을 가져 오거나 입력 할 수 있습니다. 이 기능은 Anvil GUI를 사용하여 입력 시스템을 만들려고 할 때 유용합니다.
builder . interactableSlots ( Slot . INPUT_LEFT , Slot . INPUT_RIGHT );
preventClose()
Anvilgui에게 사용자가 탈출을 눌러 인벤토리를 닫지 않도록 지시합니다. 비밀번호 입력과 같은 상황에 유용합니다.
builder . preventClose ();
geyserCompat()
이는 간헐천 소프트웨어와 호환성을 전환하며 특히 기반암에서 0 경험 레벨을 사용하여 Anvilgui를 사용할 수 있습니다. 기본적으로 활성화됩니다.
builder . geyserCompat ();
text(String)
이름 변경 필드의 초기 텍스트를 포함하는 String
사용합니다. itemLeft
가 제공되면 표시 이름이 제공된 텍스트로 설정됩니다. itemLeft
설정되지 않으면 종이 조각이 사용됩니다.
builder . text ( "What is the meaning of life?" );
itemLeft(ItemStack)
왼쪽 입력 슬롯에 사용자 정의 ItemStack
가져옵니다.
ItemStack stack = new ItemStack ( Material . IRON_SWORD );
ItemMeta meta = stack . getItemMeta ();
meta . setLore ( Arrays . asList ( "Sharp iron sword" ));
stack . setItemMeta ( meta );
builder . itemLeft ( stack );
itemRight(ItemStack)
올바른 입력 슬롯에 배치하려면 사용자 정의 ItemStack
가져옵니다.
ItemStack stack = new ItemStack ( Material . IRON_INGOT );
ItemMeta meta = stack . getItemMeta ();
meta . setLore ( Arrays . asList ( "A piece of metal" ));
stack . setItemMeta ( meta );
builder . itemRight ( stack );
title(String)
문자 그대로 인벤토리 제목으로 사용될 String
취합니다. Minecraft 1.14 이상에만 표시됩니다.
builder . title ( "Enter your answer" );
jsonTitle(String)
JSON으로 직렬화 된 풍부한 텍스트 구성 요소가 포함 된 String
취합니다. HEX 색상 코드 또는 모험 구성 요소 인터 로프가있는 제목을 설정하는 데 유용합니다. Minecraft 1.14 이상에만 표시됩니다.
builder . jsonTitle ( "{ " text " : " Enter your answer " , " color " : " green " }" )
plugin(Plugin)
이 Anvil Gui를 만드는 Plugin
객체를 가져옵니다. 청취자를 등록해야합니다.
builder . plugin ( pluginInstance );
mainThreadExecutor(Executor)
기본 서버 스레드에서 실행 해야하는 Executor
가져갑니다. Folia 서버에서와 같이 Bukkit 스케줄러를 통해 기본 서버 스레드에 액세스 할 수없는 경우 Folia Aware Executor로 교체 할 수 있습니다.
builder . mainThreadExecutor ( executor );
open(Player)
Anvil Gui를 열어야하는 Player
데려갑니다. 이 방법은 새로운 AnvilGUI.Builder
객체를 만들 필요없이 여러 번 호출 할 수 있습니다.
builder . open ( player );
new AnvilGUI . Builder ()
. onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
})
. onClick (( slot , stateSnapshot ) -> { // Either use sync or async variant, not both
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( stateSnapshot . getText (). equalsIgnoreCase ( "you" )) {
stateSnapshot . getPlayer (). sendMessage ( "You have magical powers!" );
return Arrays . asList ( AnvilGUI . ResponseAction . close ());
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
})
. preventClose () //prevents the inventory from being closed
. text ( "What is the meaning of life?" ) //sets the text the GUI should start with
. title ( "Enter your answer." ) //set the title of the GUI (only works in 1.14+)
. plugin ( myPluginInstance ) //set the plugin instance
. open ( myPlayer ); //opens the GUI for the player provided
우리는 Maven을 사용하여 종속성을 처리합니다. Java 21을 사용하여 mvn clean install
실행하여 프로젝트를 구축하십시오.
이 프로젝트는 Spotless Maven 플러그인을 사용하여 스타일 지침을 시행합니다. 코드가 지침을 충족하지 않으면 프로젝트를 구축 할 수 없습니다. 모든 코드 서식 문제를 해결하려면 mvn spotless:apply
.
이 프로젝트는 MIT 라이센스에 따라 라이센스가 부여됩니다.