Skip to content

Commit d1b67bf

Browse files
committed
API methods PacketHandler#of
PacketEvents support
1 parent eef59fa commit d1b67bf

File tree

12 files changed

+352
-103
lines changed

12 files changed

+352
-103
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ allprojects {
1212
apply(plugin = "com.gradleup.shadow")
1313

1414
group = "me.outspending.biomesapi"
15-
version = "0.0.18"
15+
version = "0.0.19"
1616

1717
tasks.withType<JavaCompile> {
1818
options.encoding = "UTF-8"

main/src/main/java/me/outspending/biomesapi/annotations/AsOf.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package me.outspending.biomesapi.annotations;
22

3+
import org.jetbrains.annotations.ApiStatus;
4+
35
import java.lang.annotation.ElementType;
46
import java.lang.annotation.Retention;
57
import java.lang.annotation.RetentionPolicy;
@@ -21,6 +23,7 @@
2123
*
2224
* In the above example, the {@code someApiMethod} method has been present or modified since version 1.0.
2325
*/
26+
@ApiStatus.Internal
2427
@Retention(RetentionPolicy.RUNTIME)
2528
@Target({
2629
ElementType.METHOD,

main/src/main/java/me/outspending/biomesapi/annotations/Experimental.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package me.outspending.biomesapi.annotations;
22

3+
import org.jetbrains.annotations.ApiStatus;
4+
35
import java.lang.annotation.ElementType;
46
import java.lang.annotation.Retention;
57
import java.lang.annotation.RetentionPolicy;
@@ -11,7 +13,12 @@
1113
* This annotation can be applied to methods, types, constructors, modules, and packages.
1214
*
1315
* @version 0.0.1
16+
* @since 0.0.1
17+
* @author Outspending
18+
* @deprecated Use {@link org.jetbrains.annotations.ApiStatus.Experimental} instead
1419
*/
20+
@ApiStatus.Internal
21+
@Deprecated(since = "0.0.19", forRemoval = true)
1522
@Retention(RetentionPolicy.RUNTIME)
1623
@Target({
1724
ElementType.METHOD,

main/src/main/java/me/outspending/biomesapi/exceptions/MissingPacketLibraryException.java

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package me.outspending.biomesapi.exceptions;
2+
3+
import me.outspending.biomesapi.annotations.AsOf;
4+
5+
/**
6+
* Exception thrown when the required packet library is missing.
7+
*
8+
* @version 0.0.19
9+
* @since 0.0.6
10+
* @author Jsinco
11+
*/
12+
@AsOf("0.0.6")
13+
public class MissingPacketManipulatorLibraryException extends RuntimeException {
14+
15+
@AsOf("0.0.19")
16+
public MissingPacketManipulatorLibraryException(String message) {
17+
super(message);
18+
}
19+
20+
@AsOf("0.0.6")
21+
public MissingPacketManipulatorLibraryException(String message, Throwable cause) {
22+
super(message, cause);
23+
}
24+
}

main/src/main/java/me/outspending/biomesapi/packet/PacketHandler.java

Lines changed: 84 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package me.outspending.biomesapi.packet;
22

33
import me.outspending.biomesapi.annotations.AsOf;
4-
import me.outspending.biomesapi.exceptions.MissingPacketLibraryException;
4+
import me.outspending.biomesapi.exceptions.MissingPacketManipulatorLibraryException;
55
import me.outspending.biomesapi.packet.data.PhonyCustomBiome;
6+
import me.outspending.biomesapi.packet.handlers.PacketEventsPacketHandler;
67
import me.outspending.biomesapi.packet.handlers.ProtocolLibPacketHandler;
78
import me.outspending.biomesapi.registry.BiomeResourceKey;
89
import org.bukkit.World;
@@ -19,13 +20,12 @@
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")
2929
public 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
}

main/src/main/java/me/outspending/biomesapi/packet/PhonyCustomBiomeCollector.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
* @since 0.0.6
2222
* @author Jsinco
2323
*/
24-
@me.outspending.biomesapi.annotations.Experimental
2524
@ApiStatus.Experimental
2625
@AsOf("0.0.6")
2726
public class PhonyCustomBiomeCollector {

main/src/main/java/me/outspending/biomesapi/packet/handlers/PacketHandlerHelper.java renamed to main/src/main/java/me/outspending/biomesapi/packet/handlers/NativeMinecraftPacketHandlerHelper.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,23 @@
1919
import org.bukkit.craftbukkit.CraftServer;
2020
import org.bukkit.craftbukkit.block.CraftBiome;
2121
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
22+
import org.jetbrains.annotations.ApiStatus;
2223
import org.jetbrains.annotations.NotNull;
2324

2425
import java.lang.reflect.Field;
2526

2627
/**
2728
* Internal helper class for packet handling related to chunk data and biome modification.
2829
*
29-
* @version 0.0.6
30+
* @version 0.0.19
3031
* @since 0.0.6
3132
* @author Jsinco
3233
*/
33-
@AsOf("0.0.6")
34-
class PacketHandlerHelper {
34+
@AsOf("0.0.19")
35+
@ApiStatus.Internal
36+
class NativeMinecraftPacketHandlerHelper {
3537

36-
static PacketHandlerHelper INSTANCE = new PacketHandlerHelper();
38+
static NativeMinecraftPacketHandlerHelper INSTANCE = new NativeMinecraftPacketHandlerHelper();
3739

3840
static int CHUNK_SECTION_SIZE = 16; // Each chunk section is 16x16x16 blocks
3941
static int CHUNK_SECTIONS = 4; // Each chunk section has 4x4x4 = 64 biome entries

0 commit comments

Comments
 (0)