From a4446d262c910067dbe756ad5a893524d830dd6a Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Thu, 13 May 2021 11:13:25 +0000 Subject: [PATCH] Fixed offline trading. --- .../org/l2jmobius/gameserver/GameServer.java | 4 +-- .../gameserver/LoginServerThread.java | 8 ++--- .../org/l2jmobius/gameserver/Shutdown.java | 4 +-- .../OfflineTraderTable.java} | 25 +++++++------ .../l2jmobius/gameserver/model/TradeList.java | 9 ++--- .../org/l2jmobius/gameserver/model/World.java | 3 +- .../gameserver/network/GameClient.java | 35 ++++++++++--------- .../SetPrivateStoreListSell.java | 2 +- .../org/l2jmobius/gameserver/GameServer.java | 4 +-- .../gameserver/LoginServerThread.java | 8 ++--- .../org/l2jmobius/gameserver/Shutdown.java | 4 +-- .../OfflineTraderTable.java} | 25 +++++++------ .../l2jmobius/gameserver/model/TradeList.java | 9 ++--- .../org/l2jmobius/gameserver/model/World.java | 3 +- .../gameserver/network/GameClient.java | 35 ++++++++++--------- .../SetPrivateStoreListSell.java | 2 +- 16 files changed, 92 insertions(+), 88 deletions(-) rename L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/data/{OfflineTradeTable.java => sql/OfflineTraderTable.java} (88%) rename L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/data/{OfflineTradeTable.java => sql/OfflineTraderTable.java} (88%) diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/GameServer.java index 9ae986bf10..e9fea17228 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/GameServer.java @@ -39,7 +39,6 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager; import org.l2jmobius.gameserver.data.HeroSkillTable; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.data.NobleSkillTable; -import org.l2jmobius.gameserver.data.OfflineTradeTable; import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; @@ -47,6 +46,7 @@ import org.l2jmobius.gameserver.data.sql.CharNameTable; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.sql.HelperBuffTable; import org.l2jmobius.gameserver.data.sql.NpcTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.data.sql.PetDataTable; import org.l2jmobius.gameserver.data.sql.SkillSpellbookTable; import org.l2jmobius.gameserver.data.sql.SkillTreeTable; @@ -440,7 +440,7 @@ public class GameServer if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) { - OfflineTradeTable.restoreOfflineTraders(); + OfflineTraderTable.restoreOfflineTraders(); } Util.printSection("Protection"); diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/LoginServerThread.java index 7549f20556..3a59e69760 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -261,8 +261,7 @@ public class LoginServerThread extends Thread { playerList.add(player.getAccountName()); } - final PlayerInGame pig = new PlayerInGame(playerList); - sendPacket(pig); + sendPacket(new PlayerInGame(playerList)); } break; } @@ -463,9 +462,10 @@ public class LoginServerThread extends Thread public void doKickPlayer(String account) { - if (_accountsInGameServer.get(account) != null) + final GameClient client = _accountsInGameServer.get(account); + if (client != null) { - _accountsInGameServer.get(account).closeNow(); + client.close(true); getInstance().sendLogout(account); } } diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java index 3767651f23..91016226e0 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java @@ -22,9 +22,9 @@ import org.l2jmobius.Config; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; -import org.l2jmobius.gameserver.data.OfflineTradeTable; import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.instancemanager.CastleManorManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager; @@ -413,7 +413,7 @@ public class Shutdown extends Thread { if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) { - OfflineTradeTable.storeOffliners(); + OfflineTraderTable.storeOffliners(); } } catch (Throwable t) diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/data/OfflineTradeTable.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/data/sql/OfflineTraderTable.java similarity index 88% rename from L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/data/OfflineTradeTable.java rename to L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/data/sql/OfflineTraderTable.java index 7bc8b2192c..a06f0dfdc6 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/data/OfflineTradeTable.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/data/sql/OfflineTraderTable.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.l2jmobius.gameserver.data; +package org.l2jmobius.gameserver.data.sql; import java.sql.Connection; import java.sql.PreparedStatement; @@ -32,15 +32,14 @@ import org.l2jmobius.gameserver.model.TradeList.TradeItem; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; -import org.l2jmobius.gameserver.network.ConnectionState; import org.l2jmobius.gameserver.network.GameClient; /** * @author Shyla */ -public class OfflineTradeTable +public class OfflineTraderTable { - private static final Logger LOGGER = Logger.getLogger(OfflineTradeTable.class.getName()); + private static final Logger LOGGER = Logger.getLogger(OfflineTraderTable.class.getName()); // SQL DEFINITIONS private static final String SAVE_OFFLINE_STATUS = "INSERT INTO character_offline_trade (`charId`,`time`,`type`,`title`) VALUES (?,?,?,?)"; @@ -143,7 +142,7 @@ public class OfflineTradeTable } default: { - // LOGGER.info( "OfflineTradersTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); + // LOGGER.info( "OfflineTraderTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); // no save for this kind of shop continue; } @@ -156,7 +155,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); + LOGGER.warning("OfflineTraderTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); } } stm.close(); @@ -165,7 +164,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeTradeItems()]: Error while saving offline traders: " + e); + LOGGER.warning("OfflineTraderTable[storeTradeItems()]: Error while saving offline traders: " + e); } } @@ -202,10 +201,10 @@ public class OfflineTradeTable try { final GameClient client = new GameClient(); + client.setDetached(true); player = PlayerInstance.load(rs.getInt("charId")); client.setPlayer(player); client.setAccountName(player.getAccountName()); - client.setConnectionState(ConnectionState.IN_GAME); player.setClient(client); player.setOfflineMode(true); player.setOnlineStatus(false); @@ -279,7 +278,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[loadOffliners()]: Error loading trader: " + e); + LOGGER.warning("OfflineTraderTable[loadOffliners()]: Error loading trader: " + e); if (player != null) { player.logout(); @@ -293,7 +292,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[loadOffliners()]: Error while loading offline traders: " + e); + LOGGER.warning("OfflineTraderTable[loadOffliners()]: Error while loading offline traders: " + e); } } @@ -392,7 +391,7 @@ public class OfflineTradeTable } default: { - // LOGGER.info( "OfflineTradersTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); + // LOGGER.info( "OfflineTraderTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); // no save for this kind of shop save = false; } @@ -408,7 +407,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); + LOGGER.warning("OfflineTraderTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); } stm.close(); @@ -416,7 +415,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeOffliner()]: Error while saving offline traders: " + e); + LOGGER.warning("OfflineTraderTable[storeOffliner()]: Error while saving offline traders: " + e); } } } diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/TradeList.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/TradeList.java index f94e790396..70acadbf0b 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/TradeList.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/TradeList.java @@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.model; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Logger; import org.l2jmobius.Config; import org.l2jmobius.gameserver.data.ItemTable; -import org.l2jmobius.gameserver.data.OfflineTradeTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory; import org.l2jmobius.gameserver.model.items.Item; @@ -145,7 +146,7 @@ public class TradeList public TradeList(PlayerInstance owner) { - _items = new ArrayList<>(); + _items = new CopyOnWriteArrayList<>(); _owner = owner; } @@ -1053,7 +1054,7 @@ public class TradeList if (_owner.isInOfflineMode()) { - OfflineTradeTable.storeOffliner(_owner); + OfflineTraderTable.storeOffliner(_owner); } return true; @@ -1302,7 +1303,7 @@ public class TradeList if (_owner.isInOfflineMode()) { - OfflineTradeTable.storeOffliner(_owner); + OfflineTraderTable.storeOffliner(_owner); } return true; diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java index bd84cc1b8f..3f4adaae9d 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java @@ -315,7 +315,8 @@ public class World if (!player.isTeleporting() && (tmp != null)) { - LOGGER.warning("Teleporting: Duplicate character!? Closing both characters (" + player.getName() + ")"); + // This can happen when offline system is enabled. + // LOGGER.warning("Teleporting: Duplicate character!? Closing both characters (" + player.getName() + ")"); player.closeNetConnection(); tmp.closeNetConnection(); return; diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/GameClient.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/GameClient.java index 21a00df7e3..19ffdf739f 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/GameClient.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/GameClient.java @@ -39,9 +39,9 @@ import org.l2jmobius.commons.network.IIncomingPacket; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread.SessionKey; -import org.l2jmobius.gameserver.data.OfflineTradeTable; import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.instancemanager.events.CTF; import org.l2jmobius.gameserver.instancemanager.events.DM; import org.l2jmobius.gameserver.instancemanager.events.GameEvent; @@ -490,8 +490,8 @@ public class GameClient extends ChannelInboundHandler PlayerInstance player = World.getInstance().getPlayer(objectId); if (player != null) { - // exploit prevention, should not happens in normal way - LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName); + // This can happen when offline system is enabled. + // LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName); if (player.getClient() != null) { @@ -505,9 +505,9 @@ public class GameClient extends ChannelInboundHandler { player.store(); } - catch (Exception e2) + catch (Exception e) { - LOGGER.warning("fixme:unhandled exception " + e2); + LOGGER.warning("GameClient: Count not store player. " + e); } } } @@ -640,8 +640,18 @@ public class GameClient extends ChannelInboundHandler player.decreaseBoxes(); } - // prevent closing again player.setClient(null); + + if ((player.isInStoreMode() && Config.OFFLINE_TRADE_ENABLE) // + || (player.isCrafting() && Config.OFFLINE_CRAFT_ENABLE)) + { + if (!Config.OFFLINE_MODE_IN_PEACE_ZONE || (Config.OFFLINE_MODE_IN_PEACE_ZONE && player.isInsideZone(ZoneId.PEACE))) + { + return; + } + } + + // prevent closing again player.deleteMe(); player.store(true); } @@ -727,7 +737,7 @@ public class GameClient extends ChannelInboundHandler if (Config.OFFLINE_MODE_SET_INVULNERABLE) { - _player.setInvul(true); + player.setInvul(true); } if (Config.OFFLINE_SET_NAME_COLOR) { @@ -741,7 +751,7 @@ public class GameClient extends ChannelInboundHandler player.setOfflineStartTime(Chronos.currentTimeMillis()); } - OfflineTradeTable.storeOffliner(player); + OfflineTraderTable.storeOffliner(player); World.OFFLINE_TRADE_COUNT++; return; } @@ -790,15 +800,6 @@ public class GameClient extends ChannelInboundHandler return false; } - /** - * Returns false if client can receive packets. True if detached or queue overflow detected and queue still not empty. - * @return - */ - public boolean dropPacket() - { - return _isDetached; - } - public void setProtocolVersion(int version) { _protocolVersion = version; diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java index e39ff79ec9..0370f13808 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java @@ -62,7 +62,7 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket _items[(x * 3) + 2] = price; } - return false; + return true; } @Override diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java index 91a4c55b1e..6ff13953d7 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java @@ -39,7 +39,6 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager; import org.l2jmobius.gameserver.data.HeroSkillTable; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.data.NobleSkillTable; -import org.l2jmobius.gameserver.data.OfflineTradeTable; import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; @@ -47,6 +46,7 @@ import org.l2jmobius.gameserver.data.sql.CharNameTable; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.sql.HelperBuffTable; import org.l2jmobius.gameserver.data.sql.NpcTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.data.sql.PetDataTable; import org.l2jmobius.gameserver.data.sql.SkillSpellbookTable; import org.l2jmobius.gameserver.data.sql.SkillTreeTable; @@ -452,7 +452,7 @@ public class GameServer if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) { - OfflineTradeTable.restoreOfflineTraders(); + OfflineTraderTable.restoreOfflineTraders(); } Util.printSection("Protection"); diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java index 73ac08aad4..e25a3ba5e1 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -262,8 +262,7 @@ public class LoginServerThread extends Thread { playerList.add(player.getAccountName()); } - final PlayerInGame pig = new PlayerInGame(playerList); - sendPacket(pig); + sendPacket(new PlayerInGame(playerList)); } break; } @@ -464,9 +463,10 @@ public class LoginServerThread extends Thread public void doKickPlayer(String account) { - if (_accountsInGameServer.get(account) != null) + final GameClient client = _accountsInGameServer.get(account); + if (client != null) { - _accountsInGameServer.get(account).closeNow(); + client.close(true); getInstance().sendLogout(account); } } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java index 43cd9d957e..b06fa42f84 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java @@ -22,9 +22,9 @@ import org.l2jmobius.Config; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; -import org.l2jmobius.gameserver.data.OfflineTradeTable; import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.instancemanager.CastleManorManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.FishingChampionshipManager; @@ -415,7 +415,7 @@ public class Shutdown extends Thread { if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) { - OfflineTradeTable.storeOffliners(); + OfflineTraderTable.storeOffliners(); } } catch (Throwable t) diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/data/OfflineTradeTable.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/data/sql/OfflineTraderTable.java similarity index 88% rename from L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/data/OfflineTradeTable.java rename to L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/data/sql/OfflineTraderTable.java index 7bc8b2192c..a06f0dfdc6 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/data/OfflineTradeTable.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/data/sql/OfflineTraderTable.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.l2jmobius.gameserver.data; +package org.l2jmobius.gameserver.data.sql; import java.sql.Connection; import java.sql.PreparedStatement; @@ -32,15 +32,14 @@ import org.l2jmobius.gameserver.model.TradeList.TradeItem; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; -import org.l2jmobius.gameserver.network.ConnectionState; import org.l2jmobius.gameserver.network.GameClient; /** * @author Shyla */ -public class OfflineTradeTable +public class OfflineTraderTable { - private static final Logger LOGGER = Logger.getLogger(OfflineTradeTable.class.getName()); + private static final Logger LOGGER = Logger.getLogger(OfflineTraderTable.class.getName()); // SQL DEFINITIONS private static final String SAVE_OFFLINE_STATUS = "INSERT INTO character_offline_trade (`charId`,`time`,`type`,`title`) VALUES (?,?,?,?)"; @@ -143,7 +142,7 @@ public class OfflineTradeTable } default: { - // LOGGER.info( "OfflineTradersTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); + // LOGGER.info( "OfflineTraderTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); // no save for this kind of shop continue; } @@ -156,7 +155,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); + LOGGER.warning("OfflineTraderTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); } } stm.close(); @@ -165,7 +164,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeTradeItems()]: Error while saving offline traders: " + e); + LOGGER.warning("OfflineTraderTable[storeTradeItems()]: Error while saving offline traders: " + e); } } @@ -202,10 +201,10 @@ public class OfflineTradeTable try { final GameClient client = new GameClient(); + client.setDetached(true); player = PlayerInstance.load(rs.getInt("charId")); client.setPlayer(player); client.setAccountName(player.getAccountName()); - client.setConnectionState(ConnectionState.IN_GAME); player.setClient(client); player.setOfflineMode(true); player.setOnlineStatus(false); @@ -279,7 +278,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[loadOffliners()]: Error loading trader: " + e); + LOGGER.warning("OfflineTraderTable[loadOffliners()]: Error loading trader: " + e); if (player != null) { player.logout(); @@ -293,7 +292,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[loadOffliners()]: Error while loading offline traders: " + e); + LOGGER.warning("OfflineTraderTable[loadOffliners()]: Error while loading offline traders: " + e); } } @@ -392,7 +391,7 @@ public class OfflineTradeTable } default: { - // LOGGER.info( "OfflineTradersTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); + // LOGGER.info( "OfflineTraderTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + ", store type: "+pc.getPrivateStoreType()); // no save for this kind of shop save = false; } @@ -408,7 +407,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); + LOGGER.warning("OfflineTraderTable[storeOffliner()]: Error while saving offline trader: " + pc.getObjectId() + " " + e); } stm.close(); @@ -416,7 +415,7 @@ public class OfflineTradeTable } catch (Exception e) { - LOGGER.warning("OfflineTradersTable[storeOffliner()]: Error while saving offline traders: " + e); + LOGGER.warning("OfflineTraderTable[storeOffliner()]: Error while saving offline traders: " + e); } } } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/TradeList.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/TradeList.java index 18e8fd39ee..328386ccaf 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/TradeList.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/TradeList.java @@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.model; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Logger; import org.l2jmobius.Config; import org.l2jmobius.gameserver.data.ItemTable; -import org.l2jmobius.gameserver.data.OfflineTradeTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory; import org.l2jmobius.gameserver.model.items.Item; @@ -157,7 +158,7 @@ public class TradeList public TradeList(PlayerInstance owner) { - _items = new ArrayList<>(); + _items = new CopyOnWriteArrayList<>(); _owner = owner; } @@ -1065,7 +1066,7 @@ public class TradeList if (_owner.isInOfflineMode()) { - OfflineTradeTable.storeOffliner(_owner); + OfflineTraderTable.storeOffliner(_owner); } return true; @@ -1322,7 +1323,7 @@ public class TradeList if (_owner.isInOfflineMode()) { - OfflineTradeTable.storeOffliner(_owner); + OfflineTraderTable.storeOffliner(_owner); } return true; diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java index bd84cc1b8f..3f4adaae9d 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java @@ -315,7 +315,8 @@ public class World if (!player.isTeleporting() && (tmp != null)) { - LOGGER.warning("Teleporting: Duplicate character!? Closing both characters (" + player.getName() + ")"); + // This can happen when offline system is enabled. + // LOGGER.warning("Teleporting: Duplicate character!? Closing both characters (" + player.getName() + ")"); player.closeNetConnection(); tmp.closeNetConnection(); return; diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/GameClient.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/GameClient.java index f56d0b224f..1861ced31f 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/GameClient.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/GameClient.java @@ -39,9 +39,9 @@ import org.l2jmobius.commons.network.IIncomingPacket; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread.SessionKey; -import org.l2jmobius.gameserver.data.OfflineTradeTable; import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.sql.OfflineTraderTable; import org.l2jmobius.gameserver.instancemanager.events.CTF; import org.l2jmobius.gameserver.instancemanager.events.DM; import org.l2jmobius.gameserver.instancemanager.events.GameEvent; @@ -484,8 +484,8 @@ public class GameClient extends ChannelInboundHandler PlayerInstance player = World.getInstance().getPlayer(objectId); if (player != null) { - // exploit prevention, should not happens in normal way - LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName); + // This can happen when offline system is enabled. + // LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName); if (player.getClient() != null) { @@ -499,9 +499,9 @@ public class GameClient extends ChannelInboundHandler { player.store(); } - catch (Exception e2) + catch (Exception e) { - LOGGER.warning("fixme:unhandled exception " + e2); + LOGGER.warning("GameClient: Count not store player. " + e); } } } @@ -634,8 +634,18 @@ public class GameClient extends ChannelInboundHandler player.decreaseBoxes(); } - // prevent closing again player.setClient(null); + + if ((player.isInStoreMode() && Config.OFFLINE_TRADE_ENABLE) // + || (player.isCrafting() && Config.OFFLINE_CRAFT_ENABLE)) + { + if (!Config.OFFLINE_MODE_IN_PEACE_ZONE || (Config.OFFLINE_MODE_IN_PEACE_ZONE && player.isInsideZone(ZoneId.PEACE))) + { + return; + } + } + + // prevent closing again player.deleteMe(); player.store(true); } @@ -721,7 +731,7 @@ public class GameClient extends ChannelInboundHandler if (Config.OFFLINE_MODE_SET_INVULNERABLE) { - _player.setInvul(true); + player.setInvul(true); } if (Config.OFFLINE_SET_NAME_COLOR) { @@ -735,7 +745,7 @@ public class GameClient extends ChannelInboundHandler player.setOfflineStartTime(Chronos.currentTimeMillis()); } - OfflineTradeTable.storeOffliner(player); + OfflineTraderTable.storeOffliner(player); World.OFFLINE_TRADE_COUNT++; return; } @@ -784,15 +794,6 @@ public class GameClient extends ChannelInboundHandler return false; } - /** - * Returns false if client can receive packets. True if detached or queue overflow detected and queue still not empty. - * @return - */ - public boolean dropPacket() - { - return _isDetached; - } - public void setProtocolVersion(int version) { _protocolVersion = version; diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java index e39ff79ec9..0370f13808 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/SetPrivateStoreListSell.java @@ -62,7 +62,7 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket _items[(x * 3) + 2] = price; } - return false; + return true; } @Override