Disconnect client with TransitionService

This commit is contained in:
P0nk
2023-08-10 21:58:26 +02:00
parent d5682a5f65
commit cb31121fe7
16 changed files with 83 additions and 74 deletions

View File

@@ -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;
} }

View File

@@ -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);
} }
} }

View File

@@ -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));

View File

@@ -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);
} }
} }
} }

View File

@@ -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());

View File

@@ -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();
} }

View File

@@ -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;
} }

View File

@@ -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);
} }

View File

@@ -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();
} }

View File

@@ -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

View File

@@ -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) {

View File

@@ -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);
} }

View File

@@ -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;
} }

View File

@@ -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));
}
} }

View File

@@ -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);
}
} }

View File

@@ -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) {