Initial for bukkit split

This commit is contained in:
Vankka 2024-12-27 21:13:21 +02:00
parent 317a3c20f6
commit 53842c183d
No known key found for this signature in database
GPG Key ID: 62E48025ED4E7EBB
80 changed files with 513 additions and 108 deletions

View File

@ -1,87 +1,5 @@
import dev.vankka.dependencydownload.task.GenerateDependencyDownloadResourceTask
[
'net.kyori',
'me.lucko.commodore'
].each {
tasks.shadowJar.relocate it, 'com.discordsrv.dependencies.' + it
tasks.generateRuntimeDownloadResourceForRuntimeDownloadOnly.relocate it, 'com.discordsrv.dependencies.' + it
}
// More relocations in buildscript/relocations.gradle
shadowJar {
archiveFileName = 'bukkit.jarinjar'
}
apply from: rootProject.file('buildscript/runtime.gradle')
configurations {
commodore
compileOnly.extendsFrom commodore
}
tasks.register('generateResourceForCommodore', GenerateDependencyDownloadResourceTask) {
var conf = configurations.commodore
configuration = conf
file = 'dependencies/' + conf.name + '.txt'
}
allprojects {
repositories {
maven { url 'https://repo.papermc.io/repository/maven-public/' }
maven { url 'https://nexus.scarsz.me/content/groups/public/' }
maven { url 'https://repo.essentialsx.net/releases/' }
}
}
dependencies {
// API
annotationProcessor project(':api')
// Platform
compileOnly(libs.bukkit)
// Common
compileOnly project(':common')
implementation project(path: ':common', configuration: 'runtimeElements')
// Folia, modern bukkit
api project(':bukkit:bukkit-folia')
api project(':bukkit:bukkit-paper')
api project(':bukkit:bukkit-spigot')
api project(':bukkit:bukkit-bukkit1_12')
// DependencyDownload
implementation(libs.mcdependencydownload.bukkit.bootstrap)
// Adventure
runtimeDownloadApi(libs.adventure.api)
runtimeDownloadApi(libs.adventure.platform.bukkit)
// Commodore
commodore(libs.commodore) {
// We only use commodore when it's included in the server, so we don't want to download it
exclude module: 'brigadier'
// We don't use the commodore file format
exclude module: 'commodore-file'
}
// Integrations
compileOnly(libs.vaultapi)
compileOnly(libs.placeholderapi.bukkit)
// Chat Integrations
compileOnly(libs.chatty)
compileOnly(libs.griefprevention)
compileOnly(libs.lunachat)
compileOnly(libs.bungeecord.chat) // Required for LunaChatIntegration
compileOnly(libs.mcmmo)
compileOnly(libs.townychat)
compileOnly(libs.venturechat)
compileOnly(libs.essentialsx)
}
processResources {
dependsOn(generateResourceForCommodore)
}

View File

@ -0,0 +1,29 @@
repositories {
maven { url 'https://nexus.scarsz.me/content/groups/public/' }
maven { url 'https://repo.essentialsx.net/releases/' }
}
dependencies {
// API
annotationProcessor project(':api')
// Platform
compileOnly(libs.bukkit.minimum)
// Common
api project(':common')
// Integrations
compileOnly(libs.vaultapi)
compileOnly(libs.placeholderapi.bukkit)
// Chat Integrations
compileOnly(libs.chatty)
compileOnly(libs.griefprevention)
compileOnly(libs.lunachat)
compileOnly(libs.bungeecord.chat) // Required for LunaChatIntegration
compileOnly(libs.mcmmo)
compileOnly(libs.townychat)
compileOnly(libs.venturechat)
compileOnly(libs.essentialsx)
}

View File

@ -0,0 +1,42 @@
import dev.vankka.dependencydownload.task.GenerateDependencyDownloadResourceTask
[
'net.kyori',
'me.lucko.commodore'
].each {
tasks.shadowJar.relocate it, 'com.discordsrv.dependencies.' + it
tasks.generateRuntimeDownloadResourceForRuntimeDownloadOnly.relocate it, 'com.discordsrv.dependencies.' + it
}
// More relocations in buildscript/relocations.gradle
shadowJar {
archiveFileName = 'bukkit.jarinjar'
}
apply from: rootProject.file('buildscript/runtime.gradle')
configurations {
commodore
compileOnly.extendsFrom commodore
}
tasks.register('generateResourceForCommodore', GenerateDependencyDownloadResourceTask) {
var conf = configurations.commodore
configuration = conf
file = 'dependencies/' + conf.name + '.txt'
}
dependencies {
api project(':bukkit:bukkit-common')
// Adventure
runtimeDownloadApi(libs.adventure.api)
runtimeDownloadApi(libs.adventure.platform.bukkit)
// DependencyDownload
api(libs.mcdependencydownload.bukkit.bootstrap)
}
processResources {
dependsOn(generateResourceForCommodore)
}

View File

View File

@ -0,0 +1,5 @@
dependencies {
api(project(':bukkit:bukkit-common'))
compileOnly(libs.spigotapi.onetwelve)
}

View File

@ -0,0 +1,5 @@
dependencies {
api(project(':bukkit:bukkit-common'))
compileOnly(libs.spigotapi.latest)
}

View File

@ -0,0 +1,31 @@
import org.apache.tools.ant.filters.ReplaceTokens
apply plugin: 'xyz.jpenilla.run-paper'
apply from: rootProject.file('buildscript/loader.gradle')
dependencies {
// API
implementation project(':common:common-api')
// Platform
compileOnly(libs.spigotapi.onetwelve)
// DependencyDownload
implementation(libs.mcdependencydownload.bukkit.loader)
}
processResources {
filter(ReplaceTokens, tokens: ['VERSION': project.version])
}
shadowJar {
archiveBaseName = 'DiscordSRV-Bukkit'
}
tasks {
runServer {
minecraftVersion("1.12.2")
}
}
// buildscript/loader.gradle includes the jarinjar in the jar

View File

@ -1,18 +1,16 @@
java {
disableAutoTargetJvm() // Requires Java 21, we target 8
shadowJar {
archiveFileName = 'paper.jarinjar'
}
apply from: rootProject.file('buildscript/runtime.gradle')
dependencies {
// Platform
compileOnly(libs.paperapi) {
// v2
exclude module: 'slf4j-api'
}
api project(':bukkit:bukkit-common')
// Adventure (runtime downloaded by :bukkit)
compileOnly(libs.adventure.platform.bukkit)
// Compatability with newer versions
implementation(project(':bukkit:paper:compat:bukkit-paper-compat-folia'))
implementation(project(':bukkit:paper:compat:bukkit-paper-compat-latest'))
// Common
compileOnly project(':bukkit:bukkit-bukkit1_12')
compileOnly project(':common')
// DependencyDownload
api(libs.mcdependencydownload.bukkit.bootstrap)
}

View File

@ -0,0 +1,12 @@
java {
disableAutoTargetJvm() // Requires Java 21, we target 8
}
dependencies {
api(project(':bukkit:bukkit-common'))
compileOnly(libs.folia) {
// v2
exclude module: 'slf4j-api'
}
}

View File

@ -0,0 +1,12 @@
java {
disableAutoTargetJvm() // Requires Java 21, we target 8
}
dependencies {
api(project(':bukkit:bukkit-common'))
compileOnly(libs.paperapi.latest) {
// v2
exclude module: 'slf4j-api'
}
}

View File

@ -0,0 +1,31 @@
import org.apache.tools.ant.filters.ReplaceTokens
apply plugin: 'xyz.jpenilla.run-paper'
apply from: rootProject.file('buildscript/loader.gradle')
dependencies {
// API
implementation project(':common:common-api')
// Platform
compileOnly(libs.paperapi.minimum)
// DependencyDownload
implementation(libs.mcdependencydownload.bukkit.loader)
}
processResources {
filter(ReplaceTokens, tokens: ['VERSION': project.version])
}
shadowJar {
archiveBaseName = 'DiscordSRV-Paper'
}
tasks {
runServer {
minecraftVersion("1.21.2")
}
}
// buildscript/loader.gradle includes the jarinjar in the jar

87
bukkitv1/build.gradle Normal file
View File

@ -0,0 +1,87 @@
import dev.vankka.dependencydownload.task.GenerateDependencyDownloadResourceTask
[
'net.kyori',
'me.lucko.commodore'
].each {
tasks.shadowJar.relocate it, 'com.discordsrv.dependencies.' + it
tasks.generateRuntimeDownloadResourceForRuntimeDownloadOnly.relocate it, 'com.discordsrv.dependencies.' + it
}
// More relocations in buildscript/relocations.gradle
shadowJar {
archiveFileName = 'bukkit.jarinjar'
}
apply from: rootProject.file('buildscript/runtime.gradle')
configurations {
commodore
compileOnly.extendsFrom commodore
}
tasks.register('generateResourceForCommodore', GenerateDependencyDownloadResourceTask) {
var conf = configurations.commodore
configuration = conf
file = 'dependencies/' + conf.name + '.txt'
}
allprojects {
repositories {
maven { url 'https://repo.papermc.io/repository/maven-public/' }
maven { url 'https://nexus.scarsz.me/content/groups/public/' }
maven { url 'https://repo.essentialsx.net/releases/' }
}
}
dependencies {
// API
annotationProcessor project(':api')
// Platform
compileOnly(libs.bukkit.minimum)
// Common
compileOnly project(':common')
implementation project(path: ':common', configuration: 'runtimeElements')
// Folia, modern bukkit
api project(':bukkitv1:bukkitv1-folia')
api project(':bukkitv1:bukkitv1-paper')
api project(':bukkitv1:bukkitv1-spigot')
api project(':bukkitv1:bukkitv1-bukkit1_12')
// DependencyDownload
implementation(libs.mcdependencydownload.bukkit.bootstrap)
// Adventure
runtimeDownloadApi(libs.adventure.api)
runtimeDownloadApi(libs.adventure.platform.bukkit)
// Commodore
commodore(libs.commodore) {
// We only use commodore when it's included in the server, so we don't want to download it
exclude module: 'brigadier'
// We don't use the commodore file format
exclude module: 'commodore-file'
}
// Integrations
compileOnly(libs.vaultapi)
compileOnly(libs.placeholderapi.bukkit)
// Chat Integrations
compileOnly(libs.chatty)
compileOnly(libs.griefprevention)
compileOnly(libs.lunachat)
compileOnly(libs.bungeecord.chat) // Required for LunaChatIntegration
compileOnly(libs.mcmmo)
compileOnly(libs.townychat)
compileOnly(libs.venturechat)
compileOnly(libs.essentialsx)
}
processResources {
dependsOn(generateResourceForCommodore)
}

View File

@ -4,7 +4,10 @@ java {
dependencies {
// Platform
compileOnly(libs.folia)
compileOnly(libs.folia) {
// v2
exclude module: 'slf4j-api'
}
// Common
compileOnly project(':common')

View File

@ -8,7 +8,7 @@ dependencies {
implementation project(':common:common-api')
// Platform
compileOnly(libs.spigotapi)
compileOnly(libs.spigotapi.latest)
// DependencyDownload
implementation(libs.mcdependencydownload.bukkit.loader)

View File

@ -0,0 +1,18 @@
java {
disableAutoTargetJvm() // Requires Java 21, we target 8
}
dependencies {
// Platform
compileOnly(libs.paperapi.latest) {
// v2
exclude module: 'slf4j-api'
}
// Adventure (runtime downloaded by :bukkit)
compileOnly(libs.adventure.platform.bukkit)
// Common
compileOnly project(':bukkitv1:bukkitv1-bukkit1_12')
compileOnly project(':common')
}

View File

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

View File

@ -0,0 +1,208 @@
package com.discordsrv.bukkit.debug;
import org.bukkit.event.Event;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredListener;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function;
public class EventObserver<E extends Event, P> {
private final Plugin plugin;
private final Class<?> eventClass;
private final BiConsumer<RegisteredListener, E> observer;
private final Function<E, P> propertyGetter;
private final ThreadLocal<P> propertyValue = ThreadLocal.withInitial(() -> null);
private final EnumMap<EventPriority, EventObserverList<E, P>> proxies = new EnumMap<>(EventPriority.class);
private EnumMap<EventPriority, ArrayList<RegisteredListener>> originalMap;
public EventObserver(Plugin plugin, @NotNull Class<E> eventClass, BiConsumer<RegisteredListener, E> observer, Function<E, P> propertyGetter) {
this.plugin = plugin;
this.eventClass = eventClass;
this.observer = observer;
this.propertyGetter = propertyGetter;
inject();
}
public void close() {
if (originalMap == null) {
return;
}
try {
for (Map.Entry<EventPriority, ArrayList<RegisteredListener>> entry : originalMap.entrySet()) {
ArrayList<RegisteredListener> list = entry.getValue();
list.clear();
list.addAll(proxies.get(entry.getKey()).getRaw());
}
HandlerList handlerList = getHandlerList();
setSlots(handlerList, originalMap);
// Reset the handlers so it gets them again
Field handlers = handlerList.getClass().getDeclaredField("handlers");
handlers.setAccessible(true);
handlers.set(handlerList, null);
} catch (Exception e) {
throw new RuntimeException("Unable to clean up handler list.", e);
}
originalMap = null;
}
private void inject() {
HandlerList handlerList = getHandlerList();
EnumMap<EventPriority, ArrayList<RegisteredListener>> slots = getSlots(handlerList);
originalMap = slots.clone();
for (EventPriority eventPriority : slots.keySet()) {
List<RegisteredListener> original = originalMap.get(eventPriority);
EventObserverList<E, P> proxy = new EventObserverList<>(original, this);
slots.put(eventPriority, proxy);
proxies.put(eventPriority, proxy);
}
}
private HandlerList getHandlerList() {
Class<?> currentClass = eventClass;
while (currentClass != null && Event.class.isAssignableFrom(currentClass)) {
try {
Method method = currentClass.getDeclaredMethod("getHandlerList");
if (!method.isAccessible()) method.setAccessible(true);
return (HandlerList) method.invoke(null);
} catch (NoSuchMethodException ignored) {
currentClass = currentClass.getSuperclass();
} catch (Throwable e) {
throw new RuntimeException("Could not get HandlerList", e);
}
}
throw new RuntimeException("Unable to find HandlerList");
}
public void setSlots(HandlerList handlerList, EnumMap<EventPriority, ArrayList<RegisteredListener>> slots) {
try {
getSlotsField().set(handlerList, slots);
} catch (IllegalAccessException | NoSuchFieldException e) {
throw new RuntimeException("Unable to set handlerslots field", e);
}
}
@SuppressWarnings("unchecked")
public EnumMap<EventPriority, ArrayList<RegisteredListener>> getSlots(HandlerList handlerList) {
try {
return (EnumMap<EventPriority, ArrayList<RegisteredListener>>) getSlotsField().get(handlerList);
} catch (Throwable e) {
throw new RuntimeException("Unable to get handlerslots field", e);
}
}
private static Field getSlotsField() throws NoSuchFieldException {
Field field = HandlerList.class.getDeclaredField("handlerslots");
if (!field.isAccessible()) field.setAccessible(true);
return field;
}
public static class EventObserverList<E extends Event, P> extends ArrayList<RegisteredListener> {
private final EventObserver<E, P> observer;
public EventObserverList(Collection<RegisteredListener> original, EventObserver<E, P> observer) {
super(original);
this.observer = observer;
}
private List<RegisteredListener> getRaw() {
// Avoid #toArray
Iterator<RegisteredListener> iterator = iterator();
List<RegisteredListener> listeners = new ArrayList<>();
while (iterator.hasNext()) {
listeners.add(iterator.next());
}
return listeners;
}
private List<RegisteredListener> getListeners() {
List<RegisteredListener> listeners = new ArrayList<>();
listeners.add(new CancellationDetectingListener<>(null, observer));
for (RegisteredListener listener : this) {
listeners.add(listener);
listeners.add(new CancellationDetectingListener<>(listener, observer));
}
return listeners;
}
@Override
public Object @NotNull [] toArray() {
return getListeners().toArray();
}
@Override
public <T> T @NotNull [] toArray(T[] a) {
return getListeners().toArray(a);
}
@Override
public boolean remove(Object o) {
if (o instanceof CancellationDetectingListener) {
// Prevent removing these from the collection
return true;
}
return super.remove(o);
}
@Override
public boolean add(RegisteredListener registeredListener) {
if (registeredListener instanceof CancellationDetectingListener) {
// Prevent adding these to the collection
return true;
}
return super.add(registeredListener);
}
}
public static class CancellationDetectingListener<E extends Event, P> extends RegisteredListener {
private final RegisteredListener listener;
private final EventObserver<E, P> observer;
public CancellationDetectingListener(
RegisteredListener listener,
EventObserver<E, P> observer
) {
super(
new Listener() {},
(l, e) -> {},
listener != null ? listener.getPriority() : EventPriority.LOWEST,
observer.plugin,
false
);
this.listener = listener;
this.observer = observer;
}
@SuppressWarnings("unchecked")
@Override
public void callEvent(Event event) {
P propertyValue = observer.propertyGetter.apply((E) event);
P previousValue = observer.propertyValue.get();
if (!Objects.equals(propertyValue, previousValue)) {
observer.propertyValue.set(propertyValue);
if (listener != null) {
observer.observer.accept(listener, (E) event);
}
}
}
}
}

View File

@ -24,15 +24,14 @@ dependencyResolutionManagement {
plugin('run-waterfall', 'xyz.jpenilla.run-waterfall').versionRef('runtask')
// Bukkit
version('bukkit_minimum', '1.8.8-R0.1-SNAPSHOT')
version('bukkit1_12', '1.12.2-R0.1-SNAPSHOT')
version('bukkit_latest', '1.21.1-R0.1-SNAPSHOT')
version('folia', '1.20.1-R0.1-SNAPSHOT')
library('paperapi', 'io.papermc.paper', 'paper-api').versionRef('bukkit_latest')
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('folia', 'dev.folia', 'folia-api').versionRef('folia')
library('bukkit-minimum', 'org.bukkit', 'bukkit').version('1.8.8-R0.1-SNAPSHOT')
library('spigotapi-onetwelve', 'org.spigotmc', 'spigot-api').version('1.12.2-R0.1-SNAPSHOT')
library('spigotapi-latest', 'org.spigotmc', 'spigot-api').version('1.21.2-R0.1-SNAPSHOT')
// Paper
library('paperapi-minimum', 'com.destroystokyo.paper', 'paper-api').version('1.16.2-R0.1-SNAPSHOT')
library('paperapi-latest', 'io.papermc.paper', 'paper-api').version('1.21.4-R0.1-SNAPSHOT')
library('folia', 'dev.folia', 'folia-api').version('1.21.4-R0.1-SNAPSHOT')
// Bungee
library('bungee', 'net.md-5', 'bungeecord-api').version('1.21-R0.1-SNAPSHOT')
@ -155,8 +154,15 @@ rootProject.name = 'DiscordSRV-Ascension'
'common', 'common:api', 'common:unrelocate',
'i18n',
'api',
'bukkit', 'bukkit:loader', 'bukkit:folia', 'bukkit:spigot', 'bukkit:paper', 'bukkit:bukkit1_12',
// Bukkit old
'bukkitv1', 'bukkitv1:loader', 'bukkitv1:folia', 'bukkitv1:spigot', 'bukkitv1:paper', 'bukkitv1:bukkit1_12',
// Bukkit
'bukkit:common',
'bukkit:legacy', 'bukkit:legacy:loader','bukkit:legacy:compat', 'bukkit:legacy:compat:bukkit1_12', 'bukkit:legacy:compat:spigot',
'bukkit:paper', 'bukkit:paper:loader', 'bukkit:paper:compat', 'bukkit:paper:compat:latest', 'bukkit:paper:compat:folia',
// Bungee
'bungee', 'bungee:loader',
// Velocity
'velocity'
].each {
include it