Deduplicate strings in ObfHelper (#6841)

This commit is contained in:
Jason 2021-11-04 17:23:06 -07:00 committed by GitHub
parent 0968cddbcd
commit 6f71b7c4a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 94 additions and 91 deletions

View File

@ -56,14 +56,14 @@ paperweight {
minecraftVersion.set(providers.gradleProperty("mcVersion")) minecraftVersion.set(providers.gradleProperty("mcVersion"))
serverProject.set(project(":Paper-Server")) serverProject.set(project(":Paper-Server"))
paper {
spigotApiPatchDir.set(layout.projectDirectory.dir("patches/api"))
spigotServerPatchDir.set(layout.projectDirectory.dir("patches/server"))
paramMappingsRepo.set("https://maven.quiltmc.org/repository/release/") paramMappingsRepo.set("https://maven.quiltmc.org/repository/release/")
remapRepo.set("https://maven.fabricmc.net/") remapRepo.set("https://maven.fabricmc.net/")
decompileRepo.set("https://files.minecraftforge.net/maven/") decompileRepo.set("https://files.minecraftforge.net/maven/")
paper {
spigotApiPatchDir.set(layout.projectDirectory.dir("patches/api"))
spigotServerPatchDir.set(layout.projectDirectory.dir("patches/server"))
mappingsPatch.set(layout.projectDirectory.file("build-data/mappings-patch.tiny")) mappingsPatch.set(layout.projectDirectory.file("build-data/mappings-patch.tiny"))
reobfMappingsPatch.set(layout.projectDirectory.file("build-data/reobf-mappings-patch.tiny")) reobfMappingsPatch.set(layout.projectDirectory.file("build-data/reobf-mappings-patch.tiny"))
@ -86,18 +86,15 @@ paperweight {
tasks.generateDevelopmentBundle { tasks.generateDevelopmentBundle {
apiCoordinates.set("io.papermc.paper:paper-api") apiCoordinates.set("io.papermc.paper:paper-api")
mojangApiCoordinates.set("io.papermc.paper:paper-mojangapi") mojangApiCoordinates.set("io.papermc.paper:paper-mojangapi")
libraryRepositories.set( libraryRepositories.addAll(
listOf(
"https://repo.maven.apache.org/maven2/", "https://repo.maven.apache.org/maven2/",
"https://libraries.minecraft.net/", "https://libraries.minecraft.net/",
"https://papermc.io/repo/repository/maven-public/", "https://papermc.io/repo/repository/maven-public/",
"https://maven.quiltmc.org/repository/release/",
)
) )
} }
publishing { publishing {
if (project.hasProperty("publishDevBundle")) { if (project.providers.gradleProperty("publishDevBundle").forUseAtConfigurationTime().isPresent) {
publications.create<MavenPublication>("devBundle") { publications.create<MavenPublication>("devBundle") {
artifact(tasks.generateDevelopmentBundle) { artifact(tasks.generateDevelopmentBundle) {
artifactId = "dev-bundle" artifactId = "dev-bundle"
@ -109,9 +106,8 @@ publishing {
allprojects { allprojects {
publishing { publishing {
repositories { repositories {
maven { maven("https://papermc.io/repo/repository/maven-snapshots/") {
name = "paperSnapshots" name = "paperSnapshots"
url = uri("https://papermc.io/repo/repository/maven-snapshots/")
credentials(PasswordCredentials::class) credentials(PasswordCredentials::class)
} }
} }

View File

@ -6,7 +6,7 @@ Subject: [PATCH] Deobfuscate stacktraces in log messages, crash reports, and
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index a482ad74b9a5d06a982ac2a6d9b6c5dc9f664f46..7a7a6a1a1bdfecb619dd6ba6f6865eb0bb74d0d9 100644 index a482ad74b9a5d06a982ac2a6d9b6c5dc9f664f46..974f0bbbd3d271d28ce884490dc68b68849a07c3 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -1,7 +1,9 @@ @@ -1,7 +1,9 @@
@ -19,31 +19,36 @@ index a482ad74b9a5d06a982ac2a6d9b6c5dc9f664f46..7a7a6a1a1bdfecb619dd6ba6f6865eb0
import java.util.Locale import java.util.Locale
plugins { plugins {
@@ -12,6 +14,14 @@ plugins { @@ -12,6 +14,11 @@ plugins {
repositories { repositories {
maven("https://libraries.minecraft.net/") maven("https://libraries.minecraft.net/")
+ // Paper start + // Paper start
+ maven("https://maven.quiltmc.org/repository/release/") { + maven("https://maven.fabricmc.net/") {
+ mavenContent { + mavenContent { includeModule("net.fabricmc", "mapping-io") }
+ releasesOnly()
+ includeModule("org.quiltmc", "tiny-mappings-parser")
+ }
+ } + }
+ // Paper end + // Paper end
} }
dependencies { dependencies {
@@ -46,6 +56,8 @@ dependencies { @@ -46,6 +53,8 @@ dependencies {
implementation("io.netty:netty-all:4.1.65.Final") // Paper implementation("io.netty:netty-all:4.1.65.Final") // Paper
+ implementation("org.quiltmc:tiny-mappings-parser:0.3.0") // Paper - needed to read mappings for stacktrace deobfuscation + implementation("net.fabricmc:mapping-io:0.3.0") // Paper - needed to read mappings for stacktrace deobfuscation
+ +
testImplementation("junit:junit:4.13.1") testImplementation("junit:junit:4.13.1")
testImplementation("org.hamcrest:hamcrest-library:1.3") testImplementation("org.hamcrest:hamcrest-library:1.3")
} }
@@ -139,6 +151,45 @@ tasks.shadowJar { @@ -95,6 +104,7 @@ relocation {
relocate("org.jline:jline-terminal-jansi", "org.jline" to cb("jline"))
sequenceOf(
+ "net.fabricmc:mapping-io" to "net.fabricmc.mappingio", // Paper
"commons-codec:commons-codec" to "org.apache.commons.codec",
"commons-io:commons-io" to "org.apache.commons.io",
//"it.unimi.dsi:fastutil" to "it.unimi", // Paper - don't relocate fastutil
@@ -139,6 +149,45 @@ tasks.shadowJar {
transform(ModifiedLog4j2PluginsCacheFileTransformer::class.java) transform(ModifiedLog4j2PluginsCacheFileTransformer::class.java)
} }
@ -162,26 +167,26 @@ index 0000000000000000000000000000000000000000..c701ef3c287f62aa0ebfbdbd6da6ed82
+} +}
diff --git a/src/main/java/io/papermc/paper/util/ObfHelper.java b/src/main/java/io/papermc/paper/util/ObfHelper.java diff --git a/src/main/java/io/papermc/paper/util/ObfHelper.java b/src/main/java/io/papermc/paper/util/ObfHelper.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..5ee513c0e2436e6afa3432f9f835d4028b37aed0 index 0000000000000000000000000000000000000000..b8b17d046f836c8652ab094db00ab1af84971b2c
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/util/ObfHelper.java +++ b/src/main/java/io/papermc/paper/util/ObfHelper.java
@@ -0,0 +1,141 @@ @@ -0,0 +1,146 @@
+package io.papermc.paper.util; +package io.papermc.paper.util;
+ +
+import com.google.common.base.Charsets;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.mojang.datafixers.util.Pair;
+import java.io.BufferedReader;
+import java.io.IOException; +import java.io.IOException;
+import java.io.InputStream; +import java.io.InputStream;
+import java.io.InputStreamReader; +import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map; +import java.util.Map;
+import java.util.Set; +import java.util.Set;
+import net.fabricmc.mapping.tree.ClassDef; +import java.util.function.Function;
+import net.fabricmc.mapping.tree.MethodDef; +import java.util.stream.Collectors;
+import net.fabricmc.mapping.tree.TinyMappingFactory; +import net.fabricmc.mappingio.MappingReader;
+import net.fabricmc.mapping.tree.TinyTree; +import net.fabricmc.mappingio.format.MappingFormat;
+import net.fabricmc.mappingio.tree.MappingTree;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
+import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.NonNull;
+import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.nullness.qual.Nullable;
+import org.checkerframework.framework.qual.DefaultQualifier; +import org.checkerframework.framework.qual.DefaultQualifier;
@ -199,8 +204,8 @@ index 0000000000000000000000000000000000000000..5ee513c0e2436e6afa3432f9f835d402
+ ObfHelper() { + ObfHelper() {
+ final @Nullable Set<ClassMapping> maps = loadMappingsIfPresent(); + final @Nullable Set<ClassMapping> maps = loadMappingsIfPresent();
+ if (maps != null) { + if (maps != null) {
+ this.mappingsByObfName = maps.stream().collect(ImmutableMap.toImmutableMap(ClassMapping::obfName, map -> map)); + this.mappingsByObfName = maps.stream().collect(Collectors.toUnmodifiableMap(ClassMapping::obfName, map -> map));
+ this.mappingsByMojangName = maps.stream().collect(ImmutableMap.toImmutableMap(ClassMapping::mojangName, map -> map)); + this.mappingsByMojangName = maps.stream().collect(Collectors.toUnmodifiableMap(ClassMapping::mojangName, map -> map));
+ } else { + } else {
+ this.mappingsByObfName = null; + this.mappingsByObfName = null;
+ this.mappingsByMojangName = null; + this.mappingsByMojangName = null;
@ -260,34 +265,33 @@ index 0000000000000000000000000000000000000000..5ee513c0e2436e6afa3432f9f835d402
+ if (mappingsInputStream == null) { + if (mappingsInputStream == null) {
+ return null; + return null;
+ } + }
+ final TinyTree tree = TinyMappingFactory.loadWithDetection(new BufferedReader(new InputStreamReader(mappingsInputStream, Charsets.UTF_8))); + final MemoryMappingTree tree = new MemoryMappingTree();
+ final var builder = ImmutableSet.<ClassMapping>builder(); + MappingReader.read(new InputStreamReader(mappingsInputStream, StandardCharsets.UTF_8), MappingFormat.TINY_2, tree);
+ final Set<ClassMapping> classes = new HashSet<>();
+ +
+ for (final ClassDef classDef : tree.getClasses()) { + final StringPool pool = new StringPool();
+ final String obfClassName = classDef.getName(SPIGOT_NAMESPACE).replace('/', '.'); + for (final MappingTree.ClassMapping cls : tree.getClasses()) {
+ final var methodMappings = ImmutableMap.<Pair<String, String>, MethodMapping>builder(); + final Map<String, String> methods = new HashMap<>();
+ +
+ for (final MethodDef methodDef : classDef.getMethods()) { + for (final MappingTree.MethodMapping methodMapping : cls.getMethods()) {
+ final MethodMapping method = new MethodMapping( + methods.put(
+ methodDef.getName(SPIGOT_NAMESPACE), + pool.string(methodKey(
+ methodDef.getName(MOJANG_PLUS_YARN_NAMESPACE), + methodMapping.getName(SPIGOT_NAMESPACE),
+ methodDef.getDescriptor(SPIGOT_NAMESPACE) + methodMapping.getDesc(SPIGOT_NAMESPACE)
+ ); + )),
+ methodMappings.put( + pool.string(methodMapping.getName(MOJANG_PLUS_YARN_NAMESPACE))
+ new Pair<>(method.obfName(), method.descriptor()),
+ method
+ ); + );
+ } + }
+ +
+ final ClassMapping map = new ClassMapping( + final ClassMapping map = new ClassMapping(
+ obfClassName, + cls.getName(SPIGOT_NAMESPACE).replace('/', '.'),
+ classDef.getName(MOJANG_PLUS_YARN_NAMESPACE).replace('/', '.'), + cls.getName(MOJANG_PLUS_YARN_NAMESPACE).replace('/', '.'),
+ methodMappings.build() + Map.copyOf(methods)
+ ); + );
+ builder.add(map); + classes.add(map);
+ } + }
+ +
+ return builder.build(); + return Set.copyOf(classes);
+ } catch (final IOException ex) { + } catch (final IOException ex) {
+ System.err.println("Failed to load mappings for stacktrace deobfuscation."); + System.err.println("Failed to load mappings for stacktrace deobfuscation.");
+ ex.printStackTrace(); + ex.printStackTrace();
@ -295,28 +299,33 @@ index 0000000000000000000000000000000000000000..5ee513c0e2436e6afa3432f9f835d402
+ } + }
+ } + }
+ +
+ public static String methodKey(final String obfName, final String obfDescriptor) {
+ return obfName + obfDescriptor;
+ }
+
+ private static final class StringPool {
+ private final Map<String, String> pool = new HashMap<>();
+
+ public String string(final String string) {
+ return this.pool.computeIfAbsent(string, Function.identity());
+ }
+ }
+
+ public record ClassMapping( + public record ClassMapping(
+ String obfName, + String obfName,
+ String mojangName, + String mojangName,
+ Map<Pair<String, String>, MethodMapping> methodMappings + Map<String, String> methodsByObf
+ ) {}
+
+ public record MethodMapping(
+ String obfName,
+ String mojangName,
+ String descriptor
+ ) {} + ) {}
+} +}
diff --git a/src/main/java/io/papermc/paper/util/StacktraceDeobfuscator.java b/src/main/java/io/papermc/paper/util/StacktraceDeobfuscator.java diff --git a/src/main/java/io/papermc/paper/util/StacktraceDeobfuscator.java b/src/main/java/io/papermc/paper/util/StacktraceDeobfuscator.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..f3099d3cfa4ea8ad56b1abdd0e7b77aaa4465244 index 0000000000000000000000000000000000000000..5019d22fa2ab8d72fac5ffcf5dc2a3715ae63760
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/util/StacktraceDeobfuscator.java +++ b/src/main/java/io/papermc/paper/util/StacktraceDeobfuscator.java
@@ -0,0 +1,156 @@ @@ -0,0 +1,153 @@
+package io.papermc.paper.util; +package io.papermc.paper.util;
+ +
+import com.destroystokyo.paper.PaperConfig; +import com.destroystokyo.paper.PaperConfig;
+import com.mojang.datafixers.util.Pair;
+import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList; +import it.unimi.dsi.fastutil.ints.IntList;
+import java.io.IOException; +import java.io.IOException;
@ -337,9 +346,9 @@ index 0000000000000000000000000000000000000000..f3099d3cfa4ea8ad56b1abdd0e7b77aa
+public enum StacktraceDeobfuscator { +public enum StacktraceDeobfuscator {
+ INSTANCE; + INSTANCE;
+ +
+ private final Map<Class<?>, Map<Pair<String, String>, IntList>> lineMapCache = Collections.synchronizedMap(new LinkedHashMap<>(128, 0.75f, true) { + private final Map<Class<?>, Map<String, IntList>> lineMapCache = Collections.synchronizedMap(new LinkedHashMap<>(128, 0.75f, true) {
+ @Override + @Override
+ protected boolean removeEldestEntry(final Map.Entry<Class<?>, Map<Pair<String, String>, IntList>> eldest) { + protected boolean removeEldestEntry(final Map.Entry<Class<?>, Map<String, IntList>> eldest) {
+ return this.size() > 127; + return this.size() > 127;
+ } + }
+ }); + });
@ -387,17 +396,15 @@ index 0000000000000000000000000000000000000000..f3099d3cfa4ea8ad56b1abdd0e7b77aa
+ } catch (final ClassNotFoundException ex) { + } catch (final ClassNotFoundException ex) {
+ throw new RuntimeException(ex); + throw new RuntimeException(ex);
+ } + }
+ final @Nullable Pair<String, String> nameDescriptorPair = this.determineMethodForLine(clazz, element.getLineNumber()); + final @Nullable String methodKey = this.determineMethodForLine(clazz, element.getLineNumber());
+ final ObfHelper.@Nullable MethodMapping methodMapping = nameDescriptorPair == null + final @Nullable String mappedMethodName = methodKey == null ? null : classMapping.methodsByObf().get(methodKey);
+ ? null
+ : classMapping.methodMappings().get(nameDescriptorPair);
+ +
+ result[i] = new StackTraceElement( + result[i] = new StackTraceElement(
+ element.getClassLoaderName(), + element.getClassLoaderName(),
+ element.getModuleName(), + element.getModuleName(),
+ element.getModuleVersion(), + element.getModuleVersion(),
+ classMapping.mojangName(), + classMapping.mojangName(),
+ methodMapping != null ? methodMapping.mojangName() : methodName, + mappedMethodName != null ? mappedMethodName : methodName,
+ sourceFileName(classMapping.mojangName()), + sourceFileName(classMapping.mojangName()),
+ element.getLineNumber() + element.getLineNumber()
+ ); + );
@ -405,15 +412,15 @@ index 0000000000000000000000000000000000000000..f3099d3cfa4ea8ad56b1abdd0e7b77aa
+ return result; + return result;
+ } + }
+ +
+ private @Nullable Pair<String, String> determineMethodForLine(final Class<?> clazz, final int lineNumber) { + private @Nullable String determineMethodForLine(final Class<?> clazz, final int lineNumber) {
+ final Map<Pair<String, String>, IntList> lineMap = this.lineMapCache.computeIfAbsent(clazz, StacktraceDeobfuscator::buildLineMap); + final Map<String, IntList> lineMap = this.lineMapCache.computeIfAbsent(clazz, StacktraceDeobfuscator::buildLineMap);
+ for (final var entry : lineMap.entrySet()) { + for (final var entry : lineMap.entrySet()) {
+ final Pair<String, String> pair = entry.getKey(); + final String methodKey = entry.getKey();
+ final IntList lines = entry.getValue(); + final IntList lines = entry.getValue();
+ for (int i = 0, linesSize = lines.size(); i < linesSize; i++) { + for (int i = 0, linesSize = lines.size(); i < linesSize; i++) {
+ final int num = lines.getInt(i); + final int num = lines.getInt(i);
+ if (num == lineNumber) { + if (num == lineNumber) {
+ return pair; + return methodKey;
+ } + }
+ } + }
+ } + }
@ -429,8 +436,8 @@ index 0000000000000000000000000000000000000000..f3099d3cfa4ea8ad56b1abdd0e7b77aa
+ return rootClassName + ".java"; + return rootClassName + ".java";
+ } + }
+ +
+ private static Map<Pair<String, String>, IntList> buildLineMap(final Class<?> key) { + private static Map<String, IntList> buildLineMap(final Class<?> key) {
+ final Map<Pair<String, String>, IntList> lineMap = new HashMap<>(); + final Map<String, IntList> lineMap = new HashMap<>();
+ final class LineCollectingMethodVisitor extends MethodVisitor { + final class LineCollectingMethodVisitor extends MethodVisitor {
+ private final IntList lines = new IntArrayList(); + private final IntList lines = new IntArrayList();
+ private final String name; + private final String name;
@ -451,7 +458,7 @@ index 0000000000000000000000000000000000000000..f3099d3cfa4ea8ad56b1abdd0e7b77aa
+ @Override + @Override
+ public void visitEnd() { + public void visitEnd() {
+ super.visitEnd(); + super.visitEnd();
+ lineMap.put(new Pair<>(this.name, this.descriptor), this.lines); + lineMap.put(ObfHelper.methodKey(this.name, this.descriptor), this.lines);
+ } + }
+ } + }
+ final ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM9) { + final ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM9) {

View File

@ -5,12 +5,12 @@ Subject: [PATCH] Implement Mob Goal API
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 7a7a6a1a1bdfecb619dd6ba6f6865eb0bb74d0d9..58c6e444ee8c8cabf8449b0e3b77970edf1d499b 100644 index f802d9e803b406cb9b5b4bce7de6858eba0fae7e..27f8a99f35a22f334e8023c1c9048e3a88a63d6f 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -58,6 +58,7 @@ dependencies { @@ -55,6 +55,7 @@ dependencies {
implementation("org.quiltmc:tiny-mappings-parser:0.3.0") // Paper - needed to read mappings for stacktrace deobfuscation implementation("net.fabricmc:mapping-io:0.3.0") // Paper - needed to read mappings for stacktrace deobfuscation
+ testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test + testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test
testImplementation("junit:junit:4.13.1") testImplementation("junit:junit:4.13.1")

View File

@ -6,10 +6,10 @@ Subject: [PATCH] Add support for hex color codes in console
Converts upstream's hex color code legacy format into actual hex color codes in the console. Converts upstream's hex color code legacy format into actual hex color codes in the console.
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index de4f525573f222426a693b4d28e15caf4a87a210..149607e8c080b79a20d204382db69fde58c6b513 100644 index 57edac376bcbd056fb8fc7f0a433e946bce4ff2e..f3db86346c5e7bf446707a746f3094f7f27e09c4 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -37,6 +37,7 @@ dependencies { @@ -34,6 +34,7 @@ dependencies {
Scanning takes about 1-2 seconds so adding this speeds up the server start. Scanning takes about 1-2 seconds so adding this speeds up the server start.
*/ */
implementation("org.apache.logging.log4j:log4j-core:2.14.1") // Paper - implementation implementation("org.apache.logging.log4j:log4j-core:2.14.1") // Paper - implementation

View File

@ -5,10 +5,10 @@ Subject: [PATCH] Add git branch and commit to manifest
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 3dc4631c9a595c50c0f281897c6953d5a505a8e3..c42f192c5a5557ba4b541e9bd1769b353115d7e8 100644 index 1e4e3c6fbac820fa03e2a6f5d76c008d5879d2e6..c7ebad49e04c36c27341cabc4a024f170d762f3f 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -72,6 +72,7 @@ tasks.jar { @@ -69,6 +69,7 @@ tasks.jar {
val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim() val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim()
val implementationVersion = System.getenv("BUILD_NUMBER") ?: "\"$gitHash\"" val implementationVersion = System.getenv("BUILD_NUMBER") ?: "\"$gitHash\""
val date = git("show", "-s", "--format=%ci", gitHash).getText().trim() // Paper val date = git("show", "-s", "--format=%ci", gitHash).getText().trim() // Paper
@ -16,7 +16,7 @@ index 3dc4631c9a595c50c0f281897c6953d5a505a8e3..c42f192c5a5557ba4b541e9bd1769b35
attributes( attributes(
"Main-Class" to "org.bukkit.craftbukkit.Main", "Main-Class" to "org.bukkit.craftbukkit.Main",
"Implementation-Title" to "CraftBukkit", "Implementation-Title" to "CraftBukkit",
@@ -81,6 +82,8 @@ tasks.jar { @@ -78,6 +79,8 @@ tasks.jar {
"Specification-Version" to project.version, "Specification-Version" to project.version,
"Specification-Vendor" to "Bukkit Team", "Specification-Vendor" to "Bukkit Team",
"Multi-Release" to "true", // Paper "Multi-Release" to "true", // Paper

View File

@ -5,13 +5,13 @@ Subject: [PATCH] Use Velocity compression and cipher natives
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index c42f192c5a5557ba4b541e9bd1769b353115d7e8..d78267e02a705ffa9083815da0df042d3a184837 100644 index c7ebad49e04c36c27341cabc4a024f170d762f3f..f46f11c32560da6f4955284d93da3dd7e22555a3 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -58,6 +58,7 @@ dependencies { @@ -55,6 +55,7 @@ dependencies {
implementation("io.netty:netty-all:4.1.65.Final") // Paper implementation("io.netty:netty-all:4.1.65.Final") // Paper
implementation("org.quiltmc:tiny-mappings-parser:0.3.0") // Paper - needed to read mappings for stacktrace deobfuscation implementation("net.fabricmc:mapping-io:0.3.0") // Paper - needed to read mappings for stacktrace deobfuscation
+ implementation("com.velocitypowered:velocity-native:1.1.0-SNAPSHOT") // Paper + implementation("com.velocitypowered:velocity-native:1.1.0-SNAPSHOT") // Paper
testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test