Anvilgui เป็นไลบรารีเพื่อจับการป้อนข้อมูลผู้ใช้ใน Minecraft ผ่านรายการ Anvil สินค้าคงคลังทั่งภายในขอบเขตของ Minecraft / Bukkit / Spigot / Paper API นั้นเป็นสิ่งที่ดีมากและในที่สุดก็ไม่สนับสนุนความสามารถในการใช้งานอย่างเต็มที่สำหรับงานอินพุตของผู้ใช้ เป็นผลให้วิธีเดียวที่จะบรรลุการป้อนข้อมูลผู้ใช้ด้วยคลังทั่งต้องมีการโต้ตอบกับโค้ดที่ทำให้งงงวยและสลายตัว Anvilgui ให้บริการโซลูชันที่ตรงไปตรงมาอเนกประสงค์และใช้งานง่ายโดยไม่ต้องมีโครงการของคุณขึ้นอยู่กับรหัสเฉพาะเวอร์ชัน
คุณต้องใช้การแมป Spigot เพื่อให้ Anvilgui ทำงานได้ แต่คุณจะแน่ใจได้อย่างไรว่าคุณเป็น คำถามด้านล่างจะช่วยให้คุณล้างสิ่งต่าง ๆ
ปลั๊กอินของคุณเป็นปลั๊กอิน Bukkit หรือไม่? ปลั๊กอินของคุณเป็นปลั๊กอิน bukkit หากมีไฟล์ plugin.yml
และ ไม่มี ไฟล์ paper-plugin.yml
ในกรณีนั้นโดยค่าเริ่มต้นคุณกำลังใช้การแมป Spigot
ปลั๊กอินของคุณเป็นปลั๊กอินกระดาษหรือไม่? ปลั๊กอินของคุณเป็นปลั๊กอินกระดาษเสมอหากมีไฟล์ paper-plugin.yml
แม้ว่ามันจะมีไฟล์ plugin.yml
ในกรณีนั้นโดยค่าเริ่มต้นคุณ ไม่ได้ ใช้การแมป Spigot แต่สามารถเปิดใช้งานได้ผ่านรายการรายการตามคำแนะนำเหล่านี้
คุณใช้เครื่องมือ UserDev ที่มีน้ำหนักมากหรือไม่? ในกรณีนั้นโดยค่าเริ่มต้นคุณ ไม่ได้ ใช้การแมป Spigot แต่สามารถเปิดใช้งานได้โดยใช้ตัวเลือก ReobFartifactConfiguration
หากคุณเป็นนักพัฒนาให้ส่งคำขอดึงเพิ่มโมดูล wrapper สำหรับเวอร์ชันของคุณ มิฉะนั้นโปรดสร้างปัญหาเกี่ยวกับแท็บปัญหา
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
S ออกจากขวดสุดท้ายและทำให้ห้องสมุดใช้ไม่ได้ตรวจสอบให้แน่ใจว่าส่วน <filters>
ของคุณมีตัวอย่าง <filter>
ตามที่เห็นด้านบน
คลาส AnvilGUI.Builder
เป็นวิธีที่คุณสร้าง Anvilgui วิธีการต่อไปนี้ช่วยให้คุณสามารถปรับเปลี่ยนส่วนต่าง ๆ ของ GUI ที่แสดง Javadocs มีให้ที่นี่
onClose(Consumer<StateSnapshot>)
ใช้อาร์กิวเมนต์ Consumer<StateSnapshot>
ที่เรียกว่าเมื่อผู้เล่นปิด Anvil GUI
builder . onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
});
onClick(BiFunction<Integer, AnvilGUI.StateSnapshot, AnvilGUI.ResponseAction>)
ใช้ BiFunction
กับสล็อตที่คลิกและภาพรวมของสถานะ GUI ปัจจุบัน ฟังก์ชั่นนี้เรียกว่าเมื่อผู้เล่นคลิกสล็อตใด ๆ ในสินค้าคงคลัง คุณต้องส่งคืน 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 ปิดการใช้งานกลไกที่วางไว้เพื่อป้องกันการดำเนินการพร้อมกันของ Handler Click ที่กำหนดโดย onClickAsync(ClickHandler)
builder . allowConcurrentClickHandlerExecution ();
interactableSlots(int... slots)
สิ่งนี้ช่วยให้หรือปฏิเสธผู้ใช้สามารถรับ / ป้อนรายการในสล็อตทั่งที่มีให้ คุณสมบัตินี้มีประโยชน์เมื่อคุณพยายามสร้างระบบการป้อนข้อมูลโดยใช้ Anvil GUI
builder . interactableSlots ( Slot . INPUT_LEFT , Slot . INPUT_RIGHT );
preventClose()
บอก Anvilgui เพื่อป้องกันไม่ให้ผู้ใช้กดหลบหนีเพื่อปิดสินค้าคงคลัง มีประโยชน์สำหรับสถานการณ์เช่นการป้อนรหัสผ่านเพื่อเล่น
builder . preventClose ();
geyserCompat()
การสลับเข้ากันได้กับซอฟต์แวร์ Geyser โดยเฉพาะการใช้ Anvilgui กับระดับประสบการณ์ 0 ระดับบนพื้นหิน เปิดใช้งานโดยค่าเริ่มต้น
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)
ใช้ String
ที่มีส่วนประกอบข้อความที่หลากหลายเป็นแบบอนุกรมเป็น JSON มีประโยชน์สำหรับการตั้งค่าชื่อด้วยรหัสสีฐานสิบหกหรือส่วนประกอบการผจญภัยระหว่างกัน แสดงเฉพาะใน Minecraft 1.14 ขึ้นไป
builder . jsonTitle ( "{ " text " : " Enter your answer " , " color " : " green " }" )
plugin(Plugin)
ใช้วัตถุ Plugin
ที่ทำให้ทั่ง GUI นี้ จำเป็นต้องลงทะเบียนผู้ฟัง
builder . plugin ( pluginInstance );
mainThreadExecutor(Executor)
ใช้ Executor
ที่ต้องดำเนินการบนเธรดเซิร์ฟเวอร์หลัก หากเธรดเซิร์ฟเวอร์หลักไม่สามารถเข้าถึงได้ผ่าน Bukkit Scheduler เช่นเดียวกับบนเซิร์ฟเวอร์ Folia ก็สามารถเปลี่ยนเป็นผู้ดำเนินการ Folia Aware ได้
builder . mainThreadExecutor ( executor );
open(Player)
ใช้ Player
ที่ควรเปิด Anvil GUI วิธีนี้สามารถเรียกได้หลายครั้งโดยไม่จำเป็นต้องสร้างวัตถุ 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 เพื่อจัดการกับการพึ่งพาของเรา เรียกใช้ mvn clean install
โดยใช้ Java 21 เพื่อสร้างโครงการ
โครงการใช้ปลั๊กอิน Maven ที่ไร้ที่ติเพื่อบังคับใช้แนวทางสไตล์ คุณจะไม่สามารถสร้างโครงการได้หากรหัสของคุณไม่เป็นไปตามแนวทาง ในการแก้ไขปัญหาการจัดรูปแบบรหัสทั้งหมดเพียงเรียกใช้ mvn spotless:apply
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT