Archived
0

fix Kick packet handle

This commit is contained in:
2018-04-21 10:27:07 +03:00
parent ba406cfe77
commit 0b90304115
4 changed files with 30 additions and 6 deletions

View File

@@ -4,6 +4,7 @@
*/ */
package mc.core.embedded; package mc.core.embedded;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.Config; import mc.core.Config;
import mc.core.Player; import mc.core.Player;
@@ -19,6 +20,8 @@ import java.util.List;
public class InMemoryPlayerManager implements PlayerManager, Runnable { public class InMemoryPlayerManager implements PlayerManager, Runnable {
private List<Player> players; private List<Player> players;
private final Object lock = new Object(); private final Object lock = new Object();
@Setter
private int keepAliveInterval = 1;
@Autowired @Autowired
public InMemoryPlayerManager(Config config) { public InMemoryPlayerManager(Config config) {
@@ -32,6 +35,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
synchronized (lock) { synchronized (lock) {
players.add(player); players.add(player);
lock.notify(); lock.notify();
log.info("Player \"{}\" join server", player.getName());
} }
} }
@@ -54,6 +58,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
@Override @Override
public void removePlayer(Player player) { public void removePlayer(Player player) {
players.remove(player); players.remove(player);
log.info("Player \"{}\" left server", player.getName());
} }
@Override @Override
@@ -79,7 +84,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
.forEach(player -> player.getChannel().sendKeepAlive()); .forEach(player -> player.getChannel().sendKeepAlive());
try { try {
Thread.sleep(1); Thread.sleep(keepAliveInterval);
} catch (InterruptedException e) { } catch (InterruptedException e) {
return; return;
} }

View File

@@ -36,7 +36,10 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
@Override @Override
public void channelInactive(ChannelHandlerContext context) throws Exception { public void channelInactive(ChannelHandlerContext context) throws Exception {
super.channelInactive(context); super.channelInactive(context);
playerManager.removePlayer(context.channel().attr(ATTR_PLAYER).get()); Player player = context.channel().attr(ATTR_PLAYER).get();
if (player != null) {
playerManager.removePlayer(player);
}
} }
@Override @Override
@@ -157,4 +160,10 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
channel.attr(ATTR_PLAYER).set(player); channel.attr(ATTR_PLAYER).set(player);
channel.flush(); channel.flush();
} }
public void onKickPacket(Channel channel, KickPacket packet) {
if (packet.getReason().equals("Quitting")) {
channel.disconnect();
}
}
} }

View File

@@ -4,15 +4,15 @@
*/ */
package mc.core.network.proto_125.packets; package mc.core.network.proto_125.packets;
import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import mc.core.network.CSPacket; import mc.core.network.CSPacket;
import mc.core.network.NetStream; import mc.core.network.NetStream;
import mc.core.network.SCPacket; import mc.core.network.SCPacket;
import mc.core.network.proto_125.ByteArrayOutputNetStream; import mc.core.network.proto_125.ByteArrayOutputNetStream;
@Getter @Slf4j
@Setter @Setter
@ToString @ToString
public class KickPacket implements SCPacket, CSPacket { public class KickPacket implements SCPacket, CSPacket {
@@ -22,9 +22,17 @@ public class KickPacket implements SCPacket, CSPacket {
reason = String.format("%s§%d§%d", description, online, maxOnline); reason = String.format("%s§%d§%d", description, online, maxOnline);
} }
public String getReason() {
return (reason == null ? "" : reason);
}
@Override @Override
public void readSelf(NetStream netStream) { public void readSelf(NetStream netStream) {
reason = netStream.readString(); try {
reason = netStream.readString();
} catch (NegativeArraySizeException e) {
log.warn("Invalid packet");
}
} }
@Override @Override

View File

@@ -11,7 +11,9 @@
<property name="faviconBase64" value="icon.png"/> <property name="faviconBase64" value="icon.png"/>
</bean> </bean>
<bean id="playerManager" class="mc.core.embedded.InMemoryPlayerManager"/> <bean id="playerManager" class="mc.core.embedded.InMemoryPlayerManager">
<property name="keepAliveInterval" value="10"/>
</bean>
<!-- Netty Server --> <!-- Netty Server -->
<bean id="pipeline.log" class="io.netty.handler.logging.LoggingHandler" scope="prototype"/> <bean id="pipeline.log" class="io.netty.handler.logging.LoggingHandler" scope="prototype"/>