Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ### Eclipse Workspace Patch 1.0
- #P aCis_gameserver
- Index: java/net/sf/l2j/gameserver/data/sql/OfflineTradersTable.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/data/sql/OfflineTradersTable.java (nonexistent)
- +++ java/net/sf/l2j/gameserver/data/sql/OfflineTradersTable.java (working copy)
- @@ -0,0 +1,276 @@
- +package net.sf.l2j.gameserver.data.sql;
- +
- +import java.sql.Connection;
- +import java.sql.PreparedStatement;
- +import java.sql.ResultSet;
- +import java.sql.SQLException;
- +import java.sql.Statement;
- +import java.util.Calendar;
- +import java.util.logging.Level;
- +import java.util.logging.Logger;
- +
- +import net.sf.l2j.Config;
- +import net.sf.l2j.L2DatabaseFactory;
- +import net.sf.l2j.gameserver.LoginServerThread;
- +import net.sf.l2j.gameserver.model.World;
- +import net.sf.l2j.gameserver.model.actor.instance.Player;
- +import net.sf.l2j.gameserver.model.actor.instance.Player.StoreType;
- +import net.sf.l2j.gameserver.model.craft.ManufactureItem;
- +import net.sf.l2j.gameserver.model.craft.ManufactureList;
- +import net.sf.l2j.gameserver.model.tradelist.TradeItem;
- +import net.sf.l2j.gameserver.model.zone.ZoneId;
- +import net.sf.l2j.gameserver.network.L2GameClient;
- +import net.sf.l2j.gameserver.network.L2GameClient.GameClientState;
- +
- +public final class OfflineTradersTable
- +{
- + private static final Logger LOGGER = Logger.getLogger(OfflineTradersTable.class.getName());
- +
- + private static final String SAVE_OFFLINE_STATUS = "INSERT INTO character_offline_trade (charId, time, type, title) VALUES (?, ?, ?, ?)";
- + private static final String SAVE_ITEMS = "INSERT INTO character_offline_trade_items (charId, item, count, price) VALUES (?, ?, ?, ?)";
- + private static final String CLEAR_OFFLINE_TABLE = "DELETE FROM character_offline_trade";
- + private static final String CLEAR_OFFLINE_TABLE_ITEMS = "DELETE FROM character_offline_trade_items";
- + private static final String LOAD_OFFLINE_STATUS = "SELECT * FROM character_offline_trade";
- + private static final String LOAD_OFFLINE_ITEMS = "SELECT * FROM character_offline_trade_items WHERE charId=?";
- +
- + public static void storeOffliners()
- + {
- + try (final Connection con = L2DatabaseFactory.getInstance().getConnection();
- + final PreparedStatement save_offline_status = con.prepareStatement(SAVE_OFFLINE_STATUS);
- + final PreparedStatement save_items = con.prepareStatement(SAVE_ITEMS))
- + {
- + try (final Statement stm = con.createStatement())
- + {
- + stm.execute(CLEAR_OFFLINE_TABLE);
- + stm.execute(CLEAR_OFFLINE_TABLE_ITEMS);
- + }
- +
- + for (final Player pc : World.getInstance().getPlayers())
- + {
- + try
- + {
- + if (pc.getStoreType() != StoreType.NONE && (pc.getClient() == null || pc.getClient().isDetached()))
- + {
- + save_offline_status.setInt(1, pc.getObjectId());
- + save_offline_status.setLong(2, pc.getOfflineStartTime());
- + save_offline_status.setInt(3, pc.getStoreType().getId());
- + switch (pc.getStoreType())
- + {
- + case BUY:
- + {
- + if (!Config.OFFLINE_TRADE_ENABLE)
- + continue;
- +
- + save_offline_status.setString(4, pc.getBuyList().getTitle());
- + for (final TradeItem i : pc.getBuyList().getItems())
- + {
- + save_items.setInt(1, pc.getObjectId());
- + save_items.setInt(2, i.getItem().getItemId());
- + save_items.setLong(3, i.getCount());
- + save_items.setLong(4, i.getPrice());
- + save_items.addBatch();
- + }
- + break;
- + }
- + case SELL:
- + case PACKAGE_SELL:
- + {
- + if (!Config.OFFLINE_TRADE_ENABLE)
- + continue;
- +
- + save_offline_status.setString(4, pc.getSellList().getTitle());
- + for (final TradeItem i : pc.getSellList().getItems())
- + {
- + save_items.setInt(1, pc.getObjectId());
- + save_items.setInt(2, i.getObjectId());
- + save_items.setLong(3, i.getCount());
- + save_items.setLong(4, i.getPrice());
- + save_items.addBatch();
- + }
- + break;
- + }
- + case MANUFACTURE:
- + {
- + if (!Config.OFFLINE_CRAFT_ENABLE)
- + continue;
- +
- + save_offline_status.setString(4, pc.getCreateList().getStoreName());
- + for (final ManufactureItem i : pc.getCreateList().getList())
- + {
- + save_items.setInt(1, pc.getObjectId());
- + save_items.setInt(2, i.getId());
- + save_items.setLong(3, 0);
- + save_items.setLong(4, i.getValue());
- + save_items.addBatch();
- + }
- + break;
- + }
- + }
- + save_items.executeBatch();
- + save_offline_status.execute();
- + }
- + }
- + catch (final Exception e)
- + {
- + LOGGER.log(Level.WARNING, OfflineTradersTable.class.getSimpleName() + ": error while saving offline trader " + pc.getObjectId() + ".", e);
- + }
- + }
- +
- + LOGGER.info(OfflineTradersTable.class.getSimpleName() + ": offline traders stored.");
- + }
- + catch (final SQLException e)
- + {
- + LOGGER.log(Level.WARNING, OfflineTradersTable.class.getSimpleName() + ": error while saving offline traders.", e);
- + }
- + }
- +
- + public static void restoreOfflineTraders()
- + {
- + LOGGER.info(OfflineTradersTable.class.getSimpleName() + ": loading offline traders...");
- +
- + try (final Connection con = L2DatabaseFactory.getInstance().getConnection();
- + final Statement stm = con.createStatement();
- + final ResultSet rs = stm.executeQuery(LOAD_OFFLINE_STATUS))
- + {
- + int nTraders = 0;
- + while (rs.next())
- + {
- + final long time = rs.getLong("time");
- + if (Config.OFFLINE_MAX_DAYS > 0)
- + {
- + final Calendar cal = Calendar.getInstance();
- + cal.setTimeInMillis(time);
- + cal.add(Calendar.DAY_OF_YEAR, Config.OFFLINE_MAX_DAYS);
- + if (cal.getTimeInMillis() <= System.currentTimeMillis())
- + continue;
- + }
- +
- + StoreType type = null;
- + for (final StoreType t : StoreType.values())
- + {
- + if (t.getId() == rs.getInt("type"))
- + {
- + type = t;
- + break;
- + }
- + }
- +
- + if (type == null)
- + {
- + LOGGER.warning(OfflineTradersTable.class.getSimpleName() + ": PrivateStoreType with id " + rs.getInt("type") + " could not be found.");
- + continue;
- + }
- +
- + if (type == StoreType.NONE)
- + continue;
- +
- + final Player player = Player.restore(rs.getInt("charId"));
- + if (player == null)
- + continue;
- +
- + try (final PreparedStatement stm_items = con.prepareStatement(LOAD_OFFLINE_ITEMS))
- + {
- + player.setRunning();
- + player.sitDown();
- + player.setOnlineStatus(true, false);
- +
- + World.getInstance().addPlayer(player);
- +
- + final L2GameClient client = new L2GameClient(null);
- + client.setDetached(true);
- + player.setClient(client);
- + client.setActiveChar(player);
- + client.setAccountName(player.getAccountNamePlayer());
- + player.setOnlineStatus(true, true);
- + client.setState(GameClientState.IN_GAME);
- + player.setOfflineStartTime(time);
- + player.spawnMe();
- +
- + LoginServerThread.getInstance().addClient(player.getAccountName(), client);
- +
- + stm_items.setInt(1, player.getObjectId());
- + try (final ResultSet items = stm_items.executeQuery())
- + {
- + switch (type)
- + {
- + case BUY:
- + {
- + while (items.next())
- + if (player.getBuyList().addItemByItemId(items.getInt(2), items.getInt(3), items.getInt(4)) == null)
- + throw new NullPointerException("NPE at BUY of offlineShop " + player.getObjectId() + " " + items.getInt(2) + " " + items.getInt(3) + " " + items.getInt(4));
- +
- + player.getBuyList().setTitle(rs.getString("title"));
- + break;
- + }
- + case SELL:
- + case PACKAGE_SELL:
- + {
- + while (items.next())
- + if (player.getSellList().addItem(items.getInt(2), items.getInt(3), items.getInt(4)) == null)
- + throw new NullPointerException("NPE at SELL of offlineShop " + player.getObjectId() + " " + items.getInt(2) + " " + items.getInt(3) + " " + items.getInt(4));
- +
- + player.getSellList().setTitle(rs.getString("title"));
- + player.getSellList().setPackaged(type == StoreType.PACKAGE_SELL);
- + break;
- + }
- + case MANUFACTURE:
- + {
- + final ManufactureList createList = new ManufactureList();
- + createList.setStoreName(rs.getString("title"));
- + while (items.next())
- + createList.add(new ManufactureItem(items.getInt(2), items.getInt(4)));
- +
- + player.setCreateList(createList);
- + break;
- + }
- + }
- + }
- +
- + player.setStoreType(type);
- + player.restoreEffects();
- + player.broadcastUserInfo();
- +
- + nTraders++;
- + }
- + catch (final Exception e)
- + {
- + LOGGER.log(Level.WARNING, OfflineTradersTable.class.getSimpleName() + ": error loading trader " + player.getObjectId() + ".", e);
- + player.logout();
- + }
- + }
- +
- + LOGGER.info(OfflineTradersTable.class.getSimpleName() + ": loaded " + nTraders + " offline traders.");
- +
- + try (final Statement stm1 = con.createStatement())
- + {
- + stm1.execute(CLEAR_OFFLINE_TABLE);
- + stm1.execute(CLEAR_OFFLINE_TABLE_ITEMS);
- + }
- + }
- + catch (final SQLException e)
- + {
- + LOGGER.log(Level.WARNING, OfflineTradersTable.class.getSimpleName() + ": error while loading offline traders.", e);
- + }
- + }
- +
- + public static boolean offlineMode(final Player player)
- + {
- + if (player.isInOlympiadMode() || player.isFestivalParticipant() || player.isInJail() || player.getVehicle() != null)
- + return false;
- +
- + if (Config.OFFLINE_MODE_IN_PEACE_ZONE && !player.isInsideZone(ZoneId.PEACE))
- + return false;
- +
- + switch (player.getStoreType())
- + {
- + case SELL:
- + case PACKAGE_SELL:
- + case BUY:
- + return Config.OFFLINE_TRADE_ENABLE;
- + case MANUFACTURE:
- + return Config.OFFLINE_CRAFT_ENABLE;
- + }
- +
- + return false;
- + }
- +}
- \ No newline at end of file
- Index: config/offlineshop.properties
- ===================================================================
- --- config/offlineshop.properties (nonexistent)
- +++ config/offlineshop.properties (working copy)
- @@ -0,0 +1,39 @@
- +# =================================================================
- +# Offline trade/craft
- +# =================================================================
- +
- +# Option to enable or disable offline trade feature.
- +# Enable -> true, Disable -> false
- +OfflineTradeEnable = True
- +
- +# Option to enable or disable offline craft feature.
- +# Enable -> true, Disable -> false
- +OfflineCraftEnable = False
- +
- +# If set to True, off-line shops will be possible only in peace zones.
- +# Default: False
- +OfflineModeInPeaceZone = False
- +
- +# If set to True, players in off-line shop mode will not take any damage, thus they cannot be killed.
- +# Default: False
- +OfflineModeNoDamage = False
- +
- +# If set to True, name color will be changed when entering offline mode.
- +OfflineSetNameColor = True
- +
- +# Color of the name in offline mode.
- +OfflineNameColor = 808080
- +
- +# Restore offline traders/crafters after restart/shutdown.
- +# Default: False
- +RestoreOffliners = True
- +
- +# Do not restore offline characters, after OfflineMaxDays days spent from first restore.
- +# Require server restart to disconnect expired shops.
- +# 0 = disabled (always restore).
- +# Default: 7
- +OfflineMaxDays = 7
- +
- +# Disconnect shop after finished selling, buying.
- +# Default: True
- +OfflineDisconnectFinished = True
- \ No newline at end of file
- Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java (revision 812)
- +++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java (working copy)
- @@ -694,6 +694,19 @@
- else
- activeChar.setTarget(player);
- + final L2GameClient client = activeChar.getClient();
- + if (client == null)
- + {
- + activeChar.sendMessage("Client is null.");
- + return;
- + }
- +
- + if (client.isDetached())
- + {
- + activeChar.sendMessage("Client is detached.");
- + return;
- + }
- +
- gatherCharacterInfo(activeChar, player, "charinfo.htm");
- }
- Index: java/net/sf/l2j/gameserver/model/actor/status/PlayerStatus.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/model/actor/status/PlayerStatus.java (revision 812)
- +++ java/net/sf/l2j/gameserver/model/actor/status/PlayerStatus.java (working copy)
- @@ -10,6 +10,7 @@
- import net.sf.l2j.gameserver.model.actor.Summon;
- import net.sf.l2j.gameserver.model.actor.ai.CtrlIntention;
- import net.sf.l2j.gameserver.model.actor.instance.Player;
- +import net.sf.l2j.gameserver.model.actor.instance.Player.StoreType;
- import net.sf.l2j.gameserver.model.actor.instance.Servitor;
- import net.sf.l2j.gameserver.model.actor.stat.PlayerStat;
- import net.sf.l2j.gameserver.model.entity.Duel.DuelState;
- @@ -55,6 +56,10 @@
- if (getActiveChar().isDead())
- return;
- + // If OFFLINE_MODE_NO_DAMAGE is enabled and player is offline and he is in store/craft mode, no damage is taken.
- + if (Config.OFFLINE_MODE_NO_DAMAGE && (getActiveChar().getClient() != null) && getActiveChar().getClient().isDetached() && ((Config.OFFLINE_TRADE_ENABLE && ((getActiveChar().getStoreType() == StoreType.SELL) || (getActiveChar().getStoreType() == StoreType.BUY))) || (Config.OFFLINE_CRAFT_ENABLE && (getActiveChar().isCrafting() || (getActiveChar().getStoreType() == StoreType.MANUFACTURE)))))
- + return;
- +
- // invul handling
- if (getActiveChar().isInvul())
- {
- Index: java/net/sf/l2j/gameserver/LoginServerThread.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/LoginServerThread.java (revision 812)
- +++ java/net/sf/l2j/gameserver/LoginServerThread.java (working copy)
- @@ -295,6 +295,9 @@
- final L2GameClient existingClient = _clients.putIfAbsent(account, client);
- if (existingClient == null)
- {
- + if (client.isDetached())
- + return;
- +
- try
- {
- sendPacket(new PlayerAuthRequest(client.getAccountName(), client.getSessionId()));
- Index: java/net/sf/l2j/Config.java
- ===================================================================
- --- java/net/sf/l2j/Config.java (revision 812)
- +++ java/net/sf/l2j/Config.java (working copy)
- @@ -37,8 +37,23 @@
- public static final String PLAYERS_FILE = "./config/players.properties";
- public static final String SERVER_FILE = "./config/server.properties";
- public static final String SIEGE_FILE = "./config/siege.properties";
- + public static final String OFFLINE_FILE = "./config/offlineshop.properties";
- // --------------------------------------------------
- + // Offline
- + // --------------------------------------------------
- +
- + public static boolean OFFLINE_TRADE_ENABLE;
- + public static boolean OFFLINE_CRAFT_ENABLE;
- + public static boolean OFFLINE_MODE_IN_PEACE_ZONE;
- + public static boolean OFFLINE_MODE_NO_DAMAGE;
- + public static boolean RESTORE_OFFLINERS;
- + public static int OFFLINE_MAX_DAYS;
- + public static boolean OFFLINE_DISCONNECT_FINISHED;
- + public static boolean OFFLINE_SET_NAME_COLOR;
- + public static int OFFLINE_NAME_COLOR;
- +
- + // --------------------------------------------------
- // Clans settings
- // --------------------------------------------------
- @@ -714,6 +729,23 @@
- }
- /**
- + * Loads offline shop settings
- + */
- + private static final void loadOfflineShop()
- + {
- + final ExProperties offline = initProperties(OFFLINE_FILE);
- + OFFLINE_TRADE_ENABLE = offline.getProperty("OfflineTradeEnable", false);
- + OFFLINE_CRAFT_ENABLE = offline.getProperty("OfflineCraftEnable", false);
- + OFFLINE_MODE_IN_PEACE_ZONE = offline.getProperty("OfflineModeInPeaceZone", false);
- + OFFLINE_MODE_NO_DAMAGE = offline.getProperty("OfflineModeNoDamage", false);
- + OFFLINE_SET_NAME_COLOR = offline.getProperty("OfflineSetNameColor", false);
- + OFFLINE_NAME_COLOR = Integer.decode("0x" + offline.getProperty("OfflineNameColor", "808080"));
- + RESTORE_OFFLINERS = offline.getProperty("RestoreOffliners", false);
- + OFFLINE_MAX_DAYS = offline.getProperty("OfflineMaxDays", 10);
- + OFFLINE_DISCONNECT_FINISHED = offline.getProperty("OfflineDisconnectFinished", true);
- + }
- +
- + /**
- * Loads clan and clan hall settings.
- */
- private static final void loadClans()
- @@ -1377,6 +1409,9 @@
- // players settings
- loadPlayers();
- + // offline settings
- + loadOfflineShop();
- +
- // siege settings
- loadSieges();
- Index: java/net/sf/l2j/gameserver/model/actor/instance/Player.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/model/actor/instance/Player.java (revision 812)
- +++ java/net/sf/l2j/gameserver/model/actor/instance/Player.java (working copy)
- @@ -2751,9 +2751,17 @@
- public String getAccountName()
- {
- + if (getClient() == null)
- + return getAccountNamePlayer();
- +
- return _client.getAccountName();
- }
- + public String getAccountNamePlayer()
- + {
- + return _accountName;
- + }
- +
- public Map<Integer, String> getAccountChars()
- {
- return _chars;
- @@ -4282,6 +4290,9 @@
- public void setStoreType(StoreType type)
- {
- _storeType = type;
- +
- + if (Config.OFFLINE_DISCONNECT_FINISHED && type == StoreType.NONE && ((getClient() == null) || getClient().isDetached()))
- + deleteMe();
- }
- /**
- @@ -10242,4 +10253,16 @@
- }
- }
- }
- +
- + private long _offlineShopStart;
- +
- + public long getOfflineStartTime()
- + {
- + return _offlineShopStart;
- + }
- +
- + public void setOfflineStartTime(long time)
- + {
- + _offlineShopStart = time;
- + }
- }
- \ No newline at end of file
- Index: java/net/sf/l2j/gameserver/GameServer.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/GameServer.java (revision 812)
- +++ java/net/sf/l2j/gameserver/GameServer.java (working copy)
- @@ -29,6 +29,7 @@
- import net.sf.l2j.gameserver.data.manager.BuyListManager;
- import net.sf.l2j.gameserver.data.sql.BookmarkTable;
- import net.sf.l2j.gameserver.data.sql.ClanTable;
- +import net.sf.l2j.gameserver.data.sql.OfflineTradersTable;
- import net.sf.l2j.gameserver.data.sql.PlayerInfoTable;
- import net.sf.l2j.gameserver.data.sql.ServerMemoTable;
- import net.sf.l2j.gameserver.data.xml.AdminData;
- @@ -182,6 +183,8 @@
- PetitionManager.getInstance();
- StringUtil.printSection("Characters");
- + if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
- + OfflineTradersTable.restoreOfflineTraders();
- PlayerData.getInstance();
- PlayerInfoTable.getInstance();
- NewbieBuffData.getInstance();
- Index: java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java (revision 812)
- +++ java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java (working copy)
- @@ -192,7 +192,7 @@
- writeD(0);
- }
- - writeD(_activeChar.getAppearance().getNameColor());
- + writeD(_activeChar.getClient().isDetached() ? Config.OFFLINE_NAME_COLOR : _activeChar.getAppearance().getNameColor());
- writeD(0x00); // isRunning() as in UserInfo?
- Index: java/net/sf/l2j/gameserver/network/L2GameClient.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/network/L2GameClient.java (revision 812)
- +++ java/net/sf/l2j/gameserver/network/L2GameClient.java (working copy)
- @@ -22,10 +22,13 @@
- import net.sf.l2j.L2DatabaseFactory;
- import net.sf.l2j.gameserver.LoginServerThread;
- import net.sf.l2j.gameserver.data.sql.ClanTable;
- +import net.sf.l2j.gameserver.data.sql.OfflineTradersTable;
- import net.sf.l2j.gameserver.data.sql.PlayerInfoTable;
- import net.sf.l2j.gameserver.model.CharSelectInfoPackage;
- import net.sf.l2j.gameserver.model.World;
- import net.sf.l2j.gameserver.model.actor.instance.Player;
- +import net.sf.l2j.gameserver.model.group.Party.MessageType;
- +import net.sf.l2j.gameserver.model.olympiad.OlympiadManager;
- import net.sf.l2j.gameserver.model.pledge.Clan;
- import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
- import net.sf.l2j.gameserver.network.serverpackets.L2GameServerPacket;
- @@ -436,6 +439,9 @@
- public void close(L2GameServerPacket gsp)
- {
- + if (getConnection() == null)
- + return;
- +
- getConnection().close(gsp);
- }
- @@ -532,6 +538,27 @@
- if (getActiveChar() != null && !isDetached())
- {
- setDetached(true);
- + if (OfflineTradersTable.offlineMode(getActiveChar()))
- + {
- + if (getActiveChar().getParty() != null)
- + getActiveChar().getParty().removePartyMember(getActiveChar(), MessageType.DISCONNECTED);
- +
- + OlympiadManager.getInstance().unRegisterNoble(getActiveChar());
- +
- + if (getActiveChar().getPet() != null)
- + {
- + getActiveChar().getPet().doRevive();
- + getActiveChar().getPet().unSummon(getActiveChar());
- + }
- +
- + if (Config.OFFLINE_SET_NAME_COLOR)
- + getActiveChar().broadcastUserInfo();
- +
- + if (getActiveChar().getOfflineStartTime() == 0)
- + getActiveChar().setOfflineStartTime(System.currentTimeMillis());
- +
- + return;
- + }
- fast = !getActiveChar().isInCombat() && !getActiveChar().isLocked();
- }
- cleanMe(fast);
- Index: java/net/sf/l2j/gameserver/Shutdown.java
- ===================================================================
- --- java/net/sf/l2j/gameserver/Shutdown.java (revision 812)
- +++ java/net/sf/l2j/gameserver/Shutdown.java (working copy)
- @@ -9,6 +9,7 @@
- import net.sf.l2j.Config;
- import net.sf.l2j.L2DatabaseFactory;
- import net.sf.l2j.gameserver.data.BufferTable;
- +import net.sf.l2j.gameserver.data.sql.OfflineTradersTable;
- import net.sf.l2j.gameserver.data.sql.ServerMemoTable;
- import net.sf.l2j.gameserver.instancemanager.CastleManorManager;
- import net.sf.l2j.gameserver.instancemanager.CoupleManager;
- @@ -100,6 +101,16 @@
- {
- StringUtil.printSection("Under " + MODE_TEXT[_shutdownMode] + " process");
- + // offline shop
- + try
- + {
- + if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
- + OfflineTradersTable.storeOffliners();
- + }
- + catch (Throwable t)
- + {
- + }
- +
- // disconnect players
- try
- {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement