Skip to content

Re-add 1.7 support via extra-poor effort classes which work just fine and don't look too bad (ps: there is also one non-maven dependency (not added) which you'll need to extract and add to the cloud lib k thanks bye) #55

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,7 @@
*~

dependency-reduced-pom.xml

# Lib
/lib
/lib/1.7.10.jar
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Bukkit-Connect [![Jenkins](https://img.shields.io/jenkins/s/http/ci.lilypadmc.org/Bukkit-Connect.svg?maxAge=2592000?style=flat-square)](http://ci.lilypadmc.org/job/Bukkit-Connect)
===========

This version of Bukkit-Connect supports Spigot 1.8 through 1.12
This version of Bukkit-Connect supports Spigot 1.7 through 1.15

Compilation
-----------
Expand All @@ -10,3 +10,4 @@ We use maven to handle our dependencies.

* Install [Maven 3](http://maven.apache.org/download.html)
* Clone this repo and: `mvn clean install`
* Add any 1.7.10 CraftBukkit jar in /lib/1.7.10.jar. This is mandatory to not get DMCAed.
12 changes: 12 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api2</artifactId>
<version>1.7.10-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/1.7.10.jar</systemPath>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
Expand Down
27 changes: 23 additions & 4 deletions src/main/java/lilypad/bukkit/connect/ConnectPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@

import lilypad.bukkit.connect.hooks.SpigotHook;
import lilypad.bukkit.connect.injector.HandlerListInjector;
import lilypad.bukkit.connect.injector.NettyInjector;
import lilypad.bukkit.connect.injector.injector.INettyInjector;
import lilypad.bukkit.connect.injector.injector.NettyInjector;
import lilypad.bukkit.connect.injector.OfflineInjector;
import lilypad.bukkit.connect.injector.PacketInjector;
import lilypad.bukkit.connect.injector.injector.NettyInjectorLegacy;
import lilypad.bukkit.connect.login.LoginListener;
import lilypad.bukkit.connect.login.LoginNettyInjectHandler;
import lilypad.bukkit.connect.login.inject.LoginNettyInjectHandler;
import lilypad.bukkit.connect.login.LoginPayloadCache;
import lilypad.bukkit.connect.login.inject.LoginNettyInjectHandlerLegacy;
import lilypad.bukkit.connect.protocol.*;
import lilypad.bukkit.connect.util.ReflectionUtils;
import lilypad.client.connect.api.Connect;
Expand All @@ -28,6 +32,8 @@ public class ConnectPlugin extends JavaPlugin {
private String securityKey;
private int commonPort;
private static IProtocol protocol;
private INettyInjector nettyInjector;
private boolean isLegacy = false;

@Override
public void onLoad() {
Expand All @@ -39,7 +45,12 @@ public void onLoad() {
@Override
public void onEnable() {
String version = super.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
isLegacy = version.equalsIgnoreCase("v1_7_R4");
nettyInjector = isLegacy ? new NettyInjectorLegacy() : new NettyInjector();
switch (version) {
case "v1_7_R4":
protocol = new Protocol1_7_R4();
break;
case "v1_8_R1":
protocol = new Protocol1_8_R1();
break;
Expand Down Expand Up @@ -76,11 +87,19 @@ public void onEnable() {
try {
// Modify handshake packet max string size
// -- as of 1.8 I do not believe this is necessary anymore
/*if (!protocol.getGeneralVersion().equals("1.10")) {
/*
if (!protocol.getGeneralVersion().equals("1.10")) {
PacketInjector.injectStringMaxSize(super.getServer(), "handshaking", 0x00, 65535);
}*/
// Handle LilyPad handshake packet
commonPort = NettyInjector.injectAndFindPort(super.getServer(), new LoginNettyInjectHandler(this, payloadCache));

// Little fix for adding Legacy support :>

commonPort = nettyInjector.injectAndFindPort(super.getServer(),
(isLegacy ? new LoginNettyInjectHandlerLegacy(this, payloadCache)
: new LoginNettyInjectHandler(this, payloadCache)));


// If we are in online-mode
if (super.getServer().getOnlineMode()) {
// Prioritize our events
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package lilypad.bukkit.connect.injector;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.List;

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package lilypad.bukkit.connect.injector;
package lilypad.bukkit.connect.injector.decoder;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import lilypad.bukkit.connect.injector.handler.NettyInjectHandler;


import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;

public class NettyDecoderHandler extends MessageToMessageDecoder<Object> {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package lilypad.bukkit.connect.injector.decoder;

import lilypad.bukkit.connect.injector.handler.NettyInjectHandlerLegacy;
import net.minecraft.util.io.netty.channel.ChannelHandlerContext;
import net.minecraft.util.io.netty.handler.codec.MessageToMessageDecoder;

import java.util.List;

public class NettyDecoderHandlerLegacy extends MessageToMessageDecoder<Object> {

private NettyInjectHandlerLegacy handler;
private boolean enabled = true;

public NettyDecoderHandlerLegacy(NettyInjectHandlerLegacy handler) throws Exception {
this.handler = handler;
}

@Override
protected void decode(ChannelHandlerContext context, Object packet, List<Object> out) throws Exception {
if (this.enabled && this.handler.isEnabled()) {
this.handler.packetReceived(this, context, packet);
}
out.add(packet);
if (!this.enabled) {
context.pipeline().remove("lilypad_decoder");
}
}

public void disable() {
this.enabled = false;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package lilypad.bukkit.connect.injector.handler;

import io.netty.channel.ChannelHandlerContext;
import lilypad.bukkit.connect.injector.decoder.NettyDecoderHandler;

public interface NettyInjectHandler {

void packetReceived(NettyDecoderHandler handler, ChannelHandlerContext context, Object object) throws Exception;

boolean isEnabled();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package lilypad.bukkit.connect.injector.handler;


import lilypad.bukkit.connect.injector.decoder.NettyDecoderHandlerLegacy;
import net.minecraft.util.io.netty.channel.ChannelHandlerContext;

public interface NettyInjectHandlerLegacy {

void packetReceived(NettyDecoderHandlerLegacy handler, ChannelHandlerContext context, Object object) throws Exception;

boolean isEnabled();

}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package lilypad.bukkit.connect.injector;

import org.bukkit.Bukkit;
package lilypad.bukkit.connect.injector.initializer;

import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.ByteToMessageDecoder;
import lilypad.bukkit.connect.injector.decoder.NettyDecoderHandler;
import lilypad.bukkit.connect.injector.handler.NettyInjectHandler;
import org.bukkit.Bukkit;



import java.lang.reflect.Method;

Expand All @@ -21,10 +23,9 @@ public NettyChannelInitializer(NettyInjectHandler handler, ChannelInitializer<So
this.oldChildHandlerMethod = this.oldChildHandler.getClass().getDeclaredMethod("initChannel", Channel.class);
this.oldChildHandlerMethod.setAccessible(true);
}

@Override
protected void initChannel(SocketChannel channel) throws Exception {
// Call Old InitChannel
this.oldChildHandlerMethod.invoke(this.oldChildHandler, channel);
// Add Handlers
if (this.handler.isEnabled()) {
Expand All @@ -34,5 +35,4 @@ protected void initChannel(SocketChannel channel) throws Exception {
channel.pipeline().addAfter("decoder", "lilypad_decoder", new NettyDecoderHandler(this.handler));
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package lilypad.bukkit.connect.injector.initializer;

import lilypad.bukkit.connect.injector.decoder.NettyDecoderHandlerLegacy;
import lilypad.bukkit.connect.injector.handler.NettyInjectHandlerLegacy;
import net.minecraft.util.io.netty.channel.Channel;
import net.minecraft.util.io.netty.channel.ChannelInitializer;
import net.minecraft.util.io.netty.channel.socket.SocketChannel;
import org.bukkit.Bukkit;

import java.lang.reflect.Method;

public class NettyChannelInitializerLegacy extends ChannelInitializer<SocketChannel> {

private NettyInjectHandlerLegacy handler;
private ChannelInitializer<SocketChannel> oldChildHandler;
private Method oldChildHandlerMethod;

public NettyChannelInitializerLegacy(NettyInjectHandlerLegacy handler, ChannelInitializer<SocketChannel> oldChildHandler) throws Exception {
this.handler = handler;
this.oldChildHandler = oldChildHandler;
this.oldChildHandlerMethod = this.oldChildHandler.getClass().getDeclaredMethod("initChannel", Channel.class);
this.oldChildHandlerMethod.setAccessible(true);
}

@Override
protected void initChannel(SocketChannel channel) throws Exception {
// Call Old InitChannel
this.oldChildHandlerMethod.invoke(this.oldChildHandler, channel);
// Add Handlers
if (this.handler.isEnabled()) {
if (channel.pipeline().names().contains("legacy_query") && Bukkit.getServer().getPluginManager().getPlugin("ProtocolSupport") == null) {
channel.pipeline().remove("legacy_query");
}
channel.pipeline().addAfter("decoder", "lilypad_decoder", new NettyDecoderHandlerLegacy(this.handler));
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package lilypad.bukkit.connect.injector.injector;

import org.bukkit.Server;


public interface INettyInjector {

int injectAndFindPort(Server server, Object handler) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package lilypad.bukkit.connect.injector;
package lilypad.bukkit.connect.injector.injector;

import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
Expand All @@ -11,14 +11,16 @@
import java.util.List;

import lilypad.bukkit.connect.ConnectPlugin;
import lilypad.bukkit.connect.injector.initializer.NettyChannelInitializer;
import lilypad.bukkit.connect.injector.handler.NettyInjectHandler;
import lilypad.bukkit.connect.util.ReflectionUtils;

import org.bukkit.Server;

public class NettyInjector {
public class NettyInjector implements INettyInjector {

@SuppressWarnings("unchecked")
public static int injectAndFindPort(Server server, NettyInjectHandler handler) throws Exception {
public int injectAndFindPort(Server server, Object handler) throws Exception {
Method serverGetHandle = server.getClass().getDeclaredMethod("getServer");
Object minecraftServer = serverGetHandle.invoke(server);
// Get Server Connection
Expand All @@ -43,7 +45,7 @@ public static int injectAndFindPort(Server server, NettyInjectHandler handler) t
// Get Old ChildHandler
ChannelInitializer<SocketChannel> oldChildHandler = ReflectionUtils.getPrivateField(serverBootstrapAcceptor.getClass(), serverBootstrapAcceptor, ChannelInitializer.class, "childHandler");
// Set New ChildHandler
ReflectionUtils.setFinalField(serverBootstrapAcceptor.getClass(), serverBootstrapAcceptor, "childHandler", new NettyChannelInitializer(handler, oldChildHandler));
ReflectionUtils.setFinalField(serverBootstrapAcceptor.getClass(), serverBootstrapAcceptor, "childHandler", new NettyChannelInitializer((NettyInjectHandler) handler, oldChildHandler));
// Update Common Port
commonPort = ((InetSocketAddress) channelFuture.channel().localAddress()).getPort();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package lilypad.bukkit.connect.injector.injector;

import lilypad.bukkit.connect.ConnectPlugin;
import lilypad.bukkit.connect.injector.decoder.NettyDecoderHandler;
import lilypad.bukkit.connect.injector.decoder.NettyDecoderHandlerLegacy;
import lilypad.bukkit.connect.injector.handler.NettyInjectHandlerLegacy;
import lilypad.bukkit.connect.injector.initializer.NettyChannelInitializer;
import lilypad.bukkit.connect.injector.handler.NettyInjectHandler;
import lilypad.bukkit.connect.injector.initializer.NettyChannelInitializerLegacy;
import lilypad.bukkit.connect.login.inject.LoginNettyInjectHandlerLegacy;
import lilypad.bukkit.connect.util.ReflectionUtils;
import net.minecraft.util.io.netty.channel.ChannelFuture;
import net.minecraft.util.io.netty.channel.ChannelHandler;
import net.minecraft.util.io.netty.channel.ChannelInitializer;
import net.minecraft.util.io.netty.channel.ChannelPipeline;
import net.minecraft.util.io.netty.channel.socket.SocketChannel;
import org.bukkit.Server;

import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.util.List;

public class NettyInjectorLegacy implements INettyInjector {

@SuppressWarnings("unchecked")
public int injectAndFindPort(Server server, Object handler) throws Exception {
Method serverGetHandle = server.getClass().getDeclaredMethod("getServer");
Object minecraftServer = serverGetHandle.invoke(server);
// Get Server Connection
Method serverConnectionMethod = null;
for(Method method : minecraftServer.getClass().getSuperclass().getDeclaredMethods()) {
if(!method.getReturnType().getSimpleName().equals("ServerConnection")) {
continue;
}
serverConnectionMethod = method;
break;
}
Object serverConnection = serverConnectionMethod.invoke(minecraftServer);
// Get ChannelFuture List // TODO find the field dynamically
List<ChannelFuture> channelFutureList = ReflectionUtils.getPrivateField(serverConnection.getClass(), serverConnection, List.class, ConnectPlugin.getProtocol().getNettyInjectorChannelFutureList());
// Iterate ChannelFutures
int commonPort = 0;
for(ChannelFuture channelFuture : channelFutureList) {
// Get ChannelPipeline
ChannelPipeline channelPipeline = channelFuture.channel().pipeline();
// Get ServerBootstrapAcceptor
ChannelHandler serverBootstrapAcceptor = channelPipeline.last();
// Get Old ChildHandler
ChannelInitializer<SocketChannel> oldChildHandler = ReflectionUtils.getPrivateField(serverBootstrapAcceptor.getClass(), serverBootstrapAcceptor, ChannelInitializer.class, "childHandler");
// Set New ChildHandler
ReflectionUtils.setFinalField(serverBootstrapAcceptor.getClass(), serverBootstrapAcceptor, "childHandler", new NettyChannelInitializerLegacy((LoginNettyInjectHandlerLegacy) handler, oldChildHandler));
// Update Common Port
commonPort = ((InetSocketAddress) channelFuture.channel().localAddress()).getPort();
}
return commonPort;
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package lilypad.bukkit.connect.login;

import java.util.concurrent.TimeUnit;


import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import java.util.concurrent.TimeUnit;


public class LoginPayloadCache {

private Cache<String, LoginPayload> payloads = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build();

public void submit(LoginPayload payload) {
this.payloads.put(payload.getName(), payload);
}
Expand Down
Loading