11package me .outspending .biomesapi .packet ;
22
33import me .outspending .biomesapi .annotations .AsOf ;
4- import me .outspending .biomesapi .exceptions .MissingPacketLibraryException ;
4+ import me .outspending .biomesapi .exceptions .MissingPacketManipulatorLibraryException ;
55import me .outspending .biomesapi .packet .data .PhonyCustomBiome ;
6+ import me .outspending .biomesapi .packet .handlers .PacketEventsPacketHandler ;
67import me .outspending .biomesapi .packet .handlers .ProtocolLibPacketHandler ;
78import me .outspending .biomesapi .registry .BiomeResourceKey ;
89import org .bukkit .World ;
1920 * An external packet handling library (either ProtocolLib or PacketEvents) is required
2021 * for this interface.
2122 * </p>
22- * @version 0.0.10
23+ * @version 0.0.19
2324 * @since 0.0.6
2425 * @author Jsinco
2526 */
26- @ me .outspending .biomesapi .annotations .Experimental
2727@ ApiStatus .Experimental
28- @ AsOf ("0.0.10 " )
28+ @ AsOf ("0.0.19 " )
2929public interface PacketHandler {
3030
3131
@@ -34,25 +34,40 @@ public interface PacketHandler {
3434 * The packet listener priority defaults to NORMAL.
3535 * @param provider The plugin providing this PacketHandler
3636 * @return A new PacketHandler instance
37+ * @since 0.0.6
38+ * @throws MissingPacketManipulatorLibraryException if ProtocolLib is not installed
39+ * @deprecated use {@link #of(Plugin, Manipulator)} or {@link #of(Plugin, Manipulator, Priority)} instead
3740 */
41+ @ Deprecated (since = "0.0.19" )
3842 @ AsOf ("0.0.6" )
3943 static @ NotNull PacketHandler of (@ NotNull Plugin provider ) {
40- return of (provider , Priority .NORMAL );
44+ return of (provider , Manipulator .PROTOCOLLIB , Priority .NORMAL );
45+ }
46+
47+ /**
48+ * Creates a PacketHandler using ProtocolLib as the underlying packet manipulation library.
49+ * The packet listener priority defaults to NORMAL.
50+ * @param provider The plugin providing this PacketHandler
51+ * @return A new PacketHandler instance
52+ * @since 0.0.19
53+ * @throws MissingPacketManipulatorLibraryException if the specified manipulator library is not installed
54+ */
55+ @ AsOf ("0.0.19" )
56+ static @ NotNull PacketHandler of (@ NotNull Plugin provider , @ NotNull Manipulator manipulator ) {
57+ return of (provider , manipulator , Priority .NORMAL );
4158 }
4259
4360 /**
4461 * Creates a PacketHandler using ProtocolLib as the underlying packet manipulation library.
4562 * @param provider The plugin providing this PacketHandler
4663 * @param priority The priority of the packet listener
4764 * @return A new PacketHandler instance
65+ * @since 0.0.6
66+ * @throws MissingPacketManipulatorLibraryException if the specified manipulator library is not installed
4867 */
49- @ AsOf ("0.0.6" )
50- static @ NotNull PacketHandler of (@ NotNull Plugin provider , @ NotNull PacketHandler .Priority priority ) {
51- try {
52- return new ProtocolLibPacketHandler (provider , priority );
53- } catch (ClassNotFoundException e ) {
54- throw new MissingPacketLibraryException ("Could not find ProtocolLib classes. Please ensure ProtocolLib is installed." , e );
55- }
68+ @ AsOf ("0.0.19" )
69+ static @ NotNull PacketHandler of (@ NotNull Plugin provider , @ NotNull Manipulator manipulator , @ NotNull PacketHandler .Priority priority ) {
70+ return manipulator .create (provider , priority );
5671 }
5772
5873 /**
@@ -214,4 +229,61 @@ public int getLevel() {
214229
215230 }
216231
232+ /**
233+ * Enum constant for supported packet manipulation libraries.
234+ * @version 0.0.19
235+ * @since 0.0.19
236+ */
237+ @ AsOf ("0.0.19" )
238+ enum Manipulator {
239+ PROTOCOLLIB (
240+ "ProtocolLib" ,
241+ "com.comphenix.protocol.ProtocolLibrary" ,
242+ (provider , priority ) -> new ProtocolLibPacketHandler (provider , priority )
243+ ),
244+ PACKETEVENTS (
245+ "PacketEvents" ,
246+ "com.github.retrooper.packetevents.PacketEvents" ,
247+ (provider , priority ) -> new PacketEventsPacketHandler (priority )
248+ );
249+
250+ private final String name ;
251+ private final String owningClass ;
252+ private final PacketHandlerFactory factory ;
253+
254+ Manipulator (String name , String owningClass , PacketHandlerFactory factory ) {
255+ this .name = name ;
256+ this .owningClass = owningClass ;
257+ this .factory = factory ;
258+ }
259+
260+ public String getName () {
261+ return name ;
262+ }
263+
264+ public String getOwningClass () {
265+ return owningClass ;
266+ }
267+
268+ public boolean isAvailable () {
269+ try {
270+ Class .forName (owningClass );
271+ return true ;
272+ } catch (ClassNotFoundException e ) {
273+ return false ;
274+ }
275+ }
276+
277+ public PacketHandler create (@ NotNull Plugin provider , @ NotNull PacketHandler .Priority priority ) throws MissingPacketManipulatorLibraryException {
278+ if (!isAvailable ()) {
279+ throw new MissingPacketManipulatorLibraryException ("Could not find required classes for " + name + ". Please ensure " + name + " is installed." );
280+ }
281+ return factory .create (provider , priority );
282+ }
283+
284+ @ FunctionalInterface
285+ private interface PacketHandlerFactory {
286+ @ NotNull PacketHandler create (@ NotNull Plugin provider , @ NotNull PacketHandler .Priority priority );
287+ }
288+ }
217289}
0 commit comments