Fixed offline trading.

This commit is contained in:
MobiusDevelopment
2021-05-13 11:13:25 +00:00
parent 3da292017a
commit a4446d262c
16 changed files with 92 additions and 88 deletions

View File

@@ -39,7 +39,6 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.HeroSkillTable; import org.l2jmobius.gameserver.data.HeroSkillTable;
import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.data.ItemTable;
import org.l2jmobius.gameserver.data.NobleSkillTable; import org.l2jmobius.gameserver.data.NobleSkillTable;
import org.l2jmobius.gameserver.data.OfflineTradeTable;
import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.SchemeBufferTable;
import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.SkillTable;
import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; 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.ClanTable;
import org.l2jmobius.gameserver.data.sql.HelperBuffTable; import org.l2jmobius.gameserver.data.sql.HelperBuffTable;
import org.l2jmobius.gameserver.data.sql.NpcTable; 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.PetDataTable;
import org.l2jmobius.gameserver.data.sql.SkillSpellbookTable; import org.l2jmobius.gameserver.data.sql.SkillSpellbookTable;
import org.l2jmobius.gameserver.data.sql.SkillTreeTable; 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) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
OfflineTradeTable.restoreOfflineTraders(); OfflineTraderTable.restoreOfflineTraders();
} }
Util.printSection("Protection"); Util.printSection("Protection");

View File

@@ -261,8 +261,7 @@ public class LoginServerThread extends Thread
{ {
playerList.add(player.getAccountName()); playerList.add(player.getAccountName());
} }
final PlayerInGame pig = new PlayerInGame(playerList); sendPacket(new PlayerInGame(playerList));
sendPacket(pig);
} }
break; break;
} }
@@ -463,9 +462,10 @@ public class LoginServerThread extends Thread
public void doKickPlayer(String account) 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); getInstance().sendLogout(account);
} }
} }

View File

@@ -22,9 +22,9 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseBackup;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.OfflineTradeTable;
import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.SchemeBufferTable;
import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; 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.CastleManorManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; 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) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
OfflineTradeTable.storeOffliners(); OfflineTraderTable.storeOffliners();
} }
} }
catch (Throwable t) catch (Throwable t)

View File

@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.data; package org.l2jmobius.gameserver.data.sql;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; 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.World;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.ConnectionState;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
/** /**
* @author Shyla * @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 // SQL DEFINITIONS
private static final String SAVE_OFFLINE_STATUS = "INSERT INTO character_offline_trade (`charId`,`time`,`type`,`title`) VALUES (?,?,?,?)"; 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: 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 // no save for this kind of shop
continue; continue;
} }
@@ -156,7 +155,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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(); stm.close();
@@ -165,7 +164,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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 try
{ {
final GameClient client = new GameClient(); final GameClient client = new GameClient();
client.setDetached(true);
player = PlayerInstance.load(rs.getInt("charId")); player = PlayerInstance.load(rs.getInt("charId"));
client.setPlayer(player); client.setPlayer(player);
client.setAccountName(player.getAccountName()); client.setAccountName(player.getAccountName());
client.setConnectionState(ConnectionState.IN_GAME);
player.setClient(client); player.setClient(client);
player.setOfflineMode(true); player.setOfflineMode(true);
player.setOnlineStatus(false); player.setOnlineStatus(false);
@@ -279,7 +278,7 @@ public class OfflineTradeTable
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("OfflineTradersTable[loadOffliners()]: Error loading trader: " + e); LOGGER.warning("OfflineTraderTable[loadOffliners()]: Error loading trader: " + e);
if (player != null) if (player != null)
{ {
player.logout(); player.logout();
@@ -293,7 +292,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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: 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 // no save for this kind of shop
save = false; save = false;
} }
@@ -408,7 +407,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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(); stm.close();
@@ -416,7 +415,7 @@ public class OfflineTradeTable
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("OfflineTradersTable[storeOffliner()]: Error while saving offline traders: " + e); LOGGER.warning("OfflineTraderTable[storeOffliner()]: Error while saving offline traders: " + e);
} }
} }
} }

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.ItemTable; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory; import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
@@ -145,7 +146,7 @@ public class TradeList
public TradeList(PlayerInstance owner) public TradeList(PlayerInstance owner)
{ {
_items = new ArrayList<>(); _items = new CopyOnWriteArrayList<>();
_owner = owner; _owner = owner;
} }
@@ -1053,7 +1054,7 @@ public class TradeList
if (_owner.isInOfflineMode()) if (_owner.isInOfflineMode())
{ {
OfflineTradeTable.storeOffliner(_owner); OfflineTraderTable.storeOffliner(_owner);
} }
return true; return true;
@@ -1302,7 +1303,7 @@ public class TradeList
if (_owner.isInOfflineMode()) if (_owner.isInOfflineMode())
{ {
OfflineTradeTable.storeOffliner(_owner); OfflineTraderTable.storeOffliner(_owner);
} }
return true; return true;

View File

@@ -315,7 +315,8 @@ public class World
if (!player.isTeleporting() && (tmp != null)) 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(); player.closeNetConnection();
tmp.closeNetConnection(); tmp.closeNetConnection();
return; return;

View File

@@ -39,9 +39,9 @@ import org.l2jmobius.commons.network.IIncomingPacket;
import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.commons.util.Chronos;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.LoginServerThread.SessionKey; import org.l2jmobius.gameserver.LoginServerThread.SessionKey;
import org.l2jmobius.gameserver.data.OfflineTradeTable;
import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.SkillTable;
import org.l2jmobius.gameserver.data.sql.ClanTable; 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.CTF;
import org.l2jmobius.gameserver.instancemanager.events.DM; import org.l2jmobius.gameserver.instancemanager.events.DM;
import org.l2jmobius.gameserver.instancemanager.events.GameEvent; import org.l2jmobius.gameserver.instancemanager.events.GameEvent;
@@ -490,8 +490,8 @@ public class GameClient extends ChannelInboundHandler<GameClient>
PlayerInstance player = World.getInstance().getPlayer(objectId); PlayerInstance player = World.getInstance().getPlayer(objectId);
if (player != null) if (player != null)
{ {
// exploit prevention, should not happens in normal way // This can happen when offline system is enabled.
LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName); // LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName);
if (player.getClient() != null) if (player.getClient() != null)
{ {
@@ -505,9 +505,9 @@ public class GameClient extends ChannelInboundHandler<GameClient>
{ {
player.store(); 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<GameClient>
player.decreaseBoxes(); player.decreaseBoxes();
} }
// prevent closing again
player.setClient(null); 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.deleteMe();
player.store(true); player.store(true);
} }
@@ -727,7 +737,7 @@ public class GameClient extends ChannelInboundHandler<GameClient>
if (Config.OFFLINE_MODE_SET_INVULNERABLE) if (Config.OFFLINE_MODE_SET_INVULNERABLE)
{ {
_player.setInvul(true); player.setInvul(true);
} }
if (Config.OFFLINE_SET_NAME_COLOR) if (Config.OFFLINE_SET_NAME_COLOR)
{ {
@@ -741,7 +751,7 @@ public class GameClient extends ChannelInboundHandler<GameClient>
player.setOfflineStartTime(Chronos.currentTimeMillis()); player.setOfflineStartTime(Chronos.currentTimeMillis());
} }
OfflineTradeTable.storeOffliner(player); OfflineTraderTable.storeOffliner(player);
World.OFFLINE_TRADE_COUNT++; World.OFFLINE_TRADE_COUNT++;
return; return;
} }
@@ -790,15 +800,6 @@ public class GameClient extends ChannelInboundHandler<GameClient>
return false; 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) public void setProtocolVersion(int version)
{ {
_protocolVersion = version; _protocolVersion = version;

View File

@@ -62,7 +62,7 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
_items[(x * 3) + 2] = price; _items[(x * 3) + 2] = price;
} }
return false; return true;
} }
@Override @Override

View File

@@ -39,7 +39,6 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.HeroSkillTable; import org.l2jmobius.gameserver.data.HeroSkillTable;
import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.data.ItemTable;
import org.l2jmobius.gameserver.data.NobleSkillTable; import org.l2jmobius.gameserver.data.NobleSkillTable;
import org.l2jmobius.gameserver.data.OfflineTradeTable;
import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.SchemeBufferTable;
import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.SkillTable;
import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; 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.ClanTable;
import org.l2jmobius.gameserver.data.sql.HelperBuffTable; import org.l2jmobius.gameserver.data.sql.HelperBuffTable;
import org.l2jmobius.gameserver.data.sql.NpcTable; 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.PetDataTable;
import org.l2jmobius.gameserver.data.sql.SkillSpellbookTable; import org.l2jmobius.gameserver.data.sql.SkillSpellbookTable;
import org.l2jmobius.gameserver.data.sql.SkillTreeTable; 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) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
OfflineTradeTable.restoreOfflineTraders(); OfflineTraderTable.restoreOfflineTraders();
} }
Util.printSection("Protection"); Util.printSection("Protection");

View File

@@ -262,8 +262,7 @@ public class LoginServerThread extends Thread
{ {
playerList.add(player.getAccountName()); playerList.add(player.getAccountName());
} }
final PlayerInGame pig = new PlayerInGame(playerList); sendPacket(new PlayerInGame(playerList));
sendPacket(pig);
} }
break; break;
} }
@@ -464,9 +463,10 @@ public class LoginServerThread extends Thread
public void doKickPlayer(String account) 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); getInstance().sendLogout(account);
} }
} }

View File

@@ -22,9 +22,9 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseBackup;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.OfflineTradeTable;
import org.l2jmobius.gameserver.data.SchemeBufferTable; import org.l2jmobius.gameserver.data.SchemeBufferTable;
import org.l2jmobius.gameserver.data.sql.AnnouncementsTable; 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.CastleManorManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
import org.l2jmobius.gameserver.instancemanager.FishingChampionshipManager; 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) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
OfflineTradeTable.storeOffliners(); OfflineTraderTable.storeOffliners();
} }
} }
catch (Throwable t) catch (Throwable t)

View File

@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.data; package org.l2jmobius.gameserver.data.sql;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; 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.World;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.ConnectionState;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
/** /**
* @author Shyla * @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 // SQL DEFINITIONS
private static final String SAVE_OFFLINE_STATUS = "INSERT INTO character_offline_trade (`charId`,`time`,`type`,`title`) VALUES (?,?,?,?)"; 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: 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 // no save for this kind of shop
continue; continue;
} }
@@ -156,7 +155,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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(); stm.close();
@@ -165,7 +164,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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 try
{ {
final GameClient client = new GameClient(); final GameClient client = new GameClient();
client.setDetached(true);
player = PlayerInstance.load(rs.getInt("charId")); player = PlayerInstance.load(rs.getInt("charId"));
client.setPlayer(player); client.setPlayer(player);
client.setAccountName(player.getAccountName()); client.setAccountName(player.getAccountName());
client.setConnectionState(ConnectionState.IN_GAME);
player.setClient(client); player.setClient(client);
player.setOfflineMode(true); player.setOfflineMode(true);
player.setOnlineStatus(false); player.setOnlineStatus(false);
@@ -279,7 +278,7 @@ public class OfflineTradeTable
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("OfflineTradersTable[loadOffliners()]: Error loading trader: " + e); LOGGER.warning("OfflineTraderTable[loadOffliners()]: Error loading trader: " + e);
if (player != null) if (player != null)
{ {
player.logout(); player.logout();
@@ -293,7 +292,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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: 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 // no save for this kind of shop
save = false; save = false;
} }
@@ -408,7 +407,7 @@ public class OfflineTradeTable
} }
catch (Exception e) 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(); stm.close();
@@ -416,7 +415,7 @@ public class OfflineTradeTable
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("OfflineTradersTable[storeOffliner()]: Error while saving offline traders: " + e); LOGGER.warning("OfflineTraderTable[storeOffliner()]: Error while saving offline traders: " + e);
} }
} }
} }

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.ItemTable; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory; import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
@@ -157,7 +158,7 @@ public class TradeList
public TradeList(PlayerInstance owner) public TradeList(PlayerInstance owner)
{ {
_items = new ArrayList<>(); _items = new CopyOnWriteArrayList<>();
_owner = owner; _owner = owner;
} }
@@ -1065,7 +1066,7 @@ public class TradeList
if (_owner.isInOfflineMode()) if (_owner.isInOfflineMode())
{ {
OfflineTradeTable.storeOffliner(_owner); OfflineTraderTable.storeOffliner(_owner);
} }
return true; return true;
@@ -1322,7 +1323,7 @@ public class TradeList
if (_owner.isInOfflineMode()) if (_owner.isInOfflineMode())
{ {
OfflineTradeTable.storeOffliner(_owner); OfflineTraderTable.storeOffliner(_owner);
} }
return true; return true;

View File

@@ -315,7 +315,8 @@ public class World
if (!player.isTeleporting() && (tmp != null)) 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(); player.closeNetConnection();
tmp.closeNetConnection(); tmp.closeNetConnection();
return; return;

View File

@@ -39,9 +39,9 @@ import org.l2jmobius.commons.network.IIncomingPacket;
import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.commons.util.Chronos;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.LoginServerThread.SessionKey; import org.l2jmobius.gameserver.LoginServerThread.SessionKey;
import org.l2jmobius.gameserver.data.OfflineTradeTable;
import org.l2jmobius.gameserver.data.SkillTable; import org.l2jmobius.gameserver.data.SkillTable;
import org.l2jmobius.gameserver.data.sql.ClanTable; 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.CTF;
import org.l2jmobius.gameserver.instancemanager.events.DM; import org.l2jmobius.gameserver.instancemanager.events.DM;
import org.l2jmobius.gameserver.instancemanager.events.GameEvent; import org.l2jmobius.gameserver.instancemanager.events.GameEvent;
@@ -484,8 +484,8 @@ public class GameClient extends ChannelInboundHandler<GameClient>
PlayerInstance player = World.getInstance().getPlayer(objectId); PlayerInstance player = World.getInstance().getPlayer(objectId);
if (player != null) if (player != null)
{ {
// exploit prevention, should not happens in normal way // This can happen when offline system is enabled.
LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName); // LOGGER.warning("Attempt of double login: " + player.getName() + "(" + objectId + ") " + _accountName);
if (player.getClient() != null) if (player.getClient() != null)
{ {
@@ -499,9 +499,9 @@ public class GameClient extends ChannelInboundHandler<GameClient>
{ {
player.store(); 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<GameClient>
player.decreaseBoxes(); player.decreaseBoxes();
} }
// prevent closing again
player.setClient(null); 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.deleteMe();
player.store(true); player.store(true);
} }
@@ -721,7 +731,7 @@ public class GameClient extends ChannelInboundHandler<GameClient>
if (Config.OFFLINE_MODE_SET_INVULNERABLE) if (Config.OFFLINE_MODE_SET_INVULNERABLE)
{ {
_player.setInvul(true); player.setInvul(true);
} }
if (Config.OFFLINE_SET_NAME_COLOR) if (Config.OFFLINE_SET_NAME_COLOR)
{ {
@@ -735,7 +745,7 @@ public class GameClient extends ChannelInboundHandler<GameClient>
player.setOfflineStartTime(Chronos.currentTimeMillis()); player.setOfflineStartTime(Chronos.currentTimeMillis());
} }
OfflineTradeTable.storeOffliner(player); OfflineTraderTable.storeOffliner(player);
World.OFFLINE_TRADE_COUNT++; World.OFFLINE_TRADE_COUNT++;
return; return;
} }
@@ -784,15 +794,6 @@ public class GameClient extends ChannelInboundHandler<GameClient>
return false; 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) public void setProtocolVersion(int version)
{ {
_protocolVersion = version; _protocolVersion = version;

View File

@@ -62,7 +62,7 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
_items[(x * 3) + 2] = price; _items[(x * 3) + 2] = price;
} }
return false; return true;
} }
@Override @Override