mirror of
https://github.com/ViaVersion/ViaVersion.git
synced 2024-12-26 02:17:40 +01:00
Merge pull request #1313 from creeper123123321/master
Send light update before chunk packet, maybe better ByteBuf releasing…
This commit is contained in:
commit
b04acf98c7
@ -10,10 +10,12 @@ import us.myles.ViaVersion.api.protocol.Protocol;
|
|||||||
import us.myles.ViaVersion.api.remapper.ValueCreator;
|
import us.myles.ViaVersion.api.remapper.ValueCreator;
|
||||||
import us.myles.ViaVersion.api.type.Type;
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
import us.myles.ViaVersion.api.type.TypeConverter;
|
import us.myles.ViaVersion.api.type.TypeConverter;
|
||||||
|
import us.myles.ViaVersion.exception.CancelException;
|
||||||
import us.myles.ViaVersion.exception.InformativeException;
|
import us.myles.ViaVersion.exception.InformativeException;
|
||||||
import us.myles.ViaVersion.packets.Direction;
|
import us.myles.ViaVersion.packets.Direction;
|
||||||
import us.myles.ViaVersion.packets.State;
|
import us.myles.ViaVersion.packets.State;
|
||||||
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
||||||
|
import us.myles.ViaVersion.util.PipelineUtil;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -298,8 +300,14 @@ public class PacketWrapper {
|
|||||||
*/
|
*/
|
||||||
public void send(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline, boolean currentThread) throws Exception {
|
public void send(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline, boolean currentThread) throws Exception {
|
||||||
if (!isCancelled()) {
|
if (!isCancelled()) {
|
||||||
ByteBuf output = constructPacket(packetProtocol, skipCurrentPipeline, Direction.OUTGOING);
|
try {
|
||||||
user().sendRawPacket(output, currentThread);
|
ByteBuf output = constructPacket(packetProtocol, skipCurrentPipeline, Direction.OUTGOING);
|
||||||
|
user().sendRawPacket(output, currentThread);
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (!PipelineUtil.containsCause(e, CancelException.class)) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -493,8 +501,14 @@ public class PacketWrapper {
|
|||||||
*/
|
*/
|
||||||
public void sendToServer(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline, boolean currentThread) throws Exception {
|
public void sendToServer(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline, boolean currentThread) throws Exception {
|
||||||
if (!isCancelled()) {
|
if (!isCancelled()) {
|
||||||
ByteBuf output = constructPacket(packetProtocol, skipCurrentPipeline, Direction.INCOMING);
|
try {
|
||||||
user().sendRawPacketToServer(output, currentThread);
|
ByteBuf output = constructPacket(packetProtocol, skipCurrentPipeline, Direction.INCOMING);
|
||||||
|
user().sendRawPacketToServer(output, currentThread);
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (!PipelineUtil.containsCause(e, CancelException.class)) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,32 +214,41 @@ public class UserConnection {
|
|||||||
public void sendRawPacketToServer(final ByteBuf packet, boolean currentThread) {
|
public void sendRawPacketToServer(final ByteBuf packet, boolean currentThread) {
|
||||||
final ByteBuf buf = packet.alloc().buffer();
|
final ByteBuf buf = packet.alloc().buffer();
|
||||||
try {
|
try {
|
||||||
Type.VAR_INT.write(buf, PacketWrapper.PASSTHROUGH_ID);
|
try {
|
||||||
} catch (Exception e) {
|
Type.VAR_INT.write(buf, PacketWrapper.PASSTHROUGH_ID);
|
||||||
// Should not happen
|
} catch (Exception e) {
|
||||||
Via.getPlatform().getLogger().warning("Type.VAR_INT.write thrown an exception: " + e);
|
// Should not happen
|
||||||
}
|
Via.getPlatform().getLogger().warning("Type.VAR_INT.write thrown an exception: " + e);
|
||||||
buf.writeBytes(packet);
|
|
||||||
packet.release();
|
|
||||||
final ChannelHandlerContext context = PipelineUtil
|
|
||||||
.getPreviousContext(Via.getManager().getInjector().getDecoderName(), getChannel().pipeline());
|
|
||||||
if (currentThread) {
|
|
||||||
if (context != null) {
|
|
||||||
context.fireChannelRead(buf);
|
|
||||||
} else {
|
|
||||||
getChannel().pipeline().fireChannelRead(buf);
|
|
||||||
}
|
}
|
||||||
} else {
|
buf.writeBytes(packet);
|
||||||
channel.eventLoop().submit(new Runnable() {
|
final ChannelHandlerContext context = PipelineUtil
|
||||||
@Override
|
.getPreviousContext(Via.getManager().getInjector().getDecoderName(), getChannel().pipeline());
|
||||||
public void run() {
|
if (currentThread) {
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
context.fireChannelRead(buf);
|
context.fireChannelRead(buf);
|
||||||
} else {
|
} else {
|
||||||
getChannel().pipeline().fireChannelRead(buf);
|
getChannel().pipeline().fireChannelRead(buf);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
} else {
|
||||||
|
try {
|
||||||
|
channel.eventLoop().submit(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (context != null) {
|
||||||
|
context.fireChannelRead(buf);
|
||||||
|
} else {
|
||||||
|
getChannel().pipeline().fireChannelRead(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
// Couldn't schedule
|
||||||
|
buf.release();
|
||||||
|
throw t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
packet.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,20 +81,23 @@ public class Chunk1_13Type extends PartialType<Chunk, ClientWorld> {
|
|||||||
Type.VAR_INT.write(output, chunk.getBitmask());
|
Type.VAR_INT.write(output, chunk.getBitmask());
|
||||||
|
|
||||||
ByteBuf buf = output.alloc().buffer();
|
ByteBuf buf = output.alloc().buffer();
|
||||||
for (int i = 0; i < 16; i++) {
|
try {
|
||||||
ChunkSection section = chunk.getSections()[i];
|
for (int i = 0; i < 16; i++) {
|
||||||
if (section == null) continue; // Section not set
|
ChunkSection section = chunk.getSections()[i];
|
||||||
Types1_13.CHUNK_SECTION.write(buf, section);
|
if (section == null) continue; // Section not set
|
||||||
section.writeBlockLight(buf);
|
Types1_13.CHUNK_SECTION.write(buf, section);
|
||||||
|
section.writeBlockLight(buf);
|
||||||
|
|
||||||
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
||||||
section.writeSkyLight(buf);
|
section.writeSkyLight(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
buf.readerIndex(0);
|
||||||
|
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 * 4 : 0));
|
||||||
|
output.writeBytes(buf);
|
||||||
|
} finally {
|
||||||
|
buf.release(); // release buffer
|
||||||
}
|
}
|
||||||
buf.readerIndex(0);
|
|
||||||
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 * 4 : 0));
|
|
||||||
output.writeBytes(buf);
|
|
||||||
buf.release(); // release buffer
|
|
||||||
|
|
||||||
// Write biome data
|
// Write biome data
|
||||||
if (chunk.isBiomeData()) {
|
if (chunk.isBiomeData()) {
|
||||||
|
@ -184,8 +184,8 @@ public class WorldPackets {
|
|||||||
}
|
}
|
||||||
lightPacket.write(Type.VAR_INT, skyLightMask);
|
lightPacket.write(Type.VAR_INT, skyLightMask);
|
||||||
lightPacket.write(Type.VAR_INT, blockLightMask);
|
lightPacket.write(Type.VAR_INT, blockLightMask);
|
||||||
lightPacket.write(Type.VAR_INT, 0); //TODO find out what these two bitmasks mean
|
lightPacket.write(Type.VAR_INT, 0); // empty sky light mask
|
||||||
lightPacket.write(Type.VAR_INT, 0); //TODO
|
lightPacket.write(Type.VAR_INT, 0); // empty block light mask
|
||||||
for (ChunkSection section : chunk.getSections()) {
|
for (ChunkSection section : chunk.getSections()) {
|
||||||
if (section == null || !section.hasSkyLight()) continue;
|
if (section == null || !section.hasSkyLight()) continue;
|
||||||
lightPacket.write(Type.BYTE_ARRAY, Bytes.asList(section.getSkyLight()).toArray(new Byte[0]));
|
lightPacket.write(Type.BYTE_ARRAY, Bytes.asList(section.getSkyLight()).toArray(new Byte[0]));
|
||||||
@ -209,7 +209,7 @@ public class WorldPackets {
|
|||||||
entityTracker.setChunkCenterZ(chunk.getZ());
|
entityTracker.setChunkCenterZ(chunk.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
lightPacket.send(Protocol1_14To1_13_2.class, true, false);
|
lightPacket.send(Protocol1_14To1_13_2.class, true, true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -81,16 +81,19 @@ public class Chunk1_14Type extends PartialType<Chunk, ClientWorld> {
|
|||||||
Type.NBT.write(output, chunk.getHeightMap());
|
Type.NBT.write(output, chunk.getHeightMap());
|
||||||
|
|
||||||
ByteBuf buf = output.alloc().buffer();
|
ByteBuf buf = output.alloc().buffer();
|
||||||
for (int i = 0; i < 16; i++) {
|
try {
|
||||||
ChunkSection section = chunk.getSections()[i];
|
for (int i = 0; i < 16; i++) {
|
||||||
if (section == null) continue; // Section not set
|
ChunkSection section = chunk.getSections()[i];
|
||||||
buf.writeShort(section.getNonAirBlocksCount());
|
if (section == null) continue; // Section not set
|
||||||
Types1_13.CHUNK_SECTION.write(buf, section);
|
buf.writeShort(section.getNonAirBlocksCount());
|
||||||
|
Types1_13.CHUNK_SECTION.write(buf, section);
|
||||||
|
}
|
||||||
|
buf.readerIndex(0);
|
||||||
|
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 * 4 : 0));
|
||||||
|
output.writeBytes(buf);
|
||||||
|
} finally {
|
||||||
|
buf.release(); // release buffer
|
||||||
}
|
}
|
||||||
buf.readerIndex(0);
|
|
||||||
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 * 4 : 0));
|
|
||||||
output.writeBytes(buf);
|
|
||||||
buf.release(); // release buffer
|
|
||||||
|
|
||||||
// Write biome data
|
// Write biome data
|
||||||
if (chunk.isBiomeData()) {
|
if (chunk.isBiomeData()) {
|
||||||
|
@ -82,20 +82,23 @@ public class Chunk1_9_3_4Type extends PartialType<Chunk, ClientWorld> {
|
|||||||
Type.VAR_INT.write(output, chunk.getBitmask());
|
Type.VAR_INT.write(output, chunk.getBitmask());
|
||||||
|
|
||||||
ByteBuf buf = output.alloc().buffer();
|
ByteBuf buf = output.alloc().buffer();
|
||||||
for (int i = 0; i < 16; i++) {
|
try {
|
||||||
ChunkSection section = chunk.getSections()[i];
|
for (int i = 0; i < 16; i++) {
|
||||||
if (section == null) continue; // Section not set
|
ChunkSection section = chunk.getSections()[i];
|
||||||
Types1_9.CHUNK_SECTION.write(buf, section);
|
if (section == null) continue; // Section not set
|
||||||
section.writeBlockLight(buf);
|
Types1_9.CHUNK_SECTION.write(buf, section);
|
||||||
|
section.writeBlockLight(buf);
|
||||||
|
|
||||||
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
||||||
section.writeSkyLight(buf);
|
section.writeSkyLight(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
buf.readerIndex(0);
|
||||||
|
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 : 0));
|
||||||
|
output.writeBytes(buf);
|
||||||
|
} finally {
|
||||||
|
buf.release(); // release buffer
|
||||||
}
|
}
|
||||||
buf.readerIndex(0);
|
|
||||||
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 : 0));
|
|
||||||
output.writeBytes(buf);
|
|
||||||
buf.release(); // release buffer
|
|
||||||
|
|
||||||
// Write biome data
|
// Write biome data
|
||||||
if (chunk.isBiomeData()) {
|
if (chunk.isBiomeData()) {
|
||||||
|
@ -78,20 +78,23 @@ public class Chunk1_9_1_2Type extends PartialType<Chunk, ClientWorld> {
|
|||||||
Type.VAR_INT.write(output, chunk.getBitmask());
|
Type.VAR_INT.write(output, chunk.getBitmask());
|
||||||
|
|
||||||
ByteBuf buf = output.alloc().buffer();
|
ByteBuf buf = output.alloc().buffer();
|
||||||
for (int i = 0; i < 16; i++) {
|
try {
|
||||||
ChunkSection section = chunk.getSections()[i];
|
for (int i = 0; i < 16; i++) {
|
||||||
if (section == null) continue; // Section not set
|
ChunkSection section = chunk.getSections()[i];
|
||||||
Types1_9.CHUNK_SECTION.write(buf, section);
|
if (section == null) continue; // Section not set
|
||||||
section.writeBlockLight(buf);
|
Types1_9.CHUNK_SECTION.write(buf, section);
|
||||||
|
section.writeBlockLight(buf);
|
||||||
|
|
||||||
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
||||||
section.writeSkyLight(buf);
|
section.writeSkyLight(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
buf.readerIndex(0);
|
||||||
|
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 : 0));
|
||||||
|
output.writeBytes(buf);
|
||||||
|
} finally {
|
||||||
|
buf.release(); // release buffer
|
||||||
}
|
}
|
||||||
buf.readerIndex(0);
|
|
||||||
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.isBiomeData() ? 256 : 0));
|
|
||||||
output.writeBytes(buf);
|
|
||||||
buf.release(); // release buffer
|
|
||||||
|
|
||||||
// Write biome data
|
// Write biome data
|
||||||
if (chunk.isBiomeData()) {
|
if (chunk.isBiomeData()) {
|
||||||
|
@ -17,7 +17,6 @@ import us.myles.ViaVersion.api.type.Type;
|
|||||||
import us.myles.ViaVersion.packets.State;
|
import us.myles.ViaVersion.packets.State;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter;
|
import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
||||||
import us.myles.ViaVersion.api.minecraft.chunks.Chunk1_8;
|
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider;
|
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.CommandBlockProvider;
|
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.CommandBlockProvider;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9to1_8.sounds.Effect;
|
import us.myles.ViaVersion.protocols.protocol1_9to1_8.sounds.Effect;
|
||||||
@ -163,11 +162,14 @@ public class WorldPackets {
|
|||||||
|
|
||||||
PacketWrapper output = (PacketWrapper) obj;
|
PacketWrapper output = (PacketWrapper) obj;
|
||||||
ByteBuf buffer = wrapper.user().getChannel().alloc().buffer();
|
ByteBuf buffer = wrapper.user().getChannel().alloc().buffer();
|
||||||
output.setId(-1); // -1 for no writing of id
|
try {
|
||||||
output.writeToBuffer(buffer);
|
output.setId(-1); // -1 for no writing of id
|
||||||
PacketWrapper chunkPacket = new PacketWrapper(0x21, buffer, wrapper.user());
|
output.writeToBuffer(buffer);
|
||||||
chunkPacket.send(Protocol1_9To1_8.class, false, true);
|
PacketWrapper chunkPacket = new PacketWrapper(0x21, buffer, wrapper.user());
|
||||||
buffer.release();
|
chunkPacket.send(Protocol1_9To1_8.class, false, true);
|
||||||
|
} finally {
|
||||||
|
buffer.release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -141,20 +141,23 @@ public class Chunk1_9to1_8Type extends PartialType<Chunk, ClientChunks> {
|
|||||||
Type.VAR_INT.write(output, chunk.getBitmask());
|
Type.VAR_INT.write(output, chunk.getBitmask());
|
||||||
|
|
||||||
ByteBuf buf = output.alloc().buffer();
|
ByteBuf buf = output.alloc().buffer();
|
||||||
for (int i = 0; i < SECTION_COUNT; i++) {
|
try {
|
||||||
ChunkSection section = chunk.getSections()[i];
|
for (int i = 0; i < SECTION_COUNT; i++) {
|
||||||
if (section == null) continue; // Section not set
|
ChunkSection section = chunk.getSections()[i];
|
||||||
Types1_9.CHUNK_SECTION.write(buf, section);
|
if (section == null) continue; // Section not set
|
||||||
section.writeBlockLight(buf);
|
Types1_9.CHUNK_SECTION.write(buf, section);
|
||||||
|
section.writeBlockLight(buf);
|
||||||
|
|
||||||
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
if (!section.hasSkyLight()) continue; // No sky light, we're done here.
|
||||||
section.writeSkyLight(buf);
|
section.writeSkyLight(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
buf.readerIndex(0);
|
||||||
|
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.hasBiomeData() ? 256 : 0));
|
||||||
|
output.writeBytes(buf);
|
||||||
|
} finally {
|
||||||
|
buf.release(); // release buffer
|
||||||
}
|
}
|
||||||
buf.readerIndex(0);
|
|
||||||
Type.VAR_INT.write(output, buf.readableBytes() + (chunk.hasBiomeData() ? 256 : 0));
|
|
||||||
output.writeBytes(buf);
|
|
||||||
buf.release(); // release buffer
|
|
||||||
|
|
||||||
// Write biome data
|
// Write biome data
|
||||||
if (chunk.hasBiomeData()) {
|
if (chunk.hasBiomeData()) {
|
||||||
|
@ -6,7 +6,6 @@ import io.netty.channel.ChannelPipeline;
|
|||||||
import io.netty.handler.codec.ByteToMessageDecoder;
|
import io.netty.handler.codec.ByteToMessageDecoder;
|
||||||
import io.netty.handler.codec.MessageToByteEncoder;
|
import io.netty.handler.codec.MessageToByteEncoder;
|
||||||
import io.netty.handler.codec.MessageToMessageDecoder;
|
import io.netty.handler.codec.MessageToMessageDecoder;
|
||||||
import io.netty.handler.codec.MessageToMessageEncoder;
|
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -90,14 +89,15 @@ public class PipelineUtil {
|
|||||||
*
|
*
|
||||||
* @param t The throwable
|
* @param t The throwable
|
||||||
* @param c The exception to look for
|
* @param c The exception to look for
|
||||||
* @return True if the stack trace contained it as its cause.
|
* @return True if the stack trace contained it as its cause or if t is an instance of c.
|
||||||
*/
|
*/
|
||||||
public static boolean containsCause(Throwable t, Class<? extends Throwable> c) {
|
public static boolean containsCause(Throwable t, Class<? extends Throwable> c) {
|
||||||
while (t != null) {
|
do {
|
||||||
t = t.getCause();
|
if (t != null) {
|
||||||
if (t != null)
|
|
||||||
if (c.isAssignableFrom(t.getClass())) return true;
|
if (c.isAssignableFrom(t.getClass())) return true;
|
||||||
}
|
t = t.getCause();
|
||||||
|
}
|
||||||
|
} while (t != null);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,8 +77,11 @@ public class VelocityEncodeHandler extends MessageToMessageEncoder<ByteBuf> {
|
|||||||
if (needsCompress) {
|
if (needsCompress) {
|
||||||
ByteBuf old = bytebuf;
|
ByteBuf old = bytebuf;
|
||||||
bytebuf = ctx.alloc().buffer();
|
bytebuf = ctx.alloc().buffer();
|
||||||
PipelineUtil.callEncode((MessageToByteEncoder) ctx.pipeline().get("compression-encoder"), ctx, old, bytebuf);
|
try {
|
||||||
old.release();
|
PipelineUtil.callEncode((MessageToByteEncoder) ctx.pipeline().get("compression-encoder"), ctx, old, bytebuf);
|
||||||
|
} finally {
|
||||||
|
old.release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
out.add(bytebuf);
|
out.add(bytebuf);
|
||||||
}
|
}
|
||||||
|
@ -100,99 +100,102 @@ public class VelocityServerHandler {
|
|||||||
|
|
||||||
user.getVelocityLock().writeLock().lock();
|
user.getVelocityLock().writeLock().lock();
|
||||||
|
|
||||||
VelocityStorage storage = user.get(VelocityStorage.class);
|
try {
|
||||||
|
VelocityStorage storage = user.get(VelocityStorage.class);
|
||||||
|
|
||||||
if (e.getServer() != null) {
|
if (e.getServer() != null) {
|
||||||
if (!e.getServer().getServerInfo().getName().equals(storage.getCurrentServer())) {
|
if (!e.getServer().getServerInfo().getName().equals(storage.getCurrentServer())) {
|
||||||
String serverName = e.getServer().getServerInfo().getName();
|
String serverName = e.getServer().getServerInfo().getName();
|
||||||
|
|
||||||
storage.setCurrentServer(serverName);
|
storage.setCurrentServer(serverName);
|
||||||
|
|
||||||
int protocolId = ProtocolDetectorService.getProtocolId(serverName);
|
int protocolId = ProtocolDetectorService.getProtocolId(serverName);
|
||||||
|
|
||||||
if (protocolId <= ProtocolVersion.MINECRAFT_1_8.getProtocol()) { // 1.8 doesn't have BossBar packet
|
if (protocolId <= ProtocolVersion.MINECRAFT_1_8.getProtocol()) { // 1.8 doesn't have BossBar packet
|
||||||
if (storage.getBossbar() != null) {
|
if (storage.getBossbar() != null) {
|
||||||
for (UUID uuid : storage.getBossbar()) {
|
for (UUID uuid : storage.getBossbar()) {
|
||||||
PacketWrapper wrapper = new PacketWrapper(0x0C, null, user);
|
PacketWrapper wrapper = new PacketWrapper(0x0C, null, user);
|
||||||
wrapper.write(Type.UUID, uuid);
|
wrapper.write(Type.UUID, uuid);
|
||||||
wrapper.write(Type.VAR_INT, 1); // remove
|
wrapper.write(Type.VAR_INT, 1); // remove
|
||||||
wrapper.send(Protocol1_9To1_8.class, true, true);
|
wrapper.send(Protocol1_9To1_8.class, true, true);
|
||||||
}
|
|
||||||
storage.getBossbar().clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ProtocolInfo info = user.get(ProtocolInfo.class);
|
|
||||||
int previousServerProtocol = info.getServerProtocolVersion();
|
|
||||||
|
|
||||||
// Refresh the pipes
|
|
||||||
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId);
|
|
||||||
ProtocolPipeline pipeline = user.get(ProtocolInfo.class).getPipeline();
|
|
||||||
user.clearStoredObjects();
|
|
||||||
pipeline.cleanPipes();
|
|
||||||
if (protocols == null) {
|
|
||||||
// TODO Check Bungee Supported Protocols? *shrugs*
|
|
||||||
protocolId = info.getProtocolVersion();
|
|
||||||
} else {
|
|
||||||
for (Pair<Integer, Protocol> prot : protocols) {
|
|
||||||
pipeline.add(prot.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
info.setServerProtocolVersion(protocolId);
|
|
||||||
// Add version-specific base Protocol
|
|
||||||
pipeline.add(ProtocolRegistry.getBaseProtocol(protocolId));
|
|
||||||
|
|
||||||
// Workaround 1.13 server change
|
|
||||||
Object sessionHandler = ReflectionUtil.invoke(
|
|
||||||
getMinecraftConnection.invoke(e.getPlayer()),
|
|
||||||
"getSessionHandler"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (clientPlaySessionHandler.isInstance(sessionHandler)) { // It may be InitialConnectSessionHandler on the first server connection
|
|
||||||
Set<String> knownChannels = (Set<String>) getKnownChannels.invoke(sessionHandler);
|
|
||||||
if (previousServerProtocol != -1) {
|
|
||||||
int id1_13 = ProtocolVersion.MINECRAFT_1_13.getProtocol();
|
|
||||||
if (previousServerProtocol < id1_13 && protocolId >= id1_13) {
|
|
||||||
ArrayList<String> newChannels = new ArrayList<>();
|
|
||||||
for (String oldChannel : knownChannels) {
|
|
||||||
String transformed = InventoryPackets.getNewPluginChannelId(oldChannel);
|
|
||||||
if (transformed != null) {
|
|
||||||
newChannels.add(transformed);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
knownChannels.clear();
|
storage.getBossbar().clear();
|
||||||
knownChannels.addAll(newChannels);
|
|
||||||
} else if (previousServerProtocol >= id1_13 && protocolId < id1_13) {
|
|
||||||
ArrayList<String> newChannels = new ArrayList<>();
|
|
||||||
for (String oldChannel : knownChannels) {
|
|
||||||
String transformed = InventoryPackets.getOldPluginChannelId(oldChannel);
|
|
||||||
if (transformed != null) {
|
|
||||||
newChannels.add(transformed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
knownChannels.clear();
|
|
||||||
knownChannels.addAll(newChannels);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProtocolInfo info = user.get(ProtocolInfo.class);
|
||||||
|
int previousServerProtocol = info.getServerProtocolVersion();
|
||||||
|
|
||||||
|
// Refresh the pipes
|
||||||
|
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId);
|
||||||
|
ProtocolPipeline pipeline = user.get(ProtocolInfo.class).getPipeline();
|
||||||
|
user.clearStoredObjects();
|
||||||
|
pipeline.cleanPipes();
|
||||||
|
if (protocols == null) {
|
||||||
|
// TODO Check Bungee Supported Protocols? *shrugs*
|
||||||
|
protocolId = info.getProtocolVersion();
|
||||||
|
} else {
|
||||||
|
for (Pair<Integer, Protocol> prot : protocols) {
|
||||||
|
pipeline.add(prot.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
info.setServerProtocolVersion(protocolId);
|
||||||
|
// Add version-specific base Protocol
|
||||||
|
pipeline.add(ProtocolRegistry.getBaseProtocol(protocolId));
|
||||||
|
|
||||||
|
// Workaround 1.13 server change
|
||||||
|
Object sessionHandler = ReflectionUtil.invoke(
|
||||||
|
getMinecraftConnection.invoke(e.getPlayer()),
|
||||||
|
"getSessionHandler"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (clientPlaySessionHandler.isInstance(sessionHandler)) { // It may be InitialConnectSessionHandler on the first server connection
|
||||||
|
Set<String> knownChannels = (Set<String>) getKnownChannels.invoke(sessionHandler);
|
||||||
|
if (previousServerProtocol != -1) {
|
||||||
|
int id1_13 = ProtocolVersion.MINECRAFT_1_13.getProtocol();
|
||||||
|
if (previousServerProtocol < id1_13 && protocolId >= id1_13) {
|
||||||
|
ArrayList<String> newChannels = new ArrayList<>();
|
||||||
|
for (String oldChannel : knownChannels) {
|
||||||
|
String transformed = InventoryPackets.getNewPluginChannelId(oldChannel);
|
||||||
|
if (transformed != null) {
|
||||||
|
newChannels.add(transformed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
knownChannels.clear();
|
||||||
|
knownChannels.addAll(newChannels);
|
||||||
|
} else if (previousServerProtocol >= id1_13 && protocolId < id1_13) {
|
||||||
|
ArrayList<String> newChannels = new ArrayList<>();
|
||||||
|
for (String oldChannel : knownChannels) {
|
||||||
|
String transformed = InventoryPackets.getOldPluginChannelId(oldChannel);
|
||||||
|
if (transformed != null) {
|
||||||
|
newChannels.add(transformed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
knownChannels.clear();
|
||||||
|
knownChannels.addAll(newChannels);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
user.put(info);
|
||||||
|
user.put(storage);
|
||||||
|
|
||||||
|
user.setActive(protocols != null);
|
||||||
|
|
||||||
|
// Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist.
|
||||||
|
for (Protocol protocol : pipeline.pipes()) {
|
||||||
|
protocol.init(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object connection = getMinecraftConnection.invoke(e.getPlayer());
|
||||||
|
ProtocolVersion version = (ProtocolVersion) getNextProtocolVersion.invoke(connection);
|
||||||
|
setProtocolVersion.invoke(connection, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
user.put(info);
|
|
||||||
user.put(storage);
|
|
||||||
|
|
||||||
user.setActive(protocols != null);
|
|
||||||
|
|
||||||
// Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist.
|
|
||||||
for (Protocol protocol : pipeline.pipes()) {
|
|
||||||
protocol.init(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
Object connection = getMinecraftConnection.invoke(e.getPlayer());
|
|
||||||
ProtocolVersion version = (ProtocolVersion) getNextProtocolVersion.invoke(connection);
|
|
||||||
setProtocolVersion.invoke(connection, version);
|
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
user.getVelocityLock().writeLock().unlock();
|
||||||
}
|
}
|
||||||
user.getVelocityLock().writeLock().unlock();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user