Merge branch 'master' into new-block-api

This commit is contained in:
TheMode 2021-06-20 21:00:39 +02:00
commit 3bb5801ec7
4 changed files with 44 additions and 38 deletions

View File

@ -36,9 +36,6 @@ allprojects {
name 'sponge' name 'sponge'
url 'https://repo.spongepowered.org/maven' url 'https://repo.spongepowered.org/maven'
} }
maven {
url "https://repo.velocitypowered.com/snapshots/"
}
} }
javadoc { javadoc {
options { options {
@ -150,9 +147,6 @@ dependencies {
api "org.ow2.asm:asm-commons:${asmVersion}" api "org.ow2.asm:asm-commons:${asmVersion}"
api "org.spongepowered:mixin:${mixinVersion}" api "org.spongepowered:mixin:${mixinVersion}"
// Compression
implementation "com.velocitypowered:velocity-native:1.1.0-SNAPSHOT"
// Path finding // Path finding
api 'com.github.MadMartian:hydrazine-path-finding:1.6.0' api 'com.github.MadMartian:hydrazine-path-finding:1.6.0'

View File

@ -29,6 +29,7 @@ import java.net.URL;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
public class ExtensionManager { public class ExtensionManager {
@ -379,8 +380,14 @@ public class ExtensionManager {
*/ */
@Nullable @Nullable
private DiscoveredExtension discoverFromJar(@NotNull File file) { private DiscoveredExtension discoverFromJar(@NotNull File file) {
try (ZipFile f = new ZipFile(file); try (ZipFile f = new ZipFile(file);) {
InputStreamReader reader = new InputStreamReader(f.getInputStream(f.getEntry("extension.json")))) {
ZipEntry entry = f.getEntry("extension.json");
if (entry == null)
throw new IllegalStateException("Missing extension.json in extension " + file.getName() + ".");
InputStreamReader reader = new InputStreamReader(f.getInputStream(entry));
// Initialize DiscoveredExtension from GSON. // Initialize DiscoveredExtension from GSON.
DiscoveredExtension extension = GSON.fromJson(reader, DiscoveredExtension.class); DiscoveredExtension extension = GSON.fromJson(reader, DiscoveredExtension.class);

View File

@ -16,10 +16,8 @@
package net.minestom.server.network.netty.codec; package net.minestom.server.network.netty.codec;
import com.velocitypowered.natives.compression.VelocityCompressor;
import com.velocitypowered.natives.util.MoreByteBufUtils;
import com.velocitypowered.natives.util.Natives;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageCodec; import io.netty.handler.codec.ByteToMessageCodec;
import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.DecoderException;
@ -27,6 +25,8 @@ import net.minestom.server.utils.PacketUtils;
import net.minestom.server.utils.Utils; import net.minestom.server.utils.Utils;
import java.util.List; import java.util.List;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
public class PacketCompressor extends ByteToMessageCodec<ByteBuf> { public class PacketCompressor extends ByteToMessageCodec<ByteBuf> {
@ -34,7 +34,8 @@ public class PacketCompressor extends ByteToMessageCodec<ByteBuf> {
private final int threshold; private final int threshold;
private final VelocityCompressor compressor = Natives.compress.get().create(4); private final Deflater deflater = new Deflater();
private final Inflater inflater = new Inflater();
public PacketCompressor(int threshold) { public PacketCompressor(int threshold) {
this.threshold = threshold; this.threshold = threshold;
@ -42,7 +43,7 @@ public class PacketCompressor extends ByteToMessageCodec<ByteBuf> {
@Override @Override
protected void encode(ChannelHandlerContext ctx, ByteBuf from, ByteBuf to) { protected void encode(ChannelHandlerContext ctx, ByteBuf from, ByteBuf to) {
PacketUtils.compressBuffer(compressor, from, to); PacketUtils.compressBuffer(deflater, from, to);
} }
@Override @Override
@ -61,19 +62,17 @@ public class PacketCompressor extends ByteToMessageCodec<ByteBuf> {
throw new DecoderException("Badly compressed packet - size of " + claimedUncompressedSize + " is larger than protocol maximum of " + MAX_SIZE); throw new DecoderException("Badly compressed packet - size of " + claimedUncompressedSize + " is larger than protocol maximum of " + MAX_SIZE);
} }
// TODO optimize to do not initialize arrays each time
ByteBuf compatibleIn = MoreByteBufUtils.ensureCompatible(ctx.alloc(), compressor, in); byte[] input = new byte[in.readableBytes()];
ByteBuf uncompressed = MoreByteBufUtils.preferredBuffer(ctx.alloc(), compressor, claimedUncompressedSize); in.readBytes(input);
try {
compressor.inflate(compatibleIn, uncompressed, claimedUncompressedSize); inflater.setInput(input);
out.add(uncompressed); byte[] output = new byte[claimedUncompressedSize];
in.clear(); inflater.inflate(output);
} catch (Exception e) { inflater.reset();
uncompressed.release();
throw e; out.add(Unpooled.wrappedBuffer(output));
} finally {
compatibleIn.release();
}
} }
} }
} }

View File

@ -1,12 +1,9 @@
package net.minestom.server.utils; package net.minestom.server.utils;
import com.velocitypowered.natives.compression.VelocityCompressor;
import com.velocitypowered.natives.util.Natives;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.audience.ForwardingAudience; import net.kyori.adventure.audience.ForwardingAudience;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.adventure.AdventureSerializer;
import net.minestom.server.adventure.MinestomAdventure; import net.minestom.server.adventure.MinestomAdventure;
import net.minestom.server.adventure.audience.PacketGroupingAudience; import net.minestom.server.adventure.audience.PacketGroupingAudience;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
@ -21,8 +18,9 @@ import net.minestom.server.utils.callback.validator.PlayerValidator;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.nio.ByteBuffer;
import java.util.Collection; import java.util.Collection;
import java.util.zip.DataFormatException; import java.util.zip.Deflater;
/** /**
* Utils class for packets. Including writing a {@link ServerPacket} into a {@link ByteBuf} * Utils class for packets. Including writing a {@link ServerPacket} into a {@link ByteBuf}
@ -31,7 +29,7 @@ import java.util.zip.DataFormatException;
public final class PacketUtils { public final class PacketUtils {
private static final PacketListenerManager PACKET_LISTENER_MANAGER = MinecraftServer.getPacketListenerManager(); private static final PacketListenerManager PACKET_LISTENER_MANAGER = MinecraftServer.getPacketListenerManager();
private static final ThreadLocal<VelocityCompressor> COMPRESSOR = ThreadLocal.withInitial(() -> Natives.compress.get().create(4)); private static final ThreadLocal<Deflater> COMPRESSOR = ThreadLocal.withInitial(Deflater::new);
private PacketUtils() { private PacketUtils() {
} }
@ -189,27 +187,35 @@ public final class PacketUtils {
* <p> * <p>
* {@code packetBuffer} needs to be the packet content without any header (if you want to use it to write a Minecraft packet). * {@code packetBuffer} needs to be the packet content without any header (if you want to use it to write a Minecraft packet).
* *
* @param compressor the deflater for zlib compression * @param deflater the deflater for zlib compression
* @param packetBuffer the buffer containing all the packet fields * @param packetBuffer the buffer containing all the packet fields
* @param compressionTarget the buffer which will receive the compressed version of {@code packetBuffer} * @param compressionTarget the buffer which will receive the compressed version of {@code packetBuffer}
*/ */
public static void compressBuffer(@NotNull VelocityCompressor compressor, @NotNull ByteBuf packetBuffer, @NotNull ByteBuf compressionTarget) { public static void compressBuffer(@NotNull Deflater deflater, @NotNull ByteBuf packetBuffer, @NotNull ByteBuf compressionTarget) {
final int packetLength = packetBuffer.readableBytes(); final int packetLength = packetBuffer.readableBytes();
final boolean compression = packetLength > MinecraftServer.getCompressionThreshold(); final boolean compression = packetLength > MinecraftServer.getCompressionThreshold();
Utils.writeVarInt(compressionTarget, compression ? packetLength : 0); Utils.writeVarInt(compressionTarget, compression ? packetLength : 0);
if (compression) { if (compression) {
compress(compressor, packetBuffer, compressionTarget); compress(deflater, packetBuffer, compressionTarget);
} else { } else {
compressionTarget.writeBytes(packetBuffer); compressionTarget.writeBytes(packetBuffer);
} }
} }
private static void compress(@NotNull VelocityCompressor compressor, @NotNull ByteBuf uncompressed, @NotNull ByteBuf compressed) { private static void compress(@NotNull Deflater deflater, @NotNull ByteBuf uncompressed, @NotNull ByteBuf compressed) {
try { deflater.setInput(uncompressed.nioBuffer());
compressor.deflate(uncompressed, compressed); deflater.finish();
} catch (DataFormatException e) {
e.printStackTrace(); while (!deflater.finished()) {
ByteBuffer nioBuffer = compressed.nioBuffer(compressed.writerIndex(), compressed.writableBytes());
compressed.writerIndex(deflater.deflate(nioBuffer) + compressed.writerIndex());
if (compressed.writableBytes() == 0) {
compressed.ensureWritable(8192);
}
} }
deflater.reset();
} }
public static void writeFramedPacket(@NotNull ByteBuf buffer, public static void writeFramedPacket(@NotNull ByteBuf buffer,