Advertisement
Guest User

GameServer.java

a guest
Aug 3rd, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.21 KB | None | 0 0
  1. /*
  2.  * This program is free software: you can redistribute it and/or modify it under
  3.  * the terms of the GNU General Public License as published by the Free Software
  4.  * Foundation, either version 3 of the License, or (at your option) any later
  5.  * version.
  6.  *
  7.  * This program is distributed in the hope that it will be useful, but WITHOUT
  8.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9.  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10.  * details.
  11.  *
  12.  * You should have received a copy of the GNU General Public License along with
  13.  * this program. If not, see <http://www.gnu.org/licenses/>.
  14.  */
  15. package net.sf.l2j.gameserver;
  16.  
  17. import com.lameguard.LameGuard;
  18.  
  19. import java.io.File;
  20. import java.io.IOException;
  21. import java.net.InetAddress;
  22. import java.net.UnknownHostException;
  23. import java.util.Calendar;
  24.  
  25. import net.sf.l2j.commons.config.Config;
  26. import net.sf.l2j.commons.db.DatabaseFactory;
  27. import net.sf.l2j.commons.nio.SelectorConfig;
  28. import net.sf.l2j.commons.nio.SelectorThread;
  29. import net.sf.l2j.commons.type.Server;
  30. import net.sf.l2j.commons.util.DatabaseOptimizer;
  31. import net.sf.l2j.commons.util.DeadLockDetector;
  32. import net.sf.l2j.commons.util.IPv4Filter;
  33. import net.sf.l2j.commons.util.L2TopDeamon;
  34. import net.sf.l2j.commons.util.MMOTopDeamon;
  35. import net.sf.l2j.commons.util.Util;
  36. import net.sf.l2j.commons.util.security.AntiAfk;
  37. import net.sf.l2j.commons.util.security.AntiBot;
  38. import net.sf.l2j.gameserver.ai.L2AttackableAIScript;
  39. import net.sf.l2j.gameserver.cache.CrestCache;
  40. import net.sf.l2j.gameserver.cache.HtmCache;
  41. import net.sf.l2j.gameserver.communitybbs.Manager.ForumsBBSManager;
  42. import net.sf.l2j.gameserver.datatables.AccessLevels;
  43. import net.sf.l2j.gameserver.datatables.AdminCommandAccessRights;
  44. import net.sf.l2j.gameserver.datatables.ArmorSetsTable;
  45. import net.sf.l2j.gameserver.datatables.AugmentationData;
  46. import net.sf.l2j.gameserver.datatables.BookmarkTable;
  47. import net.sf.l2j.gameserver.datatables.BuyListTable;
  48. import net.sf.l2j.gameserver.datatables.CharNameTable;
  49. import net.sf.l2j.gameserver.datatables.CharTemplateTable;
  50. import net.sf.l2j.gameserver.datatables.ClanTable;
  51. import net.sf.l2j.gameserver.datatables.DoorTable;
  52. import net.sf.l2j.gameserver.datatables.FishTable;
  53. import net.sf.l2j.gameserver.datatables.GmListTable;
  54. import net.sf.l2j.gameserver.datatables.HelperBuffTable;
  55. import net.sf.l2j.gameserver.datatables.HennaTable;
  56. import net.sf.l2j.gameserver.datatables.HerbDropTable;
  57. import net.sf.l2j.gameserver.datatables.ItemTable;
  58. import net.sf.l2j.gameserver.datatables.MapRegionTable;
  59. import net.sf.l2j.gameserver.datatables.MultisellData;
  60. import net.sf.l2j.gameserver.datatables.NpcTable;
  61. import net.sf.l2j.gameserver.datatables.NpcWalkerRoutesTable;
  62. import net.sf.l2j.gameserver.datatables.OfflineTradersTable;
  63. import net.sf.l2j.gameserver.datatables.PetDataTable;
  64. import net.sf.l2j.gameserver.datatables.RecipeTable;
  65. import net.sf.l2j.gameserver.datatables.SkillTable;
  66. import net.sf.l2j.gameserver.datatables.SkillTreeTable;
  67. import net.sf.l2j.gameserver.datatables.SoulCrystalsTable;
  68. import net.sf.l2j.gameserver.datatables.SpawnTable;
  69. import net.sf.l2j.gameserver.datatables.SpellbookTable;
  70. import net.sf.l2j.gameserver.datatables.StaticObjects;
  71. import net.sf.l2j.gameserver.datatables.SummonItemsData;
  72. import net.sf.l2j.gameserver.datatables.TeleportLocationTable;
  73. import net.sf.l2j.gameserver.handler.HandlerLoader;
  74. import net.sf.l2j.gameserver.handler.admin.AdminCommandHandler;
  75. import net.sf.l2j.gameserver.handler.auto.AutoAnnouncementHandler;
  76. import net.sf.l2j.gameserver.handler.chat.ChatHandler;
  77. import net.sf.l2j.gameserver.handler.item.ItemHandler;
  78. import net.sf.l2j.gameserver.handler.skill.SkillHandler;
  79. import net.sf.l2j.gameserver.handler.user.UserCommandHandler;
  80. import net.sf.l2j.gameserver.handler.voiced.VoicedCommandHandler;
  81. import net.sf.l2j.gameserver.idfactory.IdFactory;
  82. import net.sf.l2j.gameserver.instancemanager.AuctionManager;
  83. import net.sf.l2j.gameserver.instancemanager.AutoSpawnManager;
  84. import net.sf.l2j.gameserver.instancemanager.BoatManager;
  85. import net.sf.l2j.gameserver.instancemanager.CastleManager;
  86. import net.sf.l2j.gameserver.instancemanager.CastleManorManager;
  87. import net.sf.l2j.gameserver.instancemanager.ClanHallManager;
  88. import net.sf.l2j.gameserver.instancemanager.CoupleManager;
  89. import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
  90. import net.sf.l2j.gameserver.instancemanager.DayNightSpawnManager;
  91. import net.sf.l2j.gameserver.instancemanager.DimensionalRiftManager;
  92. import net.sf.l2j.gameserver.instancemanager.FishingChampionshipManager;
  93. import net.sf.l2j.gameserver.instancemanager.FourSepulchersManager;
  94. import net.sf.l2j.gameserver.instancemanager.GrandBossManager;
  95. import net.sf.l2j.gameserver.instancemanager.ItemsOnGroundManager;
  96. import net.sf.l2j.gameserver.instancemanager.MercTicketManager;
  97. import net.sf.l2j.gameserver.instancemanager.MovieMakerManager;
  98. import net.sf.l2j.gameserver.instancemanager.PetitionManager;
  99. import net.sf.l2j.gameserver.instancemanager.PremiumManager;
  100. import net.sf.l2j.gameserver.instancemanager.QuestManager;
  101. import net.sf.l2j.gameserver.instancemanager.RaidBossPointsManager;
  102. import net.sf.l2j.gameserver.instancemanager.RaidBossSpawnManager;
  103. import net.sf.l2j.gameserver.instancemanager.SevenSigns;
  104. import net.sf.l2j.gameserver.instancemanager.SevenSignsFestival;
  105. import net.sf.l2j.gameserver.instancemanager.SiegeManager;
  106. import net.sf.l2j.gameserver.instancemanager.SiegeReward;
  107. import net.sf.l2j.gameserver.instancemanager.ZoneManager;
  108. import net.sf.l2j.gameserver.instancemanager.games.MonsterRace;
  109. import net.sf.l2j.gameserver.model.L2Manor;
  110. import net.sf.l2j.gameserver.model.L2World;
  111. import net.sf.l2j.gameserver.model.entity.Hero;
  112. import net.sf.l2j.gameserver.model.entity.events.EventManager;
  113. import net.sf.l2j.gameserver.model.entity.medals.EventMedals;
  114. import net.sf.l2j.gameserver.model.entity.pcbang.PcPoint;
  115. import net.sf.l2j.gameserver.model.entity.pcbang.ServerOnline;
  116. import net.sf.l2j.gameserver.model.olympiad.Olympiad;
  117. import net.sf.l2j.gameserver.model.olympiad.OlympiadGameManager;
  118. import net.sf.l2j.gameserver.model.partymatching.PartyMatchRoomList;
  119. import net.sf.l2j.gameserver.model.partymatching.PartyMatchWaitingList;
  120. import net.sf.l2j.gameserver.network.L2GameClient;
  121. import net.sf.l2j.gameserver.network.L2GamePacketHandler;
  122. import net.sf.l2j.gameserver.network.components.Message;
  123. import net.sf.l2j.gameserver.pathfinding.PathFinding;
  124. import net.sf.l2j.gameserver.scripting.L2ScriptEngineManager;
  125. import net.sf.l2j.gameserver.scripting.L2ScriptLoader;
  126. import net.sf.l2j.gameserver.taskmanager.ItemsAutoDestroyTaskManager;
  127. import net.sf.l2j.gameserver.taskmanager.KnownListUpdateTaskManager;
  128. import net.sf.l2j.gameserver.taskmanager.TaskManager;
  129. import net.sf.l2j.gameserver.taskmanager.tasks.TaskPremium;
  130. import net.sf.l2j.gameserver.xmlfactory.XMLDocumentFactory;
  131. import net.sf.l2j.protection.CatsGuard;
  132. import net.sf.l2j.protection.ProtectionProperties;
  133.  
  134. import org.slf4j.Logger;
  135. import org.slf4j.LoggerFactory;
  136.  
  137. public class GameServer
  138. {
  139.     private static final Logger _log = LoggerFactory.getLogger(GameServer.class.getName());
  140.    
  141.     private final SelectorThread<L2GameClient> _selectorThread;
  142.     private final L2GamePacketHandler _gamePacketHandler;
  143.     private final DeadLockDetector _deadDetectThread;
  144.     public static GameServer gameServer;
  145.     private final LoginServerThread _loginThread;
  146.     public static final Calendar dateTimeServerStarted = Calendar.getInstance();
  147.     long serverLoadStart = System.currentTimeMillis();
  148.    
  149.     public long getUsedMemoryMB()
  150.     {
  151.         return (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1048576; // 1024 * 1024 = 1048576;
  152.     }
  153.    
  154.     public SelectorThread<L2GameClient> getSelectorThread()
  155.     {
  156.         return _selectorThread;
  157.     }
  158.    
  159.     public GameServer() throws Throwable
  160.     {
  161.         gameServer = this;
  162.        
  163.         IdFactory.getInstance();
  164.         ThreadPoolManager.getInstance();
  165.        
  166.         new File("./data/crests").mkdirs();
  167.        
  168.         Util.printSection("World");
  169.         GameTimeController.getInstance();
  170.         L2World.getInstance();
  171.         MapRegionTable.getInstance();
  172.         Announcements.getInstance();
  173.         BookmarkTable.getInstance();
  174.        
  175.         Util.printSection("Skills");
  176.         SkillTable.getInstance();
  177.         SkillTreeTable.getInstance();
  178.        
  179.         Util.printSection("Items");
  180.         if (Config.PREMIUM_ITEM_ENABLED)
  181.         {
  182.             PremiumManager.getInstance();
  183.         }
  184.         ItemTable.getInstance();
  185.         SummonItemsData.getInstance();
  186.         BuyListTable.getInstance();
  187.         MultisellData.getInstance();
  188.         RecipeTable.getInstance();
  189.         ArmorSetsTable.getInstance();
  190.         FishTable.getInstance();
  191.         SpellbookTable.getInstance();
  192.         SoulCrystalsTable.load();
  193.        
  194.         Util.printSection("Augments");
  195.         AugmentationData.getInstance();
  196.        
  197.         Util.printSection("Characters");
  198.         AccessLevels.getInstance();
  199.         AdminCommandAccessRights.getInstance();
  200.         CharTemplateTable.getInstance();
  201.         CharNameTable.getInstance();
  202.         GmListTable.getInstance();
  203.         RaidBossPointsManager.getInstance();
  204.        
  205.         Util.printSection("Community server");
  206.         if (Config.ENABLE_COMMUNITY_BOARD)
  207.         {
  208.             ForumsBBSManager.getInstance().initRoot();
  209.         }
  210.         else
  211.         {
  212.             _log.info("Community server is disabled.");
  213.         }
  214.        
  215.         Util.printSection("Cache");
  216.         HtmCache.getInstance();
  217.         Message.getInstance();
  218.         CrestCache.load();
  219.         TeleportLocationTable.getInstance();
  220.         PartyMatchWaitingList.getInstance();
  221.         PartyMatchRoomList.getInstance();
  222.         PetitionManager.getInstance();
  223.         HennaTable.getInstance();
  224.         HelperBuffTable.getInstance();
  225.         CursedWeaponsManager.getInstance();
  226.        
  227.         Util.printSection("Clans");
  228.         ClanTable.getInstance();
  229.         AuctionManager.getInstance();
  230.         ClanHallManager.getInstance();
  231.        
  232.         Util.printSection("Geodata");
  233.         GeoData.getInstance();
  234.         if (Config.GEODATA == 2)
  235.         {
  236.             PathFinding.getInstance();
  237.         }
  238.        
  239.         Util.printSection("World Bosses");
  240.         GrandBossManager.getInstance();
  241.        
  242.         Util.printSection("Zones");
  243.         ZoneManager.getInstance();
  244.         GrandBossManager.getInstance().initZones();
  245.        
  246.         Util.printSection("Castles");
  247.         CastleManager.getInstance().load();
  248.        
  249.         Util.printSection("Seven Signs");
  250.         SevenSigns.getInstance().spawnSevenSignsNPC();
  251.         SevenSignsFestival.getInstance();
  252.        
  253.         Util.printSection("Sieges");
  254.         SiegeManager.getInstance();
  255.         SiegeManager.getSieges();
  256.         SiegeReward.getInstance();
  257.         MercTicketManager.getInstance();
  258.        
  259.         Util.printSection("Manor Manager");
  260.         CastleManorManager.getInstance();
  261.         L2Manor.getInstance();
  262.        
  263.         Util.printSection("NPCs");
  264.         HerbDropTable.getInstance();
  265.         PetDataTable.getInstance();
  266.         NpcTable.getInstance();
  267.         NpcWalkerRoutesTable.getInstance();
  268.         DoorTable.getInstance();
  269.         StaticObjects.load();
  270.         SpawnTable.getInstance();
  271.         RaidBossSpawnManager.getInstance();
  272.         DayNightSpawnManager.getInstance().trim().notifyChangeMode();
  273.         DimensionalRiftManager.getInstance();
  274.        
  275.         Util.printSection("Olympiads & Heroes");
  276.         OlympiadGameManager.getInstance();
  277.         Olympiad.getInstance();
  278.         Hero.getInstance();
  279.        
  280.         Util.printSection("Four Sepulchers");
  281.         FourSepulchersManager.getInstance().init();
  282.        
  283.         Util.printSection("Quests & Scripts");
  284.         QuestManager.getInstance();
  285.         BoatManager.getInstance();
  286.         L2AttackableAIScript.init();
  287.        
  288.         if (!Config.ALT_DEV_NO_SCRIPTS)
  289.         {
  290.             L2ScriptLoader.init(); // init compiled scripts loader
  291.            
  292.             try
  293.             {
  294.                 File scripts = new File("./data/scripts.cfg");
  295.                 L2ScriptEngineManager.getInstance().executeScriptList(scripts);
  296.             }
  297.             catch (IOException ioe)
  298.             {
  299.                 _log.error("Failed loading scripts.cfg, no script going to be loaded");
  300.             }
  301.             QuestManager.getInstance().report();
  302.         }
  303.         else
  304.         {
  305.             _log.info("QuestManager: Skipping scripts.");
  306.         }
  307.        
  308.         Util.printSection("Handlers");
  309.         HandlerLoader.init();
  310.         _log.info("AdminCommandHandler: Loaded " + AdminCommandHandler.getInstance().size() + " handlers.");
  311.         _log.info("AutoSpawnHandler: Loaded " + AutoSpawnManager.getInstance().size() + " handlers.");
  312.         _log.info("AutoAnnouncementHandler: Loaded " + AutoAnnouncementHandler.getInstance().size() + " handlers.");
  313.         _log.info("ChatHandler: Loaded " + ChatHandler.getInstance().size() + " handlers.");
  314.         _log.info("ItemHandler: Loaded " + ItemHandler.getInstance().size() + " handlers.");
  315.         _log.info("SkillHandler: Loaded " + SkillHandler.getInstance().size() + " handlers.");
  316.         _log.info("UserCommandHandler: Loaded " + UserCommandHandler.getInstance().size() + " handlers.");
  317.         _log.info("VoicedCommandHandler: Loaded " + VoicedCommandHandler.getInstance().size() + " handlers.");
  318.        
  319.         if (Config.SAVE_DROPPED_ITEM)
  320.         {
  321.             ItemsOnGroundManager.getInstance();
  322.         }
  323.        
  324.         if (Config.ITEM_AUTO_DESTROY_TIME > 0 || Config.HERB_AUTO_DESTROY_TIME > 0)
  325.         {
  326.             ItemsAutoDestroyTaskManager.getInstance();
  327.         }
  328.        
  329.         if (Config.PREMIUM_ITEM_ENABLED)
  330.         {
  331.             TaskPremium.getInstance();
  332.         }
  333.        
  334.         Util.printSection("Monster Derby Track");
  335.         MonsterRace.getInstance();
  336.        
  337.         Util.printSection("Guard System");
  338.         CatsGuard.getInstance();
  339.         if (!CatsGuard.getInstance().isEnabled())
  340.         {
  341.             try
  342.             {
  343.                 Class<?> clazz = Class.forName("com.lameguard.LameGuard");
  344.                 if (clazz != null)
  345.                 {
  346.                     File f = new File("./lameguard/lameguard.properties");
  347.                     if (f.exists())
  348.                     {
  349.                         Util.printSection("LameGuard");
  350.                         LameGuard.main(new String[]
  351.                         {
  352.                             "net.sf.l2j.protection.LameStub"
  353.                         });
  354.                     }
  355.                 }
  356.             }
  357.             catch (Exception ignored)
  358.             {
  359.             }
  360.         }
  361.        
  362.         if (Config.ALLOW_SEQURITY_QUE)
  363.         {
  364.             AntiBot.getInstance();
  365.         }
  366.         if (Config.ALLOW_ANTI_AFK)
  367.         {
  368.             AntiAfk.getInstance();
  369.         }
  370.        
  371.         Util.printSection("Events");
  372.         EventManager.getInstance();
  373.         EventMedals.startEvent();
  374.         if (Config.ALLOW_WEDDING)
  375.         {
  376.             CoupleManager.getInstance();
  377.         }
  378.        
  379.         if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
  380.         {
  381.             FishingChampionshipManager.getInstance();
  382.         }
  383.        
  384.         if (Config.PCB_ENABLE)
  385.         {
  386.             ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(PcPoint.getInstance(), Config.PCB_INTERVAL * 1000, Config.PCB_INTERVAL * 1000);
  387.         }
  388.         else if (Config.PCB_WINDOW_ONLINE)
  389.         {
  390.             ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(ServerOnline.getInstance(), Config.PCB_LIKE_WINDOW_ONLINE_RATE * 1000, Config.PCB_LIKE_WINDOW_ONLINE_RATE * 1000);
  391.         }
  392.         if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
  393.         {
  394.             OfflineTradersTable.restoreOfflineTraders();
  395.         }
  396.         L2TopDeamon.getInstance();
  397.         MMOTopDeamon.getInstance();
  398.        
  399.         Util.printSection("System");
  400.         TaskManager.getInstance();
  401.        
  402.         Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
  403.         ForumsBBSManager.getInstance();
  404.         _log.info("IdFactory: Free ObjectIDs remaining: " + IdFactory.getInstance().size());
  405.        
  406.         KnownListUpdateTaskManager.getInstance();
  407.         MovieMakerManager.getInstance();
  408.        
  409.         if (Config.DEADLOCK_DETECTOR)
  410.         {
  411.             _log.info("Deadlock detector is enabled. Timer: " + Config.DEADLOCK_CHECK_INTERVAL + "s.");
  412.             _deadDetectThread = new DeadLockDetector();
  413.             _deadDetectThread.setDaemon(true);
  414.             _deadDetectThread.start();
  415.         }
  416.         else
  417.         {
  418.             _log.info("Deadlock detector is disabled.");
  419.             _deadDetectThread = null;
  420.         }
  421.        
  422.         System.gc();
  423.        
  424.         long usedMem = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1048576;
  425.         long totalMem = Runtime.getRuntime().maxMemory() / 1048576;
  426.         _log.info("Gameserver have started, used memory: " + usedMem + " / " + totalMem + " Mo.");
  427.        
  428.         Util.printSection("Info");
  429.         _log.info("Maximum allowed players: " + Config.MAXIMUM_ONLINE_USERS);
  430.         _log.info("Server loaded in " + (System.currentTimeMillis() - serverLoadStart) / 1000 + " seconds");
  431.        
  432.         Util.printSection("Login");
  433.         _loginThread = LoginServerThread.getInstance();
  434.         _loginThread.start();
  435.        
  436.         final SelectorConfig sc = new SelectorConfig();
  437.         sc.MAX_READ_PER_PASS = Config.MMO_MAX_READ_PER_PASS;
  438.         sc.MAX_SEND_PER_PASS = Config.MMO_MAX_SEND_PER_PASS;
  439.         sc.SLEEP_TIME = Config.MMO_SELECTOR_SLEEP_TIME;
  440.         sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT;
  441.        
  442.         _gamePacketHandler = new L2GamePacketHandler();
  443.         _selectorThread = new SelectorThread<>(sc, _gamePacketHandler, _gamePacketHandler, _gamePacketHandler, new IPv4Filter());
  444.        
  445.         InetAddress bindAddress = null;
  446.         if (!Config.GAMESERVER_HOSTNAME.equals("*"))
  447.         {
  448.             try
  449.             {
  450.                 bindAddress = InetAddress.getByName(Config.GAMESERVER_HOSTNAME);
  451.             }
  452.             catch (UnknownHostException e1)
  453.             {
  454.                 _log.warn("WARNING: The GameServer bind address is invalid, using all available IPs. Reason: " + e1.getMessage(), e1);
  455.             }
  456.         }
  457.        
  458.         try
  459.         {
  460.             _selectorThread.openServerSocket(bindAddress, Config.PORT_GAME);
  461.         }
  462.         catch (IOException e)
  463.         {
  464.             _log.warn("FATAL: Failed to open server socket. Reason: " + e.getMessage(), e);
  465.             System.exit(1);
  466.         }
  467.         _selectorThread.start();
  468.     }
  469.    
  470.     public static void main(String[] args) throws Throwable
  471.     {
  472.         Server.serverMode = Server.MODE_GAMESERVER;
  473.        
  474.         final String LOG_FOLDER = "./log"; // Name of folder for log file
  475.        
  476.         // Create log folder
  477.         File logFolder = new File(LOG_FOLDER);
  478.         logFolder.mkdir();
  479.        
  480.         Util.printSection("Fatum");
  481.         // Initialize config
  482.         Config.load();
  483.         ProtectionProperties.init();
  484.        
  485.         // Factories
  486.         XMLDocumentFactory.getInstance();
  487.         DatabaseFactory.getInstance();
  488.         DatabaseOptimizer.getInstance();
  489.        
  490.         gameServer = new GameServer();
  491.     }
  492. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement