del trash files
This commit is contained in:
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-03-28
|
|
||||||
*/
|
|
||||||
package mc.core.netty;
|
|
||||||
|
|
||||||
import io.netty.channel.Channel;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import mc.core.Packet;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public class EventBus {
|
|
||||||
private static EventBus instance = new EventBus();
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@EqualsAndHashCode
|
|
||||||
private static class PairKey {
|
|
||||||
private final int stateId;
|
|
||||||
private final int packetId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
private static class PairValue {
|
|
||||||
private final Object object;
|
|
||||||
private final Method method;
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface Listener {}
|
|
||||||
|
|
||||||
@Target(ElementType.METHOD)
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
public @interface EventHandler {
|
|
||||||
State value();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EventBus getInstance() {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<PairKey, List<PairValue>> listenersMap = new HashMap<>();
|
|
||||||
|
|
||||||
public void listenIncomingPacket(final Listener listener) {
|
|
||||||
Arrays.stream(listener.getClass().getDeclaredMethods())
|
|
||||||
.filter(method -> method.isAnnotationPresent(EventHandler.class)
|
|
||||||
&& method.getParameterCount() == 2
|
|
||||||
&& Packet.class.isAssignableFrom(method.getParameterTypes()[0])
|
|
||||||
&& Channel.class.isAssignableFrom(method.getParameterTypes()[1]))
|
|
||||||
.forEach(method -> {
|
|
||||||
State state = method.getAnnotation(EventHandler.class).value();
|
|
||||||
|
|
||||||
Class<?> pktClass = method.getParameterTypes()[0];
|
|
||||||
Optional<Integer> optPacketId = state.getPacketId(pktClass.asSubclass(Packet.class));
|
|
||||||
if (optPacketId.isPresent()) {
|
|
||||||
PairKey key = new PairKey(
|
|
||||||
state.getId(),
|
|
||||||
optPacketId.get()
|
|
||||||
);
|
|
||||||
|
|
||||||
PairValue value = new PairValue(listener, method);
|
|
||||||
|
|
||||||
List<PairValue> listValues = listenersMap.computeIfAbsent(key, f -> new ArrayList<>());
|
|
||||||
listValues.add(value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void eventIncomingPacket(final int stateId, final Packet packet, final Channel channel) {
|
|
||||||
List<PairValue> listValues = listenersMap.get(new PairKey(stateId, packet.getId()));
|
|
||||||
if (listValues != null) {
|
|
||||||
listValues.forEach(pairValue -> {
|
|
||||||
try {
|
|
||||||
pairValue.method.invoke(pairValue.object, packet, channel);
|
|
||||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
|
||||||
log.error("Method invoke", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-03-28
|
|
||||||
*/
|
|
||||||
package mc.core.netty;
|
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import mc.core.NetStream;
|
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class WrapperByteBufNetStream implements NetStream {
|
|
||||||
private final ByteBuf byteBuf;
|
|
||||||
private int length;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte readByte() {
|
|
||||||
return byteBuf.readByte();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeByte(byte value) {
|
|
||||||
byteBuf.writeByte(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int readBytes(byte[] buffer) {
|
|
||||||
return byteBuf.readBytes(buffer).readableBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeBytes(byte[] buffer) {
|
|
||||||
byteBuf.writeBytes(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int readBytes(byte[] buffer, int offset, int length) {
|
|
||||||
return byteBuf.writeBytes(buffer, offset, length).readableBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeBytes(byte[] buffer, int offset, int length) {
|
|
||||||
byteBuf.writeBytes(buffer, offset, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int readVarInt() {
|
|
||||||
int result = 0;
|
|
||||||
byte read;
|
|
||||||
int numRead = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
read = byteBuf.readByte();
|
|
||||||
int value = (read & 0b01111111);
|
|
||||||
result |= (value << (7 * numRead));
|
|
||||||
|
|
||||||
if (++numRead > 5) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while ((read & 0b10000000) != 0);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeVarInt(final int value) {
|
|
||||||
writeVarLong(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long readVarLong() {
|
|
||||||
long result = 0;
|
|
||||||
byte read;
|
|
||||||
int numRead = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
read = byteBuf.readByte();
|
|
||||||
int value = (read & 0b01111111);
|
|
||||||
result |= (value << (7 * numRead));
|
|
||||||
|
|
||||||
numRead++;
|
|
||||||
if (numRead > 10) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while ((read & 0b10000000) != 0);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeVarLong(final long value) {
|
|
||||||
long v = value;
|
|
||||||
do {
|
|
||||||
byte write = (byte)(v & 0b01111111);
|
|
||||||
v >>>= 7;
|
|
||||||
if (v != 0) {
|
|
||||||
write |= 0b10000000;
|
|
||||||
}
|
|
||||||
byteBuf.writeByte(write);
|
|
||||||
} while (v != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String readString() {
|
|
||||||
int length = readVarInt();
|
|
||||||
byte[] buffer = new byte[length];
|
|
||||||
int i = 0;
|
|
||||||
do {
|
|
||||||
buffer[i++] = byteBuf.readByte();
|
|
||||||
} while (i < length);
|
|
||||||
|
|
||||||
return new String(buffer, StandardCharsets.UTF_8);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeString(String value) {
|
|
||||||
writeVarInt(value.length());
|
|
||||||
byteBuf.writeBytes(value.getBytes());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int readUnsignedShort() {
|
|
||||||
return byteBuf.readUnsignedShort();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void skipBytes(int count) {
|
|
||||||
byteBuf.skipBytes(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setExpectedLength(int value) {
|
|
||||||
this.length = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getExpectedLength() {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-03-28
|
|
||||||
*/
|
|
||||||
package mc.core.netty.handlers;
|
|
||||||
|
|
||||||
import io.netty.channel.Channel;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import mc.core.netty.EventBus;
|
|
||||||
import mc.core.netty.State;
|
|
||||||
import mc.core.netty.packets.HandshakeRequestPacket;
|
|
||||||
import mc.core.netty.packets.HandshakeResponsePacket;
|
|
||||||
import mc.core.netty.packets.PingPacket;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public class HandshakeHandler implements EventBus.Listener {
|
|
||||||
@EventBus.EventHandler(State.Handshaking)
|
|
||||||
public void onRequestHandshake(HandshakeRequestPacket packet, Channel channel) {
|
|
||||||
channel.attr(State.ATTR_STATE).set(packet.getNextState());
|
|
||||||
channel.writeAndFlush(new HandshakeResponsePacket());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventBus.EventHandler(State.Handshaking)
|
|
||||||
public void onPing(PingPacket packet, Channel channel) {
|
|
||||||
channel.writeAndFlush(packet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-03-25
|
|
||||||
*/
|
|
||||||
package mc.core.netty.packets;
|
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.ToString;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import mc.core.NetStream;
|
|
||||||
import mc.core.NotSupportException;
|
|
||||||
import mc.core.Packet;
|
|
||||||
import mc.core.netty.State;
|
|
||||||
import mc.core.netty.UnknowState;
|
|
||||||
|
|
||||||
import static mc.core.netty.Utils.*;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@Getter
|
|
||||||
@ToString
|
|
||||||
public class HandshakeRequestPacket implements Packet {
|
|
||||||
private static final int id = 0;
|
|
||||||
private int protocolVersion;
|
|
||||||
private String serverAddress;
|
|
||||||
private int serverPort;
|
|
||||||
private State nextState;
|
|
||||||
private String nickname;
|
|
||||||
private int size;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSize() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readSelf(NetStream netStream) {
|
|
||||||
protocolVersion = netStream.readVarInt();
|
|
||||||
serverAddress = netStream.readString();
|
|
||||||
serverPort = netStream.readUnsignedShort();
|
|
||||||
final int nextStateInt = netStream.readVarInt();
|
|
||||||
nextState = State.getById(nextStateInt).orElseGet(() -> {
|
|
||||||
log.warn("Unknown state: {}", nextStateInt);
|
|
||||||
return State.Unknown;
|
|
||||||
});
|
|
||||||
nickname = netStream.readString();
|
|
||||||
|
|
||||||
size = lengthVarInt(id)
|
|
||||||
+ lengthVarInt(protocolVersion)
|
|
||||||
+ lengthString(serverAddress)
|
|
||||||
+ lengthUnsignedShort(serverPort)
|
|
||||||
+ lengthVarInt(nextState.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeSelf(NetStream netStream) {
|
|
||||||
throw new NotSupportException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-03-25
|
|
||||||
*/
|
|
||||||
package mc.core.netty.packets;
|
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import mc.core.NetStream;
|
|
||||||
import mc.core.NotSupportException;
|
|
||||||
import mc.core.Packet;
|
|
||||||
import org.apache.commons.io.FileUtils;
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Base64;
|
|
||||||
|
|
||||||
import static mc.core.netty.Utils.*;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public class HandshakeResponsePacket implements Packet {
|
|
||||||
private static final int id = 0;
|
|
||||||
private static String json;
|
|
||||||
private static int size;
|
|
||||||
|
|
||||||
static {
|
|
||||||
JsonObject versionObj = new JsonObject();
|
|
||||||
versionObj.addProperty("name", "1.12.2");
|
|
||||||
versionObj.addProperty("protocol", 340);
|
|
||||||
|
|
||||||
JsonObject playersObj = new JsonObject();
|
|
||||||
playersObj.addProperty("max", 100);
|
|
||||||
playersObj.addProperty("online", 15);
|
|
||||||
|
|
||||||
JsonObject descriptionObj = new JsonObject();
|
|
||||||
descriptionObj.addProperty("text", "MC Core");
|
|
||||||
|
|
||||||
JsonObject rootObj = new JsonObject();
|
|
||||||
rootObj.add("version", versionObj);
|
|
||||||
rootObj.add("players", playersObj);
|
|
||||||
rootObj.add("description", descriptionObj);
|
|
||||||
|
|
||||||
try {
|
|
||||||
rootObj.addProperty("favicon",
|
|
||||||
"data:image/png;base64," +
|
|
||||||
new String(Base64.getEncoder().encode(
|
|
||||||
IOUtils.resourceToByteArray("/icon.png")))
|
|
||||||
);
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.warn("error read icon server", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
json = rootObj.toString();
|
|
||||||
|
|
||||||
size = lengthVarInt(id)
|
|
||||||
+ lengthString(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSize() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readSelf(NetStream netStream) {
|
|
||||||
throw new NotSupportException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeSelf(NetStream netStream) {
|
|
||||||
netStream.writeVarInt(getSize());
|
|
||||||
netStream.writeVarInt(getId());
|
|
||||||
netStream.writeString(json);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user