Disconnect client with TransitionService
This commit is contained in:
@@ -42,6 +42,7 @@ import constants.id.MobId;
|
|||||||
import constants.inventory.ItemConstants;
|
import constants.inventory.ItemConstants;
|
||||||
import constants.skills.*;
|
import constants.skills.*;
|
||||||
import model.CharacterIdentity;
|
import model.CharacterIdentity;
|
||||||
|
import net.netty.GameViolationException;
|
||||||
import net.packet.Packet;
|
import net.packet.Packet;
|
||||||
import net.server.PlayerBuffValueHolder;
|
import net.server.PlayerBuffValueHolder;
|
||||||
import net.server.PlayerCoolDownValueHolder;
|
import net.server.PlayerCoolDownValueHolder;
|
||||||
@@ -1379,6 +1380,7 @@ public class Character extends AbstractCharacterObject {
|
|||||||
eventAfterChangedMap(this.getMapId());
|
eventAfterChangedMap(this.getMapId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only used when entering Magic Door (Priest skill).
|
||||||
public void changeMap(final MapleMap target, final Point pos) {
|
public void changeMap(final MapleMap target, final Point pos) {
|
||||||
canWarpCounter++;
|
canWarpCounter++;
|
||||||
|
|
||||||
@@ -8639,34 +8641,14 @@ public class Character extends AbstractCharacterObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendPolice(int greason, String reason, int duration) {
|
|
||||||
sendPacket(PacketCreator.sendPolice(String.format("You have been blocked by the#b %s Police for %s.#k", "Cosmic", reason)));
|
|
||||||
this.isbanned = true;
|
|
||||||
TimerManager.getInstance().schedule(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
client.disconnect(false, false);
|
|
||||||
}
|
|
||||||
}, duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendPolice(String text) {
|
public void sendPolice(String text) {
|
||||||
final String message = getName() + " received this - " + text;
|
final String message = getName() + " received this - " + text;
|
||||||
|
log.info(message);
|
||||||
if (Server.getInstance().isGmOnline(this.getWorld())) { //Alert and log if a GM is online
|
if (Server.getInstance().isGmOnline(this.getWorld())) { //Alert and log if a GM is online
|
||||||
Server.getInstance().broadcastGMMessage(this.getWorld(), PacketCreator.sendYellowTip(message));
|
Server.getInstance().broadcastGMMessage(this.getWorld(), PacketCreator.sendYellowTip(message));
|
||||||
} else { //Auto DC and log if no GM is online
|
} else { //Auto DC and log if no GM is online
|
||||||
client.disconnect(false, false);
|
throw new GameViolationException(text);
|
||||||
}
|
}
|
||||||
log.info(message);
|
|
||||||
//Server.getInstance().broadcastGMMessage(0, PacketCreator.serverNotice(1, getName() + " received this - " + text));
|
|
||||||
//sendPacket(PacketCreator.sendPolice(text));
|
|
||||||
//this.isbanned = true;
|
|
||||||
//TimerManager.getInstance().schedule(new Runnable() {
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
// client.disconnect(false, false);
|
|
||||||
// }
|
|
||||||
//}, 6000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendKeymap() {
|
public void sendKeymap() {
|
||||||
@@ -10071,6 +10053,10 @@ public class Character extends AbstractCharacterObject {
|
|||||||
return isbanned;
|
return isbanned;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setBanned() {
|
||||||
|
isbanned = true;
|
||||||
|
}
|
||||||
|
|
||||||
public List<Integer> getTrockMaps() {
|
public List<Integer> getTrockMaps() {
|
||||||
return trockmaps;
|
return trockmaps;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,14 +41,15 @@ public class DcCommand extends Command {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Character victim = c.getWorldServer().getPlayerStorage().getCharacterByName(params[0]);
|
String chrName = params[0];
|
||||||
|
Character victim = c.getWorldServer().getPlayerStorage().getCharacterByName(chrName);
|
||||||
if (victim == null) {
|
if (victim == null) {
|
||||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(params[0]);
|
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(chrName);
|
||||||
if (victim == null) {
|
if (victim == null) {
|
||||||
victim = player.getMap().getCharacterByName(params[0]);
|
victim = player.getMap().getCharacterByName(chrName);
|
||||||
if (victim != null) {
|
if (victim != null) {
|
||||||
try {//sometimes bugged because the map = null
|
try {//sometimes bugged because the map = null
|
||||||
victim.getClient().disconnect(true, false);
|
ctx.transitionService().disconnect(victim.getClient(), true, false);
|
||||||
player.getMap().removePlayer(victim);
|
player.getMap().removePlayer(victim);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -61,6 +62,6 @@ public class DcCommand extends Command {
|
|||||||
if (player.gmLevel() < victim.gmLevel()) {
|
if (player.gmLevel() < victim.gmLevel()) {
|
||||||
victim = player;
|
victim = player;
|
||||||
}
|
}
|
||||||
victim.getClient().disconnect(false, false);
|
ctx.transitionService().disconnect(victim.getClient(), false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import tools.PacketCreator;
|
|||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class BanCommand extends Command {
|
public class BanCommand extends Command {
|
||||||
{
|
{
|
||||||
@@ -76,7 +77,10 @@ public class BanCommand extends Command {
|
|||||||
target.yellowMessage("Reason: " + reason);
|
target.yellowMessage("Reason: " + reason);
|
||||||
c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0));
|
c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0));
|
||||||
final Character rip = target;
|
final Character rip = target;
|
||||||
TimerManager.getInstance().schedule(() -> rip.getClient().disconnect(false, false), 5000); //5 Seconds
|
TimerManager.getInstance().schedule(
|
||||||
|
() -> ctx.transitionService().disconnect(rip.getClient(), false, false),
|
||||||
|
TimeUnit.SECONDS.toMillis(5)
|
||||||
|
);
|
||||||
Server.getInstance().broadcastMessage(c.getWorld(), PacketCreator.serverNotice(6, "[RIP]: " + ign + " has been banned."));
|
Server.getInstance().broadcastMessage(c.getWorld(), PacketCreator.serverNotice(6, "[RIP]: " + ign + " has been banned."));
|
||||||
} else if (Character.ban(ign, reason, false)) {
|
} else if (Character.ban(ign, reason, false)) {
|
||||||
c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0));
|
c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0));
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class DCAllCommand extends Command {
|
|||||||
for (World world : Server.getInstance().getWorlds()) {
|
for (World world : Server.getInstance().getWorlds()) {
|
||||||
for (Character chr : world.getPlayerStorage().getAllCharacters()) {
|
for (Character chr : world.getPlayerStorage().getAllCharacters()) {
|
||||||
if (!chr.isGM()) {
|
if (!chr.isGM()) {
|
||||||
chr.getClient().disconnect(false, false);
|
ctx.transitionService().disconnect(chr.getClient(), false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ public final class PacketProcessor {
|
|||||||
registerHandler(RecvOpcode.SCRIPTED_ITEM, new ScriptedItemHandler());
|
registerHandler(RecvOpcode.SCRIPTED_ITEM, new ScriptedItemHandler());
|
||||||
registerHandler(RecvOpcode.TOUCHING_REACTOR, new TouchReactorHandler());
|
registerHandler(RecvOpcode.TOUCHING_REACTOR, new TouchReactorHandler());
|
||||||
registerHandler(RecvOpcode.BEHOLDER, new BeholderHandler());
|
registerHandler(RecvOpcode.BEHOLDER, new BeholderHandler());
|
||||||
registerHandler(RecvOpcode.ADMIN_COMMAND, new AdminCommandHandler());
|
registerHandler(RecvOpcode.ADMIN_COMMAND, new AdminCommandHandler(channelDeps.transitionService()));
|
||||||
registerHandler(RecvOpcode.ADMIN_LOG, new AdminLogHandler());
|
registerHandler(RecvOpcode.ADMIN_LOG, new AdminLogHandler());
|
||||||
registerHandler(RecvOpcode.ALLIANCE_OPERATION, new AllianceOperationHandler());
|
registerHandler(RecvOpcode.ALLIANCE_OPERATION, new AllianceOperationHandler());
|
||||||
registerHandler(RecvOpcode.DENY_ALLIANCE_REQUEST, new DenyAllianceRequestHandler());
|
registerHandler(RecvOpcode.DENY_ALLIANCE_REQUEST, new DenyAllianceRequestHandler());
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
package net.netty;
|
package net.netty;
|
||||||
|
|
||||||
import database.character.CharacterSaver;
|
|
||||||
import io.netty.bootstrap.ServerBootstrap;
|
import io.netty.bootstrap.ServerBootstrap;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.EventLoopGroup;
|
import io.netty.channel.EventLoopGroup;
|
||||||
import io.netty.channel.nio.NioEventLoopGroup;
|
import io.netty.channel.nio.NioEventLoopGroup;
|
||||||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||||
|
import service.TransitionService;
|
||||||
|
|
||||||
public class ChannelServer extends AbstractServer {
|
public class ChannelServer extends AbstractServer {
|
||||||
private final int world;
|
private final int world;
|
||||||
private final int channel;
|
private final int channel;
|
||||||
private final CharacterSaver characterSaver;
|
private final TransitionService transitionService;
|
||||||
private Channel nettyChannel;
|
private Channel nettyChannel;
|
||||||
|
|
||||||
public ChannelServer(int port, int world, int channel, CharacterSaver characterSaver) {
|
public ChannelServer(int port, int world, int channel, TransitionService transitionService) {
|
||||||
super(port);
|
super(port);
|
||||||
this.world = world;
|
this.world = world;
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
this.characterSaver = characterSaver;
|
this.transitionService = transitionService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -27,7 +27,7 @@ public class ChannelServer extends AbstractServer {
|
|||||||
ServerBootstrap bootstrap = new ServerBootstrap()
|
ServerBootstrap bootstrap = new ServerBootstrap()
|
||||||
.group(parentGroup, childGroup)
|
.group(parentGroup, childGroup)
|
||||||
.channel(NioServerSocketChannel.class)
|
.channel(NioServerSocketChannel.class)
|
||||||
.childHandler(new ChannelServerInitializer(world, channel, characterSaver));
|
.childHandler(new ChannelServerInitializer(world, channel, transitionService));
|
||||||
|
|
||||||
this.nettyChannel = bootstrap.bind(port).syncUninterruptibly().channel();
|
this.nettyChannel = bootstrap.bind(port).syncUninterruptibly().channel();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package net.netty;
|
package net.netty;
|
||||||
|
|
||||||
import client.Client;
|
import client.Client;
|
||||||
import database.character.CharacterSaver;
|
|
||||||
import io.netty.channel.socket.SocketChannel;
|
import io.netty.channel.socket.SocketChannel;
|
||||||
import net.PacketProcessor;
|
import net.PacketProcessor;
|
||||||
import net.server.Server;
|
import net.server.Server;
|
||||||
import net.server.coordinator.session.SessionCoordinator;
|
import net.server.coordinator.session.SessionCoordinator;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import service.TransitionService;
|
||||||
|
|
||||||
public class ChannelServerInitializer extends ServerChannelInitializer {
|
public class ChannelServerInitializer extends ServerChannelInitializer {
|
||||||
private static final Logger log = LoggerFactory.getLogger(ChannelServerInitializer.class);
|
private static final Logger log = LoggerFactory.getLogger(ChannelServerInitializer.class);
|
||||||
@@ -15,8 +15,8 @@ public class ChannelServerInitializer extends ServerChannelInitializer {
|
|||||||
private final int world;
|
private final int world;
|
||||||
private final int channel;
|
private final int channel;
|
||||||
|
|
||||||
public ChannelServerInitializer(int world, int channel, CharacterSaver characterSaver) {
|
public ChannelServerInitializer(int world, int channel, TransitionService transitionService) {
|
||||||
super(characterSaver);
|
super(transitionService);
|
||||||
this.world = world;
|
this.world = world;
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
package net.netty;
|
package net.netty;
|
||||||
|
|
||||||
import database.character.CharacterSaver;
|
|
||||||
import io.netty.channel.ChannelHandler.Sharable;
|
import io.netty.channel.ChannelHandler.Sharable;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
|
import service.TransitionService;
|
||||||
|
|
||||||
@Sharable
|
@Sharable
|
||||||
public class DisconnectHandler extends ChannelInboundHandlerAdapter {
|
public class DisconnectHandler extends ChannelInboundHandlerAdapter {
|
||||||
private final CharacterSaver characterSaver;
|
private final TransitionService transitionService;
|
||||||
|
|
||||||
public DisconnectHandler(CharacterSaver characterSaver) {
|
public DisconnectHandler(TransitionService transitionService) {
|
||||||
this.characterSaver = characterSaver;
|
this.transitionService = transitionService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
||||||
if (cause instanceof DisconnectException de) {
|
if (cause instanceof DisconnectException de) {
|
||||||
var client = de.getClient();
|
var client = de.getClient();
|
||||||
client.disconnect(true, false);
|
transitionService.disconnect(client, true, false);
|
||||||
} else {
|
} else {
|
||||||
ctx.fireExceptionCaught(cause);
|
ctx.fireExceptionCaught(cause);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
package net.netty;
|
package net.netty;
|
||||||
|
|
||||||
import database.character.CharacterSaver;
|
|
||||||
import io.netty.bootstrap.ServerBootstrap;
|
import io.netty.bootstrap.ServerBootstrap;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.EventLoopGroup;
|
import io.netty.channel.EventLoopGroup;
|
||||||
import io.netty.channel.nio.NioEventLoopGroup;
|
import io.netty.channel.nio.NioEventLoopGroup;
|
||||||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||||
|
import service.TransitionService;
|
||||||
|
|
||||||
public class LoginServer extends AbstractServer {
|
public class LoginServer extends AbstractServer {
|
||||||
public static final int WORLD_ID = -1;
|
public static final int WORLD_ID = -1;
|
||||||
public static final int CHANNEL_ID = -1;
|
public static final int CHANNEL_ID = -1;
|
||||||
|
|
||||||
private final CharacterSaver characterSaver;
|
private final TransitionService transitionService;
|
||||||
private Channel channel;
|
private Channel channel;
|
||||||
|
|
||||||
public LoginServer(int port, CharacterSaver characterSaver) {
|
public LoginServer(int port, TransitionService transitionService) {
|
||||||
super(port);
|
super(port);
|
||||||
this.characterSaver = characterSaver;
|
this.transitionService = transitionService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -26,7 +26,7 @@ public class LoginServer extends AbstractServer {
|
|||||||
ServerBootstrap bootstrap = new ServerBootstrap()
|
ServerBootstrap bootstrap = new ServerBootstrap()
|
||||||
.group(parentGroup, childGroup)
|
.group(parentGroup, childGroup)
|
||||||
.channel(NioServerSocketChannel.class)
|
.channel(NioServerSocketChannel.class)
|
||||||
.childHandler(new LoginServerInitializer(characterSaver));
|
.childHandler(new LoginServerInitializer(transitionService));
|
||||||
|
|
||||||
this.channel = bootstrap.bind(port).syncUninterruptibly().channel();
|
this.channel = bootstrap.bind(port).syncUninterruptibly().channel();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
package net.netty;
|
package net.netty;
|
||||||
|
|
||||||
import client.Client;
|
import client.Client;
|
||||||
import database.character.CharacterSaver;
|
|
||||||
import io.netty.channel.socket.SocketChannel;
|
import io.netty.channel.socket.SocketChannel;
|
||||||
import net.PacketProcessor;
|
import net.PacketProcessor;
|
||||||
import net.server.coordinator.session.SessionCoordinator;
|
import net.server.coordinator.session.SessionCoordinator;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import service.TransitionService;
|
||||||
|
|
||||||
public class LoginServerInitializer extends ServerChannelInitializer {
|
public class LoginServerInitializer extends ServerChannelInitializer {
|
||||||
private static final Logger log = LoggerFactory.getLogger(LoginServerInitializer.class);
|
private static final Logger log = LoggerFactory.getLogger(LoginServerInitializer.class);
|
||||||
|
|
||||||
public LoginServerInitializer(CharacterSaver characterSaver) {
|
public LoginServerInitializer(TransitionService transitionService) {
|
||||||
super(characterSaver);
|
super(transitionService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package net.netty;
|
|||||||
import client.Client;
|
import client.Client;
|
||||||
import config.YamlConfig;
|
import config.YamlConfig;
|
||||||
import constants.net.ServerConstants;
|
import constants.net.ServerConstants;
|
||||||
import database.character.CharacterSaver;
|
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelHandler;
|
import io.netty.channel.ChannelHandler;
|
||||||
@@ -19,6 +18,7 @@ import net.packet.logging.OutPacketLogger;
|
|||||||
import net.server.coordinator.session.IpAddresses;
|
import net.server.coordinator.session.IpAddresses;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import service.TransitionService;
|
||||||
import tools.PacketCreator;
|
import tools.PacketCreator;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
@@ -35,8 +35,8 @@ public abstract class ServerChannelInitializer extends ChannelInitializer<Socket
|
|||||||
|
|
||||||
static final AtomicLong sessionId = new AtomicLong(7777);
|
static final AtomicLong sessionId = new AtomicLong(7777);
|
||||||
|
|
||||||
public ServerChannelInitializer(CharacterSaver characterSaver) {
|
public ServerChannelInitializer(TransitionService transitionService) {
|
||||||
this.disconnectingInboundHandler = new DisconnectHandler(characterSaver);
|
this.disconnectingInboundHandler = new DisconnectHandler(transitionService);
|
||||||
}
|
}
|
||||||
|
|
||||||
String getRemoteAddress(Channel channel) {
|
String getRemoteAddress(Channel channel) {
|
||||||
|
|||||||
@@ -431,10 +431,8 @@ public class Server {
|
|||||||
String event_message = YamlConfig.config.worlds.get(i).event_message;
|
String event_message = YamlConfig.config.worlds.get(i).event_message;
|
||||||
String why_am_i_recommended = YamlConfig.config.worlds.get(i).why_am_i_recommended;
|
String why_am_i_recommended = YamlConfig.config.worlds.get(i).why_am_i_recommended;
|
||||||
|
|
||||||
World world = new World(i,
|
World world = new World(i, flag, event_message, exprate, droprate, bossdroprate, mesorate, questrate,
|
||||||
flag,
|
travelrate, fishingrate, channelDependencies.transitionService());
|
||||||
event_message,
|
|
||||||
exprate, droprate, bossdroprate, mesorate, questrate, travelrate, fishingrate);
|
|
||||||
|
|
||||||
Map<Integer, String> channelInfo = new HashMap<>();
|
Map<Integer, String> channelInfo = new HashMap<>();
|
||||||
long bootTime = getCurrentTime();
|
long bootTime = getCurrentTime();
|
||||||
@@ -928,7 +926,7 @@ public class Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loginServer = initLoginServer(8484, channelDependencies.characterSaver());
|
loginServer = initLoginServer(8484, channelDependencies.transitionService());
|
||||||
|
|
||||||
log.info("Listening on port 8484");
|
log.info("Listening on port 8484");
|
||||||
|
|
||||||
@@ -999,8 +997,8 @@ public class Server {
|
|||||||
return channelDependencies;
|
return channelDependencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
private LoginServer initLoginServer(int port, CharacterSaver characterSaver) {
|
private LoginServer initLoginServer(int port, TransitionService transitionService) {
|
||||||
LoginServer loginServer = new LoginServer(port, characterSaver);
|
LoginServer loginServer = new LoginServer(port, transitionService);
|
||||||
loginServer.start();
|
loginServer.start();
|
||||||
return loginServer;
|
return loginServer;
|
||||||
}
|
}
|
||||||
@@ -1898,7 +1896,7 @@ public class Server {
|
|||||||
|
|
||||||
for (Client c : toDisconnect) { // thanks Lei for pointing a deadlock issue with srvLock
|
for (Client c : toDisconnect) { // thanks Lei for pointing a deadlock issue with srvLock
|
||||||
if (c.isLoggedIn()) {
|
if (c.isLoggedIn()) {
|
||||||
c.disconnect(false, false);
|
channelDependencies.transitionService().disconnect(c, false, false);
|
||||||
} else {
|
} else {
|
||||||
SessionCoordinator.getInstance().closeSession(c, true);
|
SessionCoordinator.getInstance().closeSession(c, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ package net.server.channel;
|
|||||||
import client.Character;
|
import client.Character;
|
||||||
import config.YamlConfig;
|
import config.YamlConfig;
|
||||||
import constants.id.MapId;
|
import constants.id.MapId;
|
||||||
import database.character.CharacterSaver;
|
|
||||||
import database.drop.DropProvider;
|
import database.drop.DropProvider;
|
||||||
import net.ChannelDependencies;
|
import net.ChannelDependencies;
|
||||||
import net.netty.ChannelServer;
|
import net.netty.ChannelServer;
|
||||||
@@ -45,6 +44,7 @@ import server.events.gm.Event;
|
|||||||
import server.expeditions.Expedition;
|
import server.expeditions.Expedition;
|
||||||
import server.expeditions.ExpeditionType;
|
import server.expeditions.ExpeditionType;
|
||||||
import server.maps.*;
|
import server.maps.*;
|
||||||
|
import service.TransitionService;
|
||||||
import tools.PacketCreator;
|
import tools.PacketCreator;
|
||||||
import tools.Pair;
|
import tools.Pair;
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ public final class Channel {
|
|||||||
this.merchWlock = rwLock.writeLock();
|
this.merchWlock = rwLock.writeLock();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.channelServer = initServer(port, world, channel, channelDependencies.characterSaver());
|
this.channelServer = initServer(port, world, channel, channelDependencies.transitionService());
|
||||||
expedType.addAll(Arrays.asList(ExpeditionType.values()));
|
expedType.addAll(Arrays.asList(ExpeditionType.values()));
|
||||||
|
|
||||||
if (Server.getInstance().isOnline()) { // postpone event loading to improve boot time... thanks Riizade, daronhudson for noticing slow startup times
|
if (Server.getInstance().isOnline()) { // postpone event loading to improve boot time... thanks Riizade, daronhudson for noticing slow startup times
|
||||||
@@ -154,8 +154,8 @@ public final class Channel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChannelServer initServer(int port, int world, int channel, CharacterSaver characterSaver) {
|
private ChannelServer initServer(int port, int world, int channel, TransitionService transitionService) {
|
||||||
ChannelServer channelServer = new ChannelServer(port, world, channel, characterSaver);
|
ChannelServer channelServer = new ChannelServer(port, world, channel, transitionService);
|
||||||
channelServer.start();
|
channelServer.start();
|
||||||
return channelServer;
|
return channelServer;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,19 +31,27 @@ import net.packet.InPacket;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import server.ItemInformationProvider;
|
import server.ItemInformationProvider;
|
||||||
|
import server.TimerManager;
|
||||||
import server.life.LifeFactory;
|
import server.life.LifeFactory;
|
||||||
import server.life.Monster;
|
import server.life.Monster;
|
||||||
import server.maps.MapObject;
|
import server.maps.MapObject;
|
||||||
import server.maps.MapObjectType;
|
import server.maps.MapObjectType;
|
||||||
import server.quest.Quest;
|
import server.quest.Quest;
|
||||||
|
import service.TransitionService;
|
||||||
import tools.PacketCreator;
|
import tools.PacketCreator;
|
||||||
import tools.Randomizer;
|
import tools.Randomizer;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public final class AdminCommandHandler extends AbstractPacketHandler {
|
public final class AdminCommandHandler extends AbstractPacketHandler {
|
||||||
private static final Logger log = LoggerFactory.getLogger(AdminCommandHandler.class);
|
private static final Logger log = LoggerFactory.getLogger(AdminCommandHandler.class);
|
||||||
|
private final TransitionService transitionService;
|
||||||
|
|
||||||
|
public AdminCommandHandler(TransitionService transitionService) {
|
||||||
|
this.transitionService = transitionService;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handlePacket(InPacket p, Client c) {
|
public void handlePacket(InPacket p, Client c) {
|
||||||
@@ -95,7 +103,7 @@ public final class AdminCommandHandler extends AbstractPacketHandler {
|
|||||||
target.ban(description + " " + reason);
|
target.ban(description + " " + reason);
|
||||||
} else {
|
} else {
|
||||||
target.block(type, duration, description);
|
target.block(type, duration, description);
|
||||||
target.sendPolice(duration, reason, 6000);
|
sendPolice(target.getClient(), reason);
|
||||||
}
|
}
|
||||||
c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0));
|
c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0));
|
||||||
} else if (Character.ban(victim, reason, false)) {
|
} else if (Character.ban(victim, reason, false)) {
|
||||||
@@ -183,4 +191,11 @@ public final class AdminCommandHandler extends AbstractPacketHandler {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendPolice(Client c, String reason) {
|
||||||
|
c.sendPacket(PacketCreator.sendPolice(String.format("You have been blocked by the#b %s Police for %s.#k", "Cosmic", reason)));
|
||||||
|
c.getPlayer().setBanned();
|
||||||
|
TimerManager.getInstance().schedule(() -> transitionService.disconnect(c, false, false),
|
||||||
|
TimeUnit.SECONDS.toMillis(6));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import config.YamlConfig;
|
|||||||
import net.server.world.World;
|
import net.server.world.World;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import service.TransitionService;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
@@ -13,6 +14,12 @@ import java.util.Collection;
|
|||||||
*/
|
*/
|
||||||
public class TimeoutTask extends BaseTask implements Runnable {
|
public class TimeoutTask extends BaseTask implements Runnable {
|
||||||
private static final Logger log = LoggerFactory.getLogger(TimeoutTask.class);
|
private static final Logger log = LoggerFactory.getLogger(TimeoutTask.class);
|
||||||
|
private final TransitionService transitionService;
|
||||||
|
|
||||||
|
public TimeoutTask(World world, TransitionService transitionService) {
|
||||||
|
super(world);
|
||||||
|
this.transitionService = transitionService;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -21,12 +28,8 @@ public class TimeoutTask extends BaseTask implements Runnable {
|
|||||||
for (Character chr : chars) {
|
for (Character chr : chars) {
|
||||||
if (time - chr.getClient().getLastPacket() > YamlConfig.config.server.TIMEOUT_DURATION) {
|
if (time - chr.getClient().getLastPacket() > YamlConfig.config.server.TIMEOUT_DURATION) {
|
||||||
log.info("Chr {} auto-disconnected due to inactivity", chr.getName());
|
log.info("Chr {} auto-disconnected due to inactivity", chr.getName());
|
||||||
chr.getClient().disconnect(true, chr.getCashShop().isOpened());
|
transitionService.disconnect(chr.getClient(), true, chr.getCashShop().isOpened());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeoutTask(World world) {
|
|
||||||
super(world);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ import scripting.event.EventInstanceManager;
|
|||||||
import server.Storage;
|
import server.Storage;
|
||||||
import server.TimerManager;
|
import server.TimerManager;
|
||||||
import server.maps.*;
|
import server.maps.*;
|
||||||
|
import service.TransitionService;
|
||||||
import tools.DatabaseConnection;
|
import tools.DatabaseConnection;
|
||||||
import tools.PacketCreator;
|
import tools.PacketCreator;
|
||||||
import tools.Pair;
|
import tools.Pair;
|
||||||
@@ -161,7 +162,8 @@ public class World {
|
|||||||
private ScheduledFuture<?> timeoutSchedule;
|
private ScheduledFuture<?> timeoutSchedule;
|
||||||
private ScheduledFuture<?> hpDecSchedule;
|
private ScheduledFuture<?> hpDecSchedule;
|
||||||
|
|
||||||
public World(int world, int flag, String eventmsg, int exprate, int droprate, int bossdroprate, int mesorate, int questrate, int travelrate, int fishingrate) {
|
public World(int world, int flag, String eventmsg, int exprate, int droprate, int bossdroprate, int mesorate,
|
||||||
|
int questrate, int travelrate, int fishingrate, TransitionService transitionService) {
|
||||||
this.id = world;
|
this.id = world;
|
||||||
this.flag = flag;
|
this.flag = flag;
|
||||||
this.eventmsg = eventmsg;
|
this.eventmsg = eventmsg;
|
||||||
@@ -200,7 +202,7 @@ public class World {
|
|||||||
mapOwnershipSchedule = tman.register(new MapOwnershipTask(this), SECONDS.toMillis(20), SECONDS.toMillis(20));
|
mapOwnershipSchedule = tman.register(new MapOwnershipTask(this), SECONDS.toMillis(20), SECONDS.toMillis(20));
|
||||||
fishingSchedule = tman.register(new FishingTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10));
|
fishingSchedule = tman.register(new FishingTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10));
|
||||||
partySearchSchedule = tman.register(new PartySearchTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10));
|
partySearchSchedule = tman.register(new PartySearchTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10));
|
||||||
timeoutSchedule = tman.register(new TimeoutTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10));
|
timeoutSchedule = tman.register(new TimeoutTask(this, transitionService), SECONDS.toMillis(10), SECONDS.toMillis(10));
|
||||||
hpDecSchedule = tman.register(new CharacterHpDecreaseTask(this), YamlConfig.config.server.MAP_DAMAGE_OVERTIME_INTERVAL, YamlConfig.config.server.MAP_DAMAGE_OVERTIME_INTERVAL);
|
hpDecSchedule = tman.register(new CharacterHpDecreaseTask(this), YamlConfig.config.server.MAP_DAMAGE_OVERTIME_INTERVAL, YamlConfig.config.server.MAP_DAMAGE_OVERTIME_INTERVAL);
|
||||||
|
|
||||||
if (YamlConfig.config.server.USE_FAMILY_SYSTEM) {
|
if (YamlConfig.config.server.USE_FAMILY_SYSTEM) {
|
||||||
|
|||||||
Reference in New Issue
Block a user