fix Kick packet handle
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
package mc.core.embedded;
|
||||
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import mc.core.Config;
|
||||
import mc.core.Player;
|
||||
@@ -19,6 +20,8 @@ import java.util.List;
|
||||
public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
||||
private List<Player> players;
|
||||
private final Object lock = new Object();
|
||||
@Setter
|
||||
private int keepAliveInterval = 1;
|
||||
|
||||
@Autowired
|
||||
public InMemoryPlayerManager(Config config) {
|
||||
@@ -32,6 +35,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
||||
synchronized (lock) {
|
||||
players.add(player);
|
||||
lock.notify();
|
||||
log.info("Player \"{}\" join server", player.getName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +58,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
||||
@Override
|
||||
public void removePlayer(Player player) {
|
||||
players.remove(player);
|
||||
log.info("Player \"{}\" left server", player.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -79,7 +84,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
||||
.forEach(player -> player.getChannel().sendKeepAlive());
|
||||
|
||||
try {
|
||||
Thread.sleep(1);
|
||||
Thread.sleep(keepAliveInterval);
|
||||
} catch (InterruptedException e) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,10 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
||||
@Override
|
||||
public void channelInactive(ChannelHandlerContext context) throws Exception {
|
||||
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
|
||||
@@ -157,4 +160,10 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
||||
channel.attr(ATTR_PLAYER).set(player);
|
||||
channel.flush();
|
||||
}
|
||||
|
||||
public void onKickPacket(Channel channel, KickPacket packet) {
|
||||
if (packet.getReason().equals("Quitting")) {
|
||||
channel.disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
*/
|
||||
package mc.core.network.proto_125.packets;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import mc.core.network.CSPacket;
|
||||
import mc.core.network.NetStream;
|
||||
import mc.core.network.SCPacket;
|
||||
import mc.core.network.proto_125.ByteArrayOutputNetStream;
|
||||
|
||||
@Getter
|
||||
@Slf4j
|
||||
@Setter
|
||||
@ToString
|
||||
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);
|
||||
}
|
||||
|
||||
public String getReason() {
|
||||
return (reason == null ? "" : reason);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readSelf(NetStream netStream) {
|
||||
reason = netStream.readString();
|
||||
try {
|
||||
reason = netStream.readString();
|
||||
} catch (NegativeArraySizeException e) {
|
||||
log.warn("Invalid packet");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
<property name="faviconBase64" value="icon.png"/>
|
||||
</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 -->
|
||||
<bean id="pipeline.log" class="io.netty.handler.logging.LoggingHandler" scope="prototype"/>
|
||||
|
||||
Reference in New Issue
Block a user