bukkit
एनएमएस
खोज…
परिचय
एनएमएस, जिसे एन एट के रूप में भी जाना जाता है। एम इनक्राफ्ट। S erver वह पैकेज है जिसमें कोर Minecraft सर्वर कोड होता है। इस पैकेज में कक्षाएं Mojang (बुककिट नहीं) द्वारा बनाई गई थीं और इसलिए ज्यादातर मोटे हैं और इसका उपयोग या परिवर्तित होने का मतलब नहीं है। हालाँकि, इस स्तर पर Minecraft सर्वर कोड के साथ बातचीत करने से आप इसके लगभग हर पहलू को संशोधित कर सकते हैं। यह महत्वपूर्ण है क्योंकि ऐसे कई संशोधन हैं जो बुककिट का समर्थन नहीं करता है।
टिप्पणियों
बुककैट एपीआई एनएमएस के लिए एक आवरण या अमूर्त परत है जो प्लगइन डेवलपर्स को आंतरिक कोडबेस में किए गए परिवर्तनों के बारे में चिंता किए बिना सर्वर के साथ बातचीत करने की अनुमति देता है।
NMS कोड का उपयोग हतोत्साहित किया जाता है क्योंकि यह Minecraft संस्करण परिवर्तनों के बीच अक्सर टूट जाता है और इसे बुक्किट या स्पिगोट द्वारा समर्थित नहीं किया जा सकता है क्योंकि वे इसे बनाते, बनाते या बनाए नहीं रखते हैं।
वर्तमान Minecraft संस्करण तक पहुँचना
एनएमएस कोड से निपटने के सबसे महत्वपूर्ण भागों में से एक म्यूलिटिक माइनक्राफ्ट संस्करणों का समर्थन करने में सक्षम है। ऐसा करने के कई तरीके हैं, लेकिन एक साधारण समाधान इस कोड का उपयोग संस्करण को सार्वजनिक स्थैतिक क्षेत्र के रूप में संग्रहीत करने के लिए किया जाता है:
public static final String NMS_VERSION = Bukkit.getServer().getClass().getPackage().getName().substring(23);
यह कोड स्निपेट क्राफ्टसर्वर वर्ग को ले कर काम करता है:
org.bukkit.craftbukkit.VERSION.CraftServer.class
इसका पैकेज प्राप्त करना:
org.bukkit.craftbukkit.VERSION
और 23 इंडेक्स पर शुरू होने वाले पैकेज नाम का विकल्प लेना जो हमेशा 'org.bukkit.craftbukkit' के बाद होगा। (जिसकी लंबाई 23 वर्ण है)। अंतिम संस्करण स्ट्रिंग में परिणाम:
VERSION
कई कारण हैं कि वर्तमान Minecraft संस्करण का उपयोग करने में सक्षम होना इतना महत्वपूर्ण है। ज्यादातर इसलिए कि प्लगइन पर कोडिंग के बजाय एक अलग Minecraft संस्करण चलाने वाले सर्वर पर किसी भी वर्ग की पहुंच किसी त्रुटि को फेंक देगी।
यहाँ एक उदाहरण है कि किसी भी Minecraft संस्करण पर क्राफ्टप्लेयर (जो एक NMS वर्ग है) का एक उदाहरण प्राप्त करने के लिए NMS_VERSION
फ़ील्ड का उपयोग करके उस समस्या को हल करने के तरीके को प्रदर्शित करता है।
/**
* Invokes the getHandle() method on the player's CraftPlayer instance to
* retrieve the EntityPlayer representation of the player as an Object to
* avoid package version change issues
*
* @param player
* the player to cast
* @return the NMS EnityPlayer representation of the player
*/
public static Object getCraftPlayer(Player player) {
try {
return Class.forName("org.bukkit.craftbukkit." + NMS_VERSION + ".entity.CraftPlayer")
.getMethod("getHandle")
.invoke(player);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | ClassNotFoundException e) {
throw new Error(e);
}
}
परिणामी वस्तु को वर्ग के गलत संस्करण तक पहुंचने की कोशिश किए बिना एनएमएस आधारित कार्यों को करने के लिए प्रतिबिंब का उपयोग करके हेरफेर किया जा सकता है।
हालांकि, यह विधि मूर्खतापूर्ण नहीं है, क्योंकि एनएमएस फ़ील्ड और विधि के नाम आसानी से बदल जाते हैं, इसलिए केवल एक चीज जो आप यह कर रहे हैं गारंटी है कि आपका कोड निश्चित रूप से हर बार Minecraft अपडेट को तोड़ देगा।
एक खिलाड़ी की पिंग हो रही है
एक बहुत ही साधारण बात जो आप एनएमएस के साथ करना चाहते हैं, जो बुक्किट का समर्थन नहीं करता है, खिलाड़ी का पिंग है। इसे इस तरह किया जा सकता है:
/**
* Gets the players ping by using NMS to access the internal 'ping' field in
* EntityPlayer
*
* @param player
* the player whose ping to get
* @return the player's ping
*/
public static int getPing(Player player) {
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
return entityPlayer.ping;
}
यदि आप getCraftPlayer (प्लेयर) जैसी विधि का उपयोग कर रहे हैं, जो प्लेयर के संबंधित क्राफ्टपैलयर के उदाहरण को एक वस्तु के रूप में लौटाता है। आप इस तरह के प्रतिबिंब का उपयोग करके संस्करण निर्भर वर्गों के आयात के बिना डेटा का उपयोग कर सकते हैं:
/**
* Gets the player's ping using reflection to avoid breaking on a Minecraft
* update
*
* @param player
* the player whose ping to get
* @return the player's ping
*/
public static int getPing(Player player) {
try {
Object craftPlayer = getCraftPlayer(player);
return (int) craftPlayer.getClass().getField("ping").get(craftPlayer);
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
throw new Error(e);
}
}