Advertisement
Guest User

Offline shop & craft

a guest
Feb 17th, 2013
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 24.97 KB | None | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P aCis_gameserver
  3. Index: java/net/sf/l2j/gameserver/GameServer.java
  4. ===================================================================
  5. --- java/net/sf/l2j/gameserver/GameServer.java  (revision 284)
  6. +++ java/net/sf/l2j/gameserver/GameServer.java  (working copy)
  7. @@ -28,6 +28,7 @@
  8.  import net.sf.l2j.Config;
  9.  import net.sf.l2j.L2DatabaseFactory;
  10.  import net.sf.l2j.Server;
  11. +import net.sf.l2j.gameserver.datatables.OfflineTradersTable;
  12.  import net.sf.l2j.gameserver.cache.CrestCache;
  13.  import net.sf.l2j.gameserver.cache.HtmCache;
  14.  import net.sf.l2j.gameserver.communitybbs.Manager.ForumsBBSManager;
  15. @@ -287,6 +288,9 @@
  16.         KnownListUpdateTaskManager.getInstance();
  17.         MovieMakerManager.getInstance();
  18.        
  19. +        if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
  20. +               OfflineTradersTable.restoreOfflineTraders();
  21. +      
  22.         if (Config.DEADLOCK_DETECTOR)
  23.         {
  24.             _log.info("Deadlock detector is enabled. Timer: " + Config.DEADLOCK_CHECK_INTERVAL + "s.");
  25. Index: java/net/sf/l2j/gameserver/network/L2GameClient.java
  26. ===================================================================
  27. --- java/net/sf/l2j/gameserver/network/L2GameClient.java    (revision 284)
  28. +++ java/net/sf/l2j/gameserver/network/L2GameClient.java    (working copy)
  29. @@ -27,6 +27,7 @@
  30.  import java.util.logging.Level;
  31.  import java.util.logging.Logger;
  32.  
  33. +import java.util.logging.LogRecord;
  34.  import net.sf.l2j.Config;
  35.  import net.sf.l2j.L2DatabaseFactory;
  36.  import net.sf.l2j.gameserver.LoginServerThread;
  37. @@ -450,9 +451,18 @@
  38.    
  39.     public void close(L2GameServerPacket gsp)
  40.     {
  41. +       if (getConnection() == null)
  42. +           return; // Offline shop
  43.         getConnection().close(gsp);
  44.     }
  45.    
  46. +   public void close(L2GameServerPacket[] gspArray)
  47. +   {
  48. +       if (getConnection() == null)
  49. +           return; // Offline shop
  50. +       getConnection().close(gspArray);
  51. +   }
  52. +  
  53.     /**
  54.      * @param charslot
  55.      * @return
  56. @@ -548,6 +558,23 @@
  57.                     setDetached(true);
  58.                     fast = !getActiveChar().isInCombat() && !getActiveChar().isLocked();
  59.                 }
  60. +               L2PcInstance player = L2GameClient.this.getActiveChar();
  61. +               if ((player.isInStoreMode() && Config.OFFLINE_TRADE_ENABLE) || (player.isInCraftMode() && Config.OFFLINE_CRAFT_ENABLE))
  62. +               {
  63. +                   player.leaveParty();
  64. +                   if (Config.OFFLINE_SET_NAME_COLOR)
  65. +                   {
  66. +                       player.getAppearance().setNameColor(Config.OFFLINE_NAME_COLOR);
  67. +                       player.broadcastUserInfo();
  68. +                   }
  69. +                   if (player.getOfflineStartTime() == 0)
  70. +                       player.setOfflineStartTime(System.currentTimeMillis());
  71. +                  
  72. +                   LogRecord record = new LogRecord(Level.INFO, "Entering offline mode");
  73. +                   record.setParameters(new Object[]{L2GameClient.this});
  74. +                   _log.log(record);
  75. +                   return;
  76. +               }
  77.                 cleanMe(fast);
  78.             }
  79.             catch (Exception e1)
  80. Index: java/net/sf/l2j/gameserver/Shutdown.java
  81. ===================================================================
  82. --- java/net/sf/l2j/gameserver/Shutdown.java    (revision 284)
  83. +++ java/net/sf/l2j/gameserver/Shutdown.java    (working copy)
  84. @@ -31,6 +31,7 @@
  85.  import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  86.  import net.sf.l2j.gameserver.model.entity.Hero;
  87.  import net.sf.l2j.gameserver.model.olympiad.Olympiad;
  88. +import net.sf.l2j.gameserver.datatables.OfflineTradersTable;
  89.  import net.sf.l2j.gameserver.network.L2GameClient;
  90.  import net.sf.l2j.gameserver.network.SystemMessageId;
  91.  import net.sf.l2j.gameserver.network.gameserverpackets.ServerStatus;
  92. @@ -114,6 +115,16 @@
  93.     {
  94.         if (this == SingletonHolder._instance)
  95.         {
  96. +           try
  97. +           {
  98. +               if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
  99. +                   OfflineTradersTable.storeOffliners();
  100. +           }
  101. +           catch (Throwable t)
  102. +           {
  103. +               _log.log(Level.WARNING, "Error saving offline shops.",t);
  104. +           }
  105. +          
  106.             Util.printSection("Under " + MODE_TEXT[_shutdownMode] + " process");
  107.            
  108.             // disconnect players
  109. Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
  110. ===================================================================
  111. --- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java   (revision 284)
  112. +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java   (working copy)
  113. @@ -442,6 +442,7 @@
  114.     public int _telemode = 0;
  115.     private boolean _inCrystallize;
  116.     private boolean _inCraftMode;
  117. +   private long _offlineShopStart = 0;
  118.    
  119.     /** The table containing all L2RecipeList of the L2PcInstance */
  120.     private final Map<Integer, L2RecipeList> _dwarvenRecipeBook = new HashMap<>();
  121. @@ -865,9 +866,16 @@
  122.    
  123.     public String getAccountName()
  124.     {
  125. +       if (getClient() == null)
  126. +           return getAccountNamePlayer();
  127.         return getClient().getAccountName();
  128.     }
  129.    
  130. +   public String getAccountNamePlayer()
  131. +   {
  132. +       return _accountName;
  133. +   }
  134. +  
  135.     public Map<Integer, String> getAccountChars()
  136.     {
  137.         return _chars;
  138. @@ -4814,6 +4822,11 @@
  139.     public void setPrivateStoreType(int type)
  140.     {
  141.         _privatestore = type;
  142. +      
  143. +       if (Config.OFFLINE_DISCONNECT_FINISHED && _privatestore == STORE_PRIVATE_NONE && (getClient() == null || getClient().isDetached()))
  144. +           {
  145. +               deleteMe();
  146. +           }
  147.     }
  148.    
  149.     /**
  150. @@ -11052,4 +11065,12 @@
  151.             }
  152.         }
  153.     }
  154. +   public long getOfflineStartTime()
  155. +   {
  156. +       return _offlineShopStart;
  157. +   }
  158. +   public void setOfflineStartTime(long time)
  159. +   {
  160. +       _offlineShopStart = time;
  161. +   }
  162.  }
  163. \ No newline at end of file
  164. Index: java/net/sf/l2j/Config.java
  165. ===================================================================
  166. --- java/net/sf/l2j/Config.java (revision 284)
  167. +++ java/net/sf/l2j/Config.java (working copy)
  168. @@ -638,6 +638,16 @@
  169.     public static int ZONE_TOWN;
  170.     public static boolean DISABLE_TUTORIAL;
  171.    
  172. +    /** Offline stores */
  173. +    public static boolean OFFLINE_TRADE_ENABLE;
  174. +    public static boolean OFFLINE_CRAFT_ENABLE;
  175. +    public static boolean RESTORE_OFFLINERS;
  176. +    public static int OFFLINE_MAX_DAYS;
  177. +    public static boolean OFFLINE_DISCONNECT_FINISHED;
  178. +    public static boolean OFFLINE_SET_NAME_COLOR;
  179. +    public static int OFFLINE_NAME_COLOR;
  180. +  
  181.     // --------------------------------------------------
  182.     // Those "hidden" settings haven't configs to avoid admins to fuck their server
  183.     // You still can experiment changing values here. But don't say I didn't warn you.
  184. @@ -1312,6 +1322,15 @@
  185.             ZONE_TOWN = server.getProperty("ZoneTown", 0);
  186.             SERVER_NEWS = server.getProperty("ShowServerNews", false);
  187.             DISABLE_TUTORIAL = server.getProperty("DisableTutorial", false);
  188. +          
  189. +           OFFLINE_TRADE_ENABLE = Boolean.parseBoolean(server.getProperty("OfflineTradeEnable", "false"));
  190. +           OFFLINE_CRAFT_ENABLE = Boolean.parseBoolean(server.getProperty("OfflineCraftEnable", "false"));
  191. +           OFFLINE_SET_NAME_COLOR = Boolean.parseBoolean(server.getProperty("OfflineSetNameColor", "false"));
  192. +           OFFLINE_NAME_COLOR = Integer.decode("0x" + server.getProperty("OfflineNameColor", "808080"));
  193. +           RESTORE_OFFLINERS = Boolean.parseBoolean(server.getProperty("RestoreOffliners", "false"));
  194. +           OFFLINE_MAX_DAYS = Integer.parseInt(server.getProperty("OfflineMaxDays", "10"));
  195. +           OFFLINE_DISCONNECT_FINISHED = Boolean.parseBoolean(server.getProperty("OfflineDisconnectFinished", "true"));
  196.         }
  197.         else if (Server.serverMode == Server.MODE_LOGINSERVER)
  198.         {
  199. Index: java/net/sf/l2j/gameserver/datatables/OfflineTradersTable.java
  200. ===================================================================
  201. --- java/net/sf/l2j/gameserver/datatables/OfflineTradersTable.java  (revision 0)
  202. +++ java/net/sf/l2j/gameserver/datatables/OfflineTradersTable.java  (revision 0)
  203. @@ -0,0 +1,249 @@
  204. +/*
  205. + * This program is free software: you can redistribute it and/or modify it under
  206. + * the terms of the GNU General Public License as published by the Free Software
  207. + * Foundation, either version 3 of the License, or (at your option) any later
  208. + * version.
  209. + *
  210. + * This program is distributed in the hope that it will be useful, but WITHOUT
  211. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  212. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  213. + * details.
  214. + *
  215. + * You should have received a copy of the GNU General Public License along with
  216. + * this program. If not, see <http://www.gnu.org/licenses/>.
  217. + */
  218. +package net.sf.l2j.gameserver.datatables;
  219. +
  220. +import java.sql.Connection;
  221. +import java.sql.PreparedStatement;
  222. +import java.sql.ResultSet;
  223. +import java.util.Calendar;
  224. +import java.util.logging.Level;
  225. +import java.util.logging.Logger;
  226. +
  227. +import net.sf.l2j.Config;
  228. +import net.sf.l2j.L2DatabaseFactory;
  229. +import net.sf.l2j.gameserver.LoginServerThread;
  230. +import net.sf.l2j.gameserver.model.L2ManufactureItem;
  231. +import net.sf.l2j.gameserver.model.L2ManufactureList;
  232. +import net.sf.l2j.gameserver.model.L2World;
  233. +import net.sf.l2j.gameserver.model.TradeList.TradeItem;
  234. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  235. +import net.sf.l2j.gameserver.network.L2GameClient;
  236. +import net.sf.l2j.gameserver.network.L2GameClient.GameClientState;
  237. +
  238. +public class OfflineTradersTable
  239. +{
  240. +       private static Logger _log = Logger.getLogger(OfflineTradersTable.class.getName());
  241. +      
  242. +       //SQL DEFINITIONS
  243. +       private static final String SAVE_OFFLINE_STATUS = "INSERT INTO character_offline_trade (`charId`,`time`,`type`,`title`) VALUES (?,?,?,?)";
  244. +       private static final String SAVE_ITEMS = "INSERT INTO character_offline_trade_items (`charId`,`item`,`count`,`price`) VALUES (?,?,?,?)";
  245. +       private static final String CLEAR_OFFLINE_TABLE = "DELETE FROM character_offline_trade";
  246. +       private static final String CLEAR_OFFLINE_TABLE_ITEMS = "DELETE FROM character_offline_trade_items";
  247. +       private static final String LOAD_OFFLINE_STATUS = "SELECT * FROM character_offline_trade";
  248. +       private static final String LOAD_OFFLINE_ITEMS = "SELECT * FROM character_offline_trade_items WHERE charId = ?";
  249. +      
  250. +       public static void storeOffliners()
  251. +       {
  252. +               try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  253. +               {
  254. +                       PreparedStatement stm = con.prepareStatement(CLEAR_OFFLINE_TABLE);
  255. +                       stm.execute();
  256. +                       stm.close();
  257. +                       stm = con.prepareStatement(CLEAR_OFFLINE_TABLE_ITEMS);
  258. +                       stm.execute();
  259. +                       stm.close();
  260. +                      
  261. +                       con.setAutoCommit(false); // avoid halfway done
  262. +                       stm = con.prepareStatement(SAVE_OFFLINE_STATUS);
  263. +                       PreparedStatement stm_items = con.prepareStatement(SAVE_ITEMS);
  264. +                      
  265. +                       //TextBuilder items = TextBuilder.newInstance();
  266. +                       for (L2PcInstance pc : L2World.getInstance().getAllPlayers().values())
  267. +                       {
  268. +                               try
  269. +                               {
  270. +                                       if ((pc.getPrivateStoreType() != L2PcInstance.STORE_PRIVATE_NONE) && (pc.getClient() == null || pc.getClient().isDetached()))
  271. +                                       {
  272. +                                               stm.setInt(1, pc.getObjectId()); //Char Id
  273. +                                               stm.setLong(2, pc.getOfflineStartTime());
  274. +                                               stm.setInt(3, pc.getPrivateStoreType()); //store type
  275. +                                               String title = null;
  276. +                                              
  277. +                                               switch (pc.getPrivateStoreType())
  278. +                                               {
  279. +                                                       case L2PcInstance.STORE_PRIVATE_BUY:
  280. +                                                               if (!Config.OFFLINE_TRADE_ENABLE)
  281. +                                                                       continue;
  282. +                                                               title = pc.getBuyList().getTitle();
  283. +                                                               for (TradeItem i : pc.getBuyList().getItems())
  284. +                                                               {
  285. +                                                                       stm_items.setInt(1, pc.getObjectId());
  286. +                                                                       stm_items.setInt(2, i.getItem().getItemId());
  287. +                                                                       stm_items.setInt(3, i.getCount());
  288. +                                                                       stm_items.setInt(4, i.getPrice());
  289. +                                                                       stm_items.executeUpdate();
  290. +                                                                       stm_items.clearParameters();
  291. +                                                               }
  292. +                                                               break;
  293. +                                                       case L2PcInstance.STORE_PRIVATE_SELL:
  294. +                                                       case L2PcInstance.STORE_PRIVATE_PACKAGE_SELL:
  295. +                                                               if (!Config.OFFLINE_TRADE_ENABLE)
  296. +                                                                       continue;
  297. +                                                               title = pc.getSellList().getTitle();
  298. +                                                               for (TradeItem i : pc.getSellList().getItems())
  299. +                                                               {
  300. +                                                                       stm_items.setInt(1, pc.getObjectId());
  301. +                                                                       stm_items.setInt(2, i.getObjectId());
  302. +                                                                       stm_items.setInt(3, i.getCount());
  303. +                                                                       stm_items.setInt(4, i.getPrice());
  304. +                                                                       stm_items.executeUpdate();
  305. +                                                                       stm_items.clearParameters();
  306. +                                                               }
  307. +                                                               break;
  308. +                                                       case L2PcInstance.STORE_PRIVATE_MANUFACTURE:
  309. +                                                               if (!Config.OFFLINE_CRAFT_ENABLE)
  310. +                                                                       continue;
  311. +                                                               title = pc.getCreateList().getStoreName();
  312. +                                                               for (L2ManufactureItem i : pc.getCreateList().getList())
  313. +                                                               {
  314. +                                                                       stm_items.setInt(1, pc.getObjectId());
  315. +                                                                       stm_items.setInt(2, i.getRecipeId());
  316. +                                                                       stm_items.setLong(3, 0);
  317. +                                                                       stm_items.setLong(4, i.getCost());
  318. +                                                                       stm_items.executeUpdate();
  319. +                                                                       stm_items.clearParameters();
  320. +                                                               }
  321. +                                               }
  322. +                                               stm.setString(4, title);
  323. +                                               stm.executeUpdate();
  324. +                                               stm.clearParameters();
  325. +                                               con.commit(); // flush
  326. +                                       }
  327. +                               }
  328. +                               catch (Exception e)
  329. +                               {
  330. +                                       _log.log(Level.WARNING, "OfflineTradersTable[storeTradeItems()]: Error while saving offline trader: " + pc.getObjectId() + " " + e, e);
  331. +                               }
  332. +                       }
  333. +                       stm.close();
  334. +                       stm_items.close();
  335. +                       _log.info("Offline traders stored.");
  336. +               }
  337. +               catch (Exception e)
  338. +               {
  339. +                       _log.log(Level.WARNING,"OfflineTradersTable[storeTradeItems()]: Error while saving offline traders: " + e,e);
  340. +               }
  341. +       }
  342. +      
  343. +       public static void restoreOfflineTraders()
  344. +       {
  345. +               _log.info("Loading offline traders...");
  346. +               int nTraders = 0;
  347. +               try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  348. +               {
  349. +                       PreparedStatement stm = con.prepareStatement(LOAD_OFFLINE_STATUS);
  350. +                       ResultSet rs = stm.executeQuery();
  351. +                       while (rs.next())
  352. +                       {
  353. +                               long time = rs.getLong("time");
  354. +                               if (Config.OFFLINE_MAX_DAYS > 0)
  355. +                               {
  356. +                                       Calendar cal = Calendar.getInstance();
  357. +                                       cal.setTimeInMillis(time);
  358. +                                       cal.add(Calendar.DAY_OF_YEAR, Config.OFFLINE_MAX_DAYS);
  359. +                                       if (cal.getTimeInMillis() <= System.currentTimeMillis())
  360. +                                               continue;
  361. +                               }
  362. +                              
  363. +                               int type = rs.getInt("type");
  364. +                               if (type == L2PcInstance.STORE_PRIVATE_NONE)
  365. +                                       continue;
  366. +                              
  367. +                               L2PcInstance player = null;
  368. +                              
  369. +                               try
  370. +                               {
  371. +                                       L2GameClient client = new L2GameClient(null);
  372. +                                       client.setDetached(true);
  373. +                                       player = L2PcInstance.load(rs.getInt("charId"));
  374. +                                       client.setActiveChar(player);
  375. +                                       player.setOnlineStatus(true, false);
  376. +                                       client.setAccountName(player.getAccountName());
  377. +                                       client.setState(GameClientState.IN_GAME);
  378. +                                       player.setClient(client);
  379. +                                       player.setOfflineStartTime(time);
  380. +                                       player.spawnMe(player.getX(), player.getY(), player.getZ());
  381. +                                       LoginServerThread.getInstance().addGameServerLogin(player.getAccountName(), client);
  382. +                                       PreparedStatement stm_items = con.prepareStatement(LOAD_OFFLINE_ITEMS);
  383. +                                       stm_items.setInt(1, player.getObjectId());
  384. +                                       ResultSet items = stm_items.executeQuery();
  385. +                                      
  386. +                                       switch (type)
  387. +                                       {
  388. +                                               case L2PcInstance.STORE_PRIVATE_BUY:
  389. +                                                       while (items.next())
  390. +                                                       {
  391. +                                                               if (player.getBuyList().addItemByItemId(items.getInt(2), items.getInt(3), items.getInt(4)) == null)
  392. +                                                                       throw new NullPointerException();
  393. +                                                       }
  394. +                                                       player.getBuyList().setTitle(rs.getString("title"));
  395. +                                                       break;
  396. +                                               case L2PcInstance.STORE_PRIVATE_SELL:
  397. +                                               case L2PcInstance.STORE_PRIVATE_PACKAGE_SELL:
  398. +                                                       while (items.next())
  399. +                                                       {
  400. +                                                               if (player.getSellList().addItem(items.getInt(2), items.getInt(3), items.getInt(4)) == null)
  401. +                                                                       throw new NullPointerException();
  402. +                                                       }
  403. +                                                       player.getSellList().setTitle(rs.getString("title"));
  404. +                                                       player.getSellList().setPackaged(type == L2PcInstance.STORE_PRIVATE_PACKAGE_SELL);
  405. +                                                       break;
  406. +                                               case L2PcInstance.STORE_PRIVATE_MANUFACTURE:
  407. +                                                       L2ManufactureList createList = new L2ManufactureList();
  408. +                                                       while (items.next())
  409. +                                                       {
  410. +                                                               createList.add(new L2ManufactureItem(items.getInt(2), items.getInt(4)));
  411. +                                                       }
  412. +                                                       player.setCreateList(createList);
  413. +                                                       player.getCreateList().setStoreName(rs.getString("title"));
  414. +                                                       break;
  415. +                                       }
  416. +                                       items.close();
  417. +                                       stm_items.close();
  418. +                                      
  419. +                                       player.sitDown();
  420. +                                       if (Config.OFFLINE_SET_NAME_COLOR)
  421. +                                               player.getAppearance().setNameColor(Config.OFFLINE_NAME_COLOR);
  422. +                                       player.setPrivateStoreType(type);
  423. +                                       player.setOnlineStatus(true, true);
  424. +                                       player.restoreEffects();
  425. +                                       player.broadcastUserInfo();
  426. +                                       nTraders++;
  427. +                               }
  428. +                               catch (Exception e)
  429. +                               {
  430. +                                       _log.log(Level.WARNING, "OfflineTradersTable[loadOffliners()]: Error loading trader: "+player,e);
  431. +                                       if (player != null)
  432. +                                       {
  433. +                                               player.deleteMe();
  434. +                                       }
  435. +                               }
  436. +                       }
  437. +                       rs.close();
  438. +                       stm.close();
  439. +                       _log.info("Loaded: " +nTraders+ " offline trader(s)");
  440. +                       stm = con.prepareStatement(CLEAR_OFFLINE_TABLE);
  441. +                       stm.execute();
  442. +                       stm.close();
  443. +                       stm = con.prepareStatement(CLEAR_OFFLINE_TABLE_ITEMS);
  444. +                       stm.execute();
  445. +                       stm.close();
  446. +               }
  447. +               catch (Exception e)
  448. +               {
  449. +                       _log.log(Level.WARNING, "OfflineTradersTable[loadOffliners()]: Error while loading offline traders: ",e);
  450. +               }
  451. +       }
  452. +}
  453. \ No newline at end of file
  454. Index: config/server.properties
  455. ===================================================================
  456. --- config/server.properties    (revision 284)
  457. +++ config/server.properties    (working copy)
  458. @@ -376,4 +376,36 @@
  459.  
  460.  # Disable tutorial on new player game entrance.
  461.  # Default: False
  462. -DisableTutorial = False
  463. \ No newline at end of file
  464. +DisableTutorial = False
  465. +
  466. +# ================================================================
  467. +#                       Offline trade & craft
  468. +# ================================================================
  469. +
  470. +# Enable or disable offline trade mode
  471. +# Default: False
  472. +OfflineTradeEnable = True
  473. +
  474. +# Enable or disable offline craft mode
  475. +# Default: False
  476. +OfflineCraftEnable = True
  477. +
  478. +# Offline name color
  479. +OfflineSetNameColor = True
  480. +OfflineNameColor = 808080
  481. +
  482. +# Restore offline traders/crafters after restart/shutdown.
  483. +# Default: false.
  484. +RestoreOffliners = True
  485. +
  486. +# Restore offline characters for X days
  487. +#Default: 10
  488. +OfflineMaxDays = 10
  489. +
  490. +#Disconnect shop after finished selling, buying.
  491. +#Default: True
  492. +OfflineDisconnectFinished = True
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement