Add spigot listener for advancements

This commit is contained in:
Vankka 2023-11-13 00:58:17 +02:00
parent 91fa61542d
commit 273f3d9a19
No known key found for this signature in database
GPG Key ID: 6E50CB7A29B96AD0
7 changed files with 87 additions and 22 deletions

View File

@ -38,7 +38,7 @@ dependencies {
annotationProcessor project(':api') annotationProcessor project(':api')
// Platform // Platform
compileOnly(libs.spigotapi) compileOnly(libs.bukkit)
// Common // Common
compileOnly project(':common') compileOnly project(':common')
@ -47,6 +47,7 @@ dependencies {
// Folia, modern bukkit // Folia, modern bukkit
api project(':bukkit:bukkit-folia') api project(':bukkit:bukkit-folia')
api project(':bukkit:bukkit-paper') api project(':bukkit:bukkit-paper')
api project(':bukkit:bukkit-spigot')
api project(':bukkit:bukkit-bukkit1_12') api project(':bukkit:bukkit-bukkit1_12')
// DependencyDownload // DependencyDownload
@ -72,6 +73,7 @@ dependencies {
compileOnly(libs.chatty) compileOnly(libs.chatty)
compileOnly(libs.griefprevention) compileOnly(libs.griefprevention)
compileOnly(libs.lunachat) compileOnly(libs.lunachat)
compileOnly(libs.bungeecord.chat) // Required for LunaChatIntegration
compileOnly(libs.mcmmo) compileOnly(libs.mcmmo)
compileOnly(libs.townychat) compileOnly(libs.townychat)
compileOnly(libs.venturechat) compileOnly(libs.venturechat)

View File

@ -30,6 +30,9 @@ import org.bukkit.event.player.PlayerAdvancementDoneEvent;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
/**
* Used for Spigot and Paper in versions before they added advancement apis.
*/
public class BukkitAdvancementListener extends AbstractBukkitAwardListener { public class BukkitAdvancementListener extends AbstractBukkitAwardListener {
private final NMS nms; private final NMS nms;
@ -37,19 +40,12 @@ public class BukkitAdvancementListener extends AbstractBukkitAwardListener {
public BukkitAdvancementListener(DiscordSRV discordSRV, IBukkitAwardForwarder forwarder) { public BukkitAdvancementListener(DiscordSRV discordSRV, IBukkitAwardForwarder forwarder) {
super(discordSRV, forwarder); super(discordSRV, forwarder);
String className = Bukkit.getServer().getClass().getName(); String version = Bukkit.getServer().getBukkitVersion().split("-", 2)[0];
String[] packageParts = className.split("\\.");
if (packageParts.length != 5) {
this.nms = null;
logger.error("Server does not have NMS, incompatible with advancements.");
return;
}
String version = packageParts[3];
NMS nms = null; NMS nms = null;
try { try {
if ((version.startsWith("v1_19") && !version.startsWith("v1_19_R1") && !version.startsWith("v1_19_R2")) if ((version.startsWith("1.19") && !version.matches("1.19.[1-3].*"))
|| version.startsWith("v1_2")) { || version.startsWith("1.2")) {
// 1.19.4+ // 1.19.4+
nms = new NMS("org.bukkit.craftbukkit." + version + ".advancement.CraftAdvancement", nms = new NMS("org.bukkit.craftbukkit." + version + ".advancement.CraftAdvancement",
"d", "i", "a"); "d", "i", "a");

View File

@ -0,0 +1,11 @@
dependencies {
// Platform
compileOnly(libs.spigotapi)
// Adventure (runtime downloaded by :bukkit)
compileOnly(libs.adventure.platform.bukkit)
// Common
compileOnly project(':bukkit:bukkit-bukkit1_12')
compileOnly project(':common')
}

View File

@ -0,0 +1,32 @@
package com.discordsrv.bukkit.listener.award;
import com.discordsrv.api.component.MinecraftComponent;
import com.discordsrv.common.DiscordSRV;
import com.discordsrv.common.component.util.ComponentUtil;
import net.kyori.adventure.platform.bukkit.BukkitComponentSerializer;
import org.bukkit.advancement.Advancement;
import org.bukkit.advancement.AdvancementDisplay;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerAdvancementDoneEvent;
public class SpigotModernAdvancementListener extends AbstractBukkitAwardListener {
public SpigotModernAdvancementListener(DiscordSRV discordSRV, IBukkitAwardForwarder forwarder) {
super(discordSRV, forwarder);
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerAdvancementDone(PlayerAdvancementDoneEvent event) {
Advancement advancement = event.getAdvancement();
AdvancementDisplay display = advancement.getDisplay();
if (display == null || !display.shouldAnnounceChat()) {
logger.trace("Skipping advancement display of \"" + advancement.getKey().getKey() + "\" for "
+ event.getPlayer() + ": advancement display == null or does not broadcast to chat");
return;
}
MinecraftComponent title = ComponentUtil.toAPI(BukkitComponentSerializer.legacy().deserialize(display.getTitle())) ;
forwarder.publishEvent(event, event.getPlayer(), title, null, false);
}
}

View File

@ -24,21 +24,39 @@ import com.discordsrv.bukkit.BukkitDiscordSRV;
import com.discordsrv.common.player.IPlayer; import com.discordsrv.common.player.IPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.intellij.lang.annotations.Language;
public class BukkitAwardForwarder implements IBukkitAwardForwarder { public class BukkitAwardForwarder implements IBukkitAwardForwarder {
public static Listener get(BukkitDiscordSRV discordSRV) { public static Listener get(BukkitDiscordSRV discordSRV) {
try { BukkitAwardForwarder forwarder = new BukkitAwardForwarder(discordSRV);
Class.forName("org.bukkit.event.player.PlayerAdvancementDoneEvent");
try {
Class.forName("io.papermc.paper.advancement.AdvancementDisplay");
return new PaperModernAdvancementListener(discordSRV, new BukkitAwardForwarder(discordSRV)); if (exists("org.bukkit.event.player.PlayerAdvancementDoneEvent")) {
} catch (ClassNotFoundException ignored) { // Advancement
return new BukkitAdvancementListener(discordSRV, new BukkitAwardForwarder(discordSRV)); if (exists("io.papermc.paper.advancement.AdvancementDisplay")) {
// Paper
return new PaperModernAdvancementListener(discordSRV, forwarder);
} else if (exists("org.bukkit.advancement.AdvancementDisplay")) {
// Spigot
return new SpigotModernAdvancementListener(discordSRV, forwarder);
} else {
// Generic
return new BukkitAdvancementListener(discordSRV, forwarder);
} }
} else {
// Achievement
return new BukkitAchievementListener(discordSRV, forwarder);
}
}
private static boolean exists(
@Language(value = "JAVA", prefix = "class X{static{Class.forName(\"", suffix = "\")}}") String className
) {
try {
Class.forName(className);
return true;
} catch (ClassNotFoundException ignored) { } catch (ClassNotFoundException ignored) {
return new BukkitAchievementListener(discordSRV, new BukkitAwardForwarder(discordSRV)); return false;
} }
} }

View File

@ -19,14 +19,18 @@
package com.discordsrv.common.config.connection; package com.discordsrv.common.config.connection;
import com.discordsrv.common.config.Config; import com.discordsrv.common.config.Config;
import com.discordsrv.common.config.configurate.annotation.Constants;
import com.discordsrv.common.config.main.MainConfig;
import org.spongepowered.configurate.objectmapping.ConfigSerializable; import org.spongepowered.configurate.objectmapping.ConfigSerializable;
@ConfigSerializable @ConfigSerializable
public class ConnectionConfig implements Config { public class ConnectionConfig implements Config {
public static final String FILE_NAME = "connections.yaml"; public static final String FILE_NAME = "connections.yaml";
@Constants(MainConfig.FILE_NAME)
public static final String HEADER = "DiscordSRV's configuration file for connections to different external services.\n" public static final String HEADER = "DiscordSRV's configuration file for connections to different external services.\n"
+ "This file is intended to contain connection details to services in order to keep them out of the config.yml\n" + "This file is intended to contain connection details to services in order to keep them out of the %1\n"
+ "and to serve as a easy way to identify and control what external connections are being used.\n" + "and to serve as a easy way to identify and control what external connections are being used.\n"
+ "\n" + "\n"
+ "All domains listed as \"Requires a connection to\" require port 443 (https/wss) unless otherwise specified\n" + "All domains listed as \"Requires a connection to\" require port 443 (https/wss) unless otherwise specified\n"

View File

@ -21,7 +21,8 @@ dependencyResolutionManagement {
version('bukkit_latest', '1.20.1-R0.1-SNAPSHOT') version('bukkit_latest', '1.20.1-R0.1-SNAPSHOT')
version('folia', '1.20.1-R0.1-SNAPSHOT') version('folia', '1.20.1-R0.1-SNAPSHOT')
library('paperapi', 'io.papermc.paper', 'paper-api').versionRef('bukkit_latest') library('paperapi', 'io.papermc.paper', 'paper-api').versionRef('bukkit_latest')
library('spigotapi', 'org.spigotmc', 'spigot-api').versionRef('bukkit_minimum') library('spigotapi', 'org.spigotmc', 'spigot-api').versionRef('bukkit_latest')
library('bukkit', 'org.bukkit', 'bukkit').versionRef('bukkit_minimum')
library('spigotapi-onetwelve', 'org.spigotmc', 'spigot-api').versionRef('bukkit1_12') library('spigotapi-onetwelve', 'org.spigotmc', 'spigot-api').versionRef('bukkit1_12')
library('folia', 'dev.folia', 'folia-api').versionRef('folia') library('folia', 'dev.folia', 'folia-api').versionRef('folia')
@ -107,6 +108,7 @@ dependencyResolutionManagement {
library('venturechat', 'mineverse.aust1n46', 'venturechat').version('3.5.0') library('venturechat', 'mineverse.aust1n46', 'venturechat').version('3.5.0')
library('chatty', 'ru.mrbrikster', 'chatty-api').version('2.19.13') library('chatty', 'ru.mrbrikster', 'chatty-api').version('2.19.13')
library('lunachat', 'com.github.ucchyocean.lc', 'LunaChat').version('3.0.16') library('lunachat', 'com.github.ucchyocean.lc', 'LunaChat').version('3.0.16')
library('bungeecord-chat', 'net.md-5', 'bungeecord-chat').version('1.12-SNAPSHOT')
library('mcmmo', 'com.gmail.nossr50', 'mcmmo').version('2.1.220') library('mcmmo', 'com.gmail.nossr50', 'mcmmo').version('2.1.220')
library('griefprevention', 'me.ryanhamshire', 'GriefPrevention').version('16.18.1') library('griefprevention', 'me.ryanhamshire', 'GriefPrevention').version('16.18.1')
@ -149,7 +151,7 @@ rootProject.name = 'DiscordSRV-Ascension'
'common', 'common:api', 'common:unrelocate', 'common', 'common:api', 'common:unrelocate',
'i18n', 'i18n',
'api', 'api',
'bukkit', 'bukkit:loader', 'bukkit:folia', 'bukkit:paper', 'bukkit:bukkit1_12', 'bukkit', 'bukkit:loader', 'bukkit:folia', 'bukkit:spigot', 'bukkit:paper', 'bukkit:bukkit1_12',
'bungee', 'bungee:loader', 'bungee', 'bungee:loader',
'sponge', 'sponge:loader', 'sponge', 'sponge:loader',
'velocity' 'velocity'