fix Kick packet handle
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user