Skip to content

Commit feb0a6a

Browse files
committed
Fixes
Signed-off-by: BT (calcastor/mame) <[email protected]>
1 parent 845b740 commit feb0a6a

File tree

10 files changed

+188
-8
lines changed

10 files changed

+188
-8
lines changed

core/src/main/java/tc/oc/occ/matchshare/MatchShare.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package tc.oc.occ.matchshare;
22

3+
import java.util.logging.Level;
34
import org.bukkit.event.Listener;
45
import org.bukkit.plugin.java.JavaPlugin;
56
import tc.oc.occ.matchshare.listeners.AssistanceListener;
@@ -21,6 +22,7 @@
2122
import tc.oc.occ.matchshare.listeners.WoolDestructionListener;
2223
import tc.oc.occ.matchshare.tracker.MatchCapacityTracker;
2324
import tc.oc.occ.matchshare.tracker.MatchTimeTracker;
25+
import tc.oc.occ.matchshare.util.Platform;
2426

2527
public class MatchShare extends JavaPlugin implements Listener {
2628

@@ -32,6 +34,13 @@ public void onEnable() {
3234
this.timeTracker = new MatchTimeTracker();
3335
this.capacityTracker = new MatchCapacityTracker(this);
3436

37+
try {
38+
Platform.init();
39+
} catch (Throwable t) {
40+
getLogger().log(Level.SEVERE, "Failed to initialize MatchShare platform", t);
41+
getServer().getPluginManager().disablePlugin(this);
42+
}
43+
3544
registerEvents(new DebugListener(this));
3645
registerEvents(new PlayerMetaListener(this));
3746
registerEvents(new PlayerCombatListener(this));
@@ -56,6 +65,7 @@ public MatchTimeTracker getTimeTracker() {
5665
}
5766

5867
private void registerEvents(Listener listener) {
68+
Platform.MANIFEST.onEnable(this);
5969
getServer().getPluginManager().registerEvents(listener, this);
6070
}
6171
}

core/src/main/java/tc/oc/occ/matchshare/listeners/BlockListener.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package tc.oc.occ.matchshare.listeners;
22

3+
import static net.kyori.adventure.text.Component.text;
34
import static tc.oc.occ.matchshare.util.MiscUtils.MISC_UTILS;
45

56
import org.bukkit.Material;
@@ -10,6 +11,7 @@
1011
import org.bukkit.event.block.BlockBreakEvent;
1112
import tc.oc.occ.dispense.events.players.PGMPlayerBlockBreakEvent;
1213
import tc.oc.occ.matchshare.MatchShare;
14+
import tc.oc.pgm.util.Audience;
1315

1416
public class BlockListener extends ShareListener {
1517

@@ -24,6 +26,11 @@ public void onBlockBreak(BlockBreakEvent event) {
2426

2527
if (block == null || block.getType() == Material.AIR) return;
2628
if (player == null || !player.isOnline() || !isParticipating(player)) return;
29+
30+
Audience.get(player)
31+
.sendMessage(
32+
text(block.getType().name() + " has strength " + MISC_UTILS.getBlockStrength(block)));
33+
2734
if (MISC_UTILS.getBlockStrength(block) < 0.5) return;
2835

2936
callNewEvent(new PGMPlayerBlockBreakEvent(player, block));

core/src/main/java/tc/oc/occ/matchshare/listeners/MapListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void onMapLoad(MatchLoadEvent event) {
5050
String name = map.getName();
5151
String desc = map.getDescription();
5252
int maxPlayers = map.getMaxPlayers().stream().reduce(0, Integer::sum);
53-
String gamemode = "";
53+
String gamemode;
5454

5555
TextComponent.Builder gmc = text();
5656
Collection<Gamemode> gamemodes = map.getGamemodes();

platform/platform-modern/src/main/java/tc.oc.occ.matchshare.platform.modern/ModernMiscUtils.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package tc.oc.occ.matchshare.platform.modern;
22

3-
import static tc.oc.pgm.util.platform.Supports.Variant.PAPER;
3+
import static tc.oc.occ.matchshare.util.Supports.Variant.PAPER;
44

55
import java.time.Duration;
66
import java.util.UUID;
@@ -13,17 +13,20 @@
1313
import net.minecraft.world.entity.item.ItemEntity;
1414
import org.bukkit.Location;
1515
import org.bukkit.block.Block;
16-
import org.bukkit.craftbukkit.block.CraftBlockType;
16+
import org.bukkit.craftbukkit.block.CraftBlock;
1717
import org.bukkit.craftbukkit.entity.CraftPlayer;
1818
import org.bukkit.craftbukkit.inventory.CraftItemStack;
1919
import org.bukkit.entity.Player;
2020
import org.bukkit.inventory.ItemStack;
2121
import org.bukkit.plugin.Plugin;
2222
import tc.oc.occ.matchshare.util.MiscUtils;
23-
import tc.oc.pgm.util.platform.Supports;
23+
import tc.oc.occ.matchshare.util.Supports;
2424

2525
@Supports(value = PAPER, minVersion = "1.21.6")
2626
public class ModernMiscUtils implements MiscUtils {
27+
@Override
28+
public void dummy() {}
29+
2730
@Override
2831
public void sendPacket(Player bukkitPlayer, Object packet) {
2932
if (bukkitPlayer.isOnline()) {
@@ -94,6 +97,6 @@ public void showFakeItems(
9497

9598
@Override
9699
public float getBlockStrength(Block block) {
97-
return ((CraftBlockType<?>) block).getHardness();
100+
return ((CraftBlock) block).getNMS().destroySpeed;
98101
}
99102
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package tc.oc.occ.matchshare.platform.modern;
2+
3+
import static tc.oc.occ.matchshare.util.Supports.Priority.HIGHEST;
4+
import static tc.oc.occ.matchshare.util.Supports.Variant.PAPER;
5+
6+
import org.bukkit.plugin.Plugin;
7+
import tc.oc.occ.matchshare.util.Platform;
8+
import tc.oc.occ.matchshare.util.Supports;
9+
10+
@Supports(value = PAPER, minVersion = "1.21.11", priority = HIGHEST)
11+
public class ModernPlatform implements Platform.Manifest {
12+
@Override
13+
public void onEnable(Plugin plugin) {}
14+
}

platform/platform-sportpaper/src/main/java/tc/oc/occ/matchshare/platform/sportpaper/SpMiscUtils.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package tc.oc.occ.matchshare.platform.sportpaper;
22

3-
import static tc.oc.pgm.util.platform.Supports.Variant.SPORTPAPER;
3+
import static tc.oc.occ.matchshare.util.Supports.Variant.SPORTPAPER;
44

55
import java.time.Duration;
66
import java.util.UUID;
@@ -19,7 +19,7 @@
1919
import org.bukkit.inventory.ItemStack;
2020
import org.bukkit.plugin.Plugin;
2121
import tc.oc.occ.matchshare.util.MiscUtils;
22-
import tc.oc.pgm.util.platform.Supports;
22+
import tc.oc.occ.matchshare.util.Supports;
2323

2424
/**
2525
* Took some stuff from
@@ -28,6 +28,9 @@
2828
*/
2929
@Supports(SPORTPAPER)
3030
public class SpMiscUtils implements MiscUtils {
31+
@Override
32+
public void dummy() {}
33+
3134
@Override
3235
public void sendPacket(Player bukkitPlayer, Object packet) {
3336
if (bukkitPlayer.isOnline()) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package tc.oc.occ.matchshare.platform.sportpaper;
2+
3+
import static tc.oc.occ.matchshare.util.Supports.Priority.HIGHEST;
4+
import static tc.oc.occ.matchshare.util.Supports.Variant.SPORTPAPER;
5+
6+
import org.bukkit.plugin.Plugin;
7+
import tc.oc.occ.matchshare.util.Platform;
8+
import tc.oc.occ.matchshare.util.Supports;
9+
10+
@Supports(value = SPORTPAPER, priority = HIGHEST)
11+
public class SpPlatform implements Platform.Manifest {
12+
@Override
13+
public void onEnable(Plugin plugin) {}
14+
}

util/src/main/java/tc/oc/occ/matchshare/util/MiscUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.bukkit.entity.Player;
99
import org.bukkit.inventory.ItemStack;
1010
import org.bukkit.plugin.Plugin;
11-
import tc.oc.pgm.util.platform.Platform;
1211

1312
public interface MiscUtils {
1413
MiscUtils MISC_UTILS = Platform.get(MiscUtils.class);
@@ -17,6 +16,8 @@ static double randomEntityVelocity() {
1716
return new Random().nextDouble() - 0.5D;
1817
}
1918

19+
void dummy();
20+
2021
void sendPacket(Player bukkitPlayer, Object packet);
2122

2223
void scheduleEntityDestroy(Plugin plugin, UUID viewerUuid, Duration delay, int[] entityIds);
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package tc.oc.occ.matchshare.util;
2+
3+
import static org.reflections.scanners.Scanners.TypesAnnotated;
4+
5+
import java.util.Arrays;
6+
import org.bukkit.Bukkit;
7+
import org.bukkit.plugin.Plugin;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.reflections.Reflections;
10+
import org.reflections.util.ClasspathHelper;
11+
import org.reflections.util.ConfigurationBuilder;
12+
import tc.oc.occ.matchshare.util.Supports.Variant;
13+
import tc.oc.pgm.util.Version;
14+
import tc.oc.pgm.util.reflect.ReflectionUtils;
15+
import tc.oc.pgm.util.text.TextParser;
16+
17+
@SuppressWarnings("unchecked")
18+
public abstract class Platform {
19+
private static final Reflections REFLECTIONS = new Reflections(new ConfigurationBuilder()
20+
.addUrls(ClasspathHelper.forPackage("tc.oc.occ.matchshare", Platform.class.getClassLoader()))
21+
.forPackage("tc.oc.occ.matchshare.platform")
22+
.setScanners(TypesAnnotated));
23+
24+
public static final Version MINECRAFT_VERSION;
25+
public static final Variant VARIANT;
26+
27+
static {
28+
var sv = Bukkit.getServer();
29+
MINECRAFT_VERSION = TextParser.parseVersion(sv.getBukkitVersion().split("-")[0]);
30+
VARIANT = Arrays.stream(Variant.values())
31+
.filter(v -> v.matcher.test(sv))
32+
.findFirst()
33+
.orElse(null);
34+
}
35+
36+
public static final @NotNull Manifest MANIFEST = get(Manifest.class);
37+
38+
/**
39+
* Do a minimum sanity-check of the platform's viability and early-load some codepaths
40+
*
41+
* @throws Throwable could throw even class not found issues if loading in the wrong version
42+
*/
43+
public static void init() throws Throwable {
44+
MiscUtils.MISC_UTILS.dummy();
45+
}
46+
47+
public static <T> @NotNull T get(Class<T> clazz) {
48+
return (T) Platform.getBestSupported(clazz);
49+
}
50+
51+
private static <T> Iterable<Class<?>> getSupported(Class<T> parent) {
52+
return REFLECTIONS.get(TypesAnnotated.with(Supports.class, Supports.List.class)
53+
.asClass()
54+
.filter(parent::isAssignableFrom));
55+
}
56+
57+
private static Object getBestSupported(Class<?> parent) {
58+
Class<?> result = null;
59+
Supports.Priority priority = null;
60+
for (Class<?> clazz : getSupported(parent)) {
61+
Supports[] supportList = clazz.getDeclaredAnnotationsByType(Supports.class);
62+
for (Supports sup : supportList) {
63+
if (VARIANT != sup.value()) continue;
64+
if (!sup.minVersion().isEmpty()
65+
&& MINECRAFT_VERSION.isOlderThan(TextParser.parseVersion(sup.minVersion()))) continue;
66+
if (!sup.maxVersion().isEmpty()
67+
&& TextParser.parseVersion(sup.maxVersion()).isOlderThan(MINECRAFT_VERSION)) continue;
68+
69+
if (priority == null || priority.compareTo(sup.priority()) < 0) {
70+
priority = sup.priority();
71+
result = clazz;
72+
}
73+
}
74+
}
75+
if (result == null)
76+
throw new UnsupportedOperationException(
77+
"Current server software platform does not have an impl for: " + parent.getSimpleName());
78+
79+
return ReflectionUtils.callConstructor(ReflectionUtils.getConstructor(result));
80+
}
81+
82+
public interface Manifest {
83+
void onEnable(Plugin plugin);
84+
}
85+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package tc.oc.occ.matchshare.util;
2+
3+
import java.lang.annotation.Repeatable;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.util.function.Predicate;
7+
import org.bukkit.Server;
8+
9+
@Retention(RetentionPolicy.RUNTIME)
10+
@Repeatable(Supports.List.class)
11+
public @interface Supports {
12+
Variant value();
13+
14+
String minVersion() default "";
15+
16+
String maxVersion() default "";
17+
18+
Priority priority() default Priority.MEDIUM;
19+
20+
enum Variant {
21+
SPORTPAPER(sv -> sv.getVersion().contains("SportPaper")),
22+
PAPER(sv -> sv.getName().equalsIgnoreCase("Paper"));
23+
24+
public final Predicate<Server> matcher;
25+
26+
Variant(Predicate<Server> matches) {
27+
this.matcher = matches;
28+
}
29+
}
30+
31+
enum Priority {
32+
LOWEST,
33+
LOW,
34+
MEDIUM,
35+
HIGH,
36+
HIGHEST
37+
}
38+
39+
@Retention(RetentionPolicy.RUNTIME)
40+
@interface List {
41+
Supports[] value();
42+
}
43+
}

0 commit comments

Comments
 (0)