/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * http://www.gnu.org/copyleft/gpl.html */ package net.sf.l2j.gameserver; import java.io.File; import java.io.InputStream; import java.util.Properties; import java.util.logging.Logger; import net.sf.l2j.gameserver.handler.itemhandlers.Funny; import net.sf.l2j.Config; import net.sf.l2j.Server; import net.sf.l2j.gameserver.handler.AdminCommandHandler; import net.sf.l2j.gameserver.handler.ItemHandler; import net.sf.l2j.gameserver.handler.SkillHandler; import net.sf.l2j.gameserver.handler.UserCommandHandler; import net.sf.l2j.gameserver.handler.VoicedCommandHandler; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminAdmin; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminAnnouncements; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminBan; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminBanChat; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminChangeAccessLevel; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminCreateItem; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminDelete; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminDoorControl; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminEditChar; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminEditNpc; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminEffects; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminExpSp; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminFightCalculator; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminForth; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminGm; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminGmChat; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminHeal; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminHelpPage; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminInvul; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminKick; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminKill; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminMammon; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminMenu; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminMobGroup; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminMonsterRace; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminPathNode; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminPolymorph; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRepairChar; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRes; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRideWyvern; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSeige; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminShop; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminShutdown; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSkill; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSpawn; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTarget; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTeleport; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTest; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminUnblockIp; import net.sf.l2j.gameserver.handler.itemhandlers.BlessedSpiritShot; import net.sf.l2j.gameserver.handler.itemhandlers.CharChangePotions; import net.sf.l2j.gameserver.handler.itemhandlers.CompBlessedSpiritShotPacks; import net.sf.l2j.gameserver.handler.itemhandlers.CompSoulShotPacks; import net.sf.l2j.gameserver.handler.itemhandlers.CompSpiritShotPacks; import net.sf.l2j.gameserver.handler.itemhandlers.CrystalCarol; import net.sf.l2j.gameserver.handler.itemhandlers.EnchantScrolls; import net.sf.l2j.gameserver.handler.itemhandlers.Firework; import net.sf.l2j.gameserver.handler.itemhandlers.Guide; import net.sf.l2j.gameserver.handler.itemhandlers.MysteryPotion; import net.sf.l2j.gameserver.handler.itemhandlers.PetSummon; import net.sf.l2j.gameserver.handler.itemhandlers.Potions; import net.sf.l2j.gameserver.handler.itemhandlers.Recipes; import net.sf.l2j.gameserver.handler.itemhandlers.Remedy; import net.sf.l2j.gameserver.handler.itemhandlers.RollingDice; import net.sf.l2j.gameserver.handler.itemhandlers.ScrollOfEscape; import net.sf.l2j.gameserver.handler.itemhandlers.ScrollOfResurrection; import net.sf.l2j.gameserver.handler.itemhandlers.Scrolls; import net.sf.l2j.gameserver.handler.itemhandlers.SevenSignsRecord; import net.sf.l2j.gameserver.handler.itemhandlers.SoulCrystals; import net.sf.l2j.gameserver.handler.itemhandlers.SoulShots; import net.sf.l2j.gameserver.handler.itemhandlers.SpiritShot; import net.sf.l2j.gameserver.handler.itemhandlers.WorldMap; import net.sf.l2j.gameserver.handler.skillhandlers.Charge; import net.sf.l2j.gameserver.handler.skillhandlers.CombatPointHeal; import net.sf.l2j.gameserver.handler.skillhandlers.Continuous; import net.sf.l2j.gameserver.handler.skillhandlers.Disablers; import net.sf.l2j.gameserver.handler.skillhandlers.Drain; import net.sf.l2j.gameserver.handler.skillhandlers.DrainSoul; import net.sf.l2j.gameserver.handler.skillhandlers.Heal; import net.sf.l2j.gameserver.handler.skillhandlers.ManaHeal; import net.sf.l2j.gameserver.handler.skillhandlers.Mdam; import net.sf.l2j.gameserver.handler.skillhandlers.Pdam; import net.sf.l2j.gameserver.handler.skillhandlers.Recall; import net.sf.l2j.gameserver.handler.skillhandlers.Resurrect; import net.sf.l2j.gameserver.handler.skillhandlers.SiegeFlag; import net.sf.l2j.gameserver.handler.skillhandlers.Spoil; import net.sf.l2j.gameserver.handler.skillhandlers.Sweep; import net.sf.l2j.gameserver.handler.skillhandlers.TakeCastle; import net.sf.l2j.gameserver.handler.skillhandlers.Unlock; import net.sf.l2j.gameserver.handler.usercommandhandlers.Escape; import net.sf.l2j.gameserver.handler.usercommandhandlers.Loc; import net.sf.l2j.gameserver.handler.usercommandhandlers.Time; import net.sf.l2j.gameserver.handler.voicedcommandhandlers.kill; import net.sf.l2j.gameserver.idfactory.IdFactory; import net.sf.l2j.gameserver.lib.JBForth; import net.sf.l2j.gameserver.model.AutoChatHandler; import net.sf.l2j.gameserver.model.L2Siege; import net.sf.l2j.gameserver.model.L2World; import net.sf.l2j.gameserver.model.RandomSpawnHandler; import net.sf.l2j.gameserver.model.quest.Quest; import net.sf.l2j.gameserver.script.ScriptEngine; import net.sf.l2j.gameserver.script.faenor.FaenorScriptEngine; import net.sf.l2j.loginserver.LoginController; /** * This class ... * * @version $Revision: 1.29.2.15.2.19 $ $Date: 2005/04/05 19:41:23 $ */ public class GameServer { static Logger _log = Logger.getLogger(GameServer.class.getName()); private final SelectorThread _selectorThread; private final TradeController _tradeController; private final SkillTable _skillTable; private final SkillTreeTable _skillTreeTable; private final SkillSpellbookTable _skillSpellbookTable; private final ClanTable _clanTable; private final ItemTable _itemTable; private final NpcTable _npcTable; private final CastleGuardsSpawner _cgspawner; private final HennaTable _hennaTable; private final HennaTreeTable _hennaTreeTable; private final TeleportLocationTable _teleTable; private final LevelUpData _levelUpData; private final Universe _universe; private final L2World _world; private final CharTemplateTable _charTemplates; private final IdFactory _idFactory; private final LoginController _loginController; private final SpawnTable _spawnTable; private final CharNameTable _charNametable; private final GameTimeController _gameTimeController; private final Announcements _announcements; private final MapRegionTable _mapRegions; private final ItemHandler _itemHandler; private final SkillHandler _skillHandler; private final GmListTable _gmList; private final AdminCommandHandler _adminCommandHandler; private final Shutdown _shutdownHandler; private final RecipeController _recipeController; private final UserCommandHandler _userCommandHandler; private final VoicedCommandHandler _voicedCommandHandler; private final EventDroplist _eventDroplist; private final DoorTable _doorTable; private final SevenSigns _sevenSignsEngine; private final AutoChatHandler _autoChatHandler; private final RandomSpawnHandler _randomSpawnHandler; private final ScriptEngine _scriptEngine; private static JBForth _jbf; private static boolean autoloot = false; private MonsterRace _monsterRace; public long getUsedMemoryMB() { return (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/1024/1024; } public static boolean autoLootEnabled() { return autoloot; } public LoginController getLoginController() { return _loginController; } public SelectorThread getSelectorThread() { return _selectorThread; } public static final JBForth getJBF() { return _jbf; } public GameServer() throws Exception { Server.gameServer = this; _log.finest("used mem:" + getUsedMemoryMB()+"MB" ); if (Config.SERVER_VERSION != null) { _log.info("L2J Server Version: "+Config.SERVER_VERSION); _log.info("L2J Server Build Date: "+Config.SERVER_BUILD_DATE); } Properties serverSettings = new Properties(); InputStream is = getClass().getResourceAsStream(Config.CONFIGURATION_FILE); serverSettings.load(is); is.close(); _idFactory = IdFactory.getInstance(); if (!_idFactory.isInitialized()) { _log.severe("Could not read object IDs from DB. Please Check Your Data."); throw new Exception("Could not initialize the ID factory"); } autoloot = Config.AUTO_LOOT; String hostname = serverSettings.getProperty("GameserverHostname"); int port = Integer.parseInt(serverSettings.getProperty("GameserverPort", "7777")); ClientScheduler.getInstance(); _selectorThread = new SelectorThread(hostname, port); _selectorThread.start(); String maxPlayerStr = serverSettings.getProperty("MaximumOnlineUsers"); int maxPlayers = Integer.parseInt(maxPlayerStr); _log.config("Maximum Numbers of Connected Players: "+ maxPlayers); new File(Config.DATAPACK_ROOT, "data/clans").mkdirs(); new File(Config.DATAPACK_ROOT, "data/crests").mkdirs(); new File("pathnode").mkdirs(); // start game time control early _gameTimeController = GameTimeController.getInstance(); // keep the references of Singletons to prevent garbage collection _loginController = LoginController.getInstance(); _loginController.setMaxAllowedOnlinePlayers(maxPlayers); _charNametable = CharNameTable.getInstance(); _jbf = new JBForth(); _itemTable = ItemTable.getInstance(); if (!_itemTable.isInitialized()) { _log.severe("Could not find the extraced files. Please Check Your Data."); throw new Exception("Could not initialize the item table"); } _tradeController = TradeController.getInstance(); _skillTable = SkillTable.getInstance(); if (!_skillTable.isInitialized()) { _log.severe("Could not find the extraced files. Please Check Your Data."); throw new Exception("Could not initialize the skill table"); } _recipeController = RecipeController.getInstance(); _skillTreeTable = SkillTreeTable.getInstance(); _skillSpellbookTable = SkillSpellbookTable.getInstance(); _charTemplates = CharTemplateTable.getInstance(); _clanTable = ClanTable.getInstance(); _cgspawner = CastleGuardsSpawner.getInstance(); _npcTable = NpcTable.getInstance(); if (!_npcTable.isInitialized()) { _log.severe("Could not find the extraced files. Please Check Your Data."); throw new Exception("Could not initialize the npc table"); } _hennaTable = HennaTable.getInstance(); if (!_hennaTable.isInitialized()) { throw new Exception("Could not initialize the Henna Table"); } _hennaTreeTable = HennaTreeTable.getInstance(); if (!_hennaTable.isInitialized()) { throw new Exception("Could not initialize the Henna Tree Table"); } _teleTable = TeleportLocationTable.getInstance(); _levelUpData = LevelUpData.getInstance(); _world = L2World.getInstance(); //_world.initWorldContent(); _spawnTable = SpawnTable.getInstance(); _announcements = Announcements.getInstance(); _mapRegions = MapRegionTable.getInstance(); _eventDroplist = EventDroplist.getInstance(); _monsterRace = MonsterRace.getInstance(); //_monsterRace.newRace(); _doorTable = DoorTable.getInstance(); _sevenSignsEngine = SevenSigns.getInstance(); _randomSpawnHandler = RandomSpawnHandler.getInstance(); _autoChatHandler = AutoChatHandler.getInstance(); AutoChatHandler.setChatDelay(-1); // -1 = default (in ms) AutoChatHandler.setRandomChat(true); // Use random chat for Seven Signs usage if (_sevenSignsEngine.isSealValidationPeriod()) _sevenSignsEngine.spawnSevenSignsNPCs(); // Auto chats for other NPCs can be added BEFORE the line below \\ _autoChatHandler.start(); _log.config("AutoChatHandler: Loaded " + _autoChatHandler.size() + " handlers."); // Random spawns for other NPCs can be added BEFORE the line below \\ _randomSpawnHandler.start(); _log.config("RandomSpawnHandler: Loaded " + _randomSpawnHandler.size() + " handlers."); _itemHandler = ItemHandler.getInstance(); _itemHandler.registerItemHandler(new PetSummon()); _itemHandler.registerItemHandler(new Funny()); _itemHandler.registerItemHandler(new ScrollOfEscape()); _itemHandler.registerItemHandler(new ScrollOfResurrection()); _itemHandler.registerItemHandler(new SoulShots()); _itemHandler.registerItemHandler(new SpiritShot()); _itemHandler.registerItemHandler(new BlessedSpiritShot()); _itemHandler.registerItemHandler(new WorldMap()); _itemHandler.registerItemHandler(new Potions()); _itemHandler.registerItemHandler(new Recipes()); _itemHandler.registerItemHandler(new CompSoulShotPacks()); _itemHandler.registerItemHandler(new CompSpiritShotPacks()); _itemHandler.registerItemHandler(new CompBlessedSpiritShotPacks()); _itemHandler.registerItemHandler(new RollingDice()); _itemHandler.registerItemHandler(new MysteryPotion()); _itemHandler.registerItemHandler(new EnchantScrolls()); _itemHandler.registerItemHandler(new Remedy()); _itemHandler.registerItemHandler(new Guide()); _itemHandler.registerItemHandler(new Scrolls()); _itemHandler.registerItemHandler(new CrystalCarol()); _itemHandler.registerItemHandler(new SoulCrystals()); _itemHandler.registerItemHandler(new SevenSignsRecord()); _itemHandler.registerItemHandler(new CharChangePotions()); _itemHandler.registerItemHandler(new Firework()); _log.config("ItemHandler: Loaded " + _itemHandler.size() + " handlers."); _skillHandler = SkillHandler.getInstance(); _skillHandler.registerSkillHandler(new Pdam()); _skillHandler.registerSkillHandler(new Mdam()); _skillHandler.registerSkillHandler(new Heal()); _skillHandler.registerSkillHandler(new CombatPointHeal()); _skillHandler.registerSkillHandler(new ManaHeal()); _skillHandler.registerSkillHandler(new Charge()); _skillHandler.registerSkillHandler(new Continuous()); _skillHandler.registerSkillHandler(new Drain()); _skillHandler.registerSkillHandler(new Resurrect()); _skillHandler.registerSkillHandler(new Spoil()); _skillHandler.registerSkillHandler(new Sweep()); _skillHandler.registerSkillHandler(new Disablers()); _skillHandler.registerSkillHandler(new Recall()); _skillHandler.registerSkillHandler(new SiegeFlag()); _skillHandler.registerSkillHandler(new TakeCastle()); _skillHandler.registerSkillHandler(new Unlock()); _skillHandler.registerSkillHandler(new DrainSoul()); _log.config("SkillHandler: Loaded " + _skillHandler.size() + " handlers."); _adminCommandHandler = AdminCommandHandler.getInstance(); _adminCommandHandler.registerAdminCommandHandler(new AdminAdmin()); _adminCommandHandler.registerAdminCommandHandler(new AdminInvul()); _adminCommandHandler.registerAdminCommandHandler(new AdminDelete()); _adminCommandHandler.registerAdminCommandHandler(new AdminKill()); _adminCommandHandler.registerAdminCommandHandler(new AdminTarget()); _adminCommandHandler.registerAdminCommandHandler(new AdminShop()); _adminCommandHandler.registerAdminCommandHandler(new AdminAnnouncements()); _adminCommandHandler.registerAdminCommandHandler(new AdminCreateItem()); _adminCommandHandler.registerAdminCommandHandler(new AdminHeal()); _adminCommandHandler.registerAdminCommandHandler(new AdminHelpPage()); _adminCommandHandler.registerAdminCommandHandler(new AdminShutdown()); _adminCommandHandler.registerAdminCommandHandler(new AdminSpawn()); _adminCommandHandler.registerAdminCommandHandler(new AdminSkill()); _adminCommandHandler.registerAdminCommandHandler(new AdminExpSp()); _adminCommandHandler.registerAdminCommandHandler(new AdminGmChat()); _adminCommandHandler.registerAdminCommandHandler(new AdminEditChar()); _adminCommandHandler.registerAdminCommandHandler(new AdminGm()); _adminCommandHandler.registerAdminCommandHandler(new AdminTeleport()); _adminCommandHandler.registerAdminCommandHandler(new AdminRepairChar()); _adminCommandHandler.registerAdminCommandHandler(new AdminChangeAccessLevel()); _adminCommandHandler.registerAdminCommandHandler(new AdminRideWyvern()); _adminCommandHandler.registerAdminCommandHandler(new AdminBan()); _adminCommandHandler.registerAdminCommandHandler(new AdminPolymorph()); _adminCommandHandler.registerAdminCommandHandler(new AdminBanChat()); _adminCommandHandler.registerAdminCommandHandler(new AdminKick()); _adminCommandHandler.registerAdminCommandHandler(new AdminMonsterRace()); _adminCommandHandler.registerAdminCommandHandler(new AdminEditNpc()); _adminCommandHandler.registerAdminCommandHandler(new AdminFightCalculator()); _adminCommandHandler.registerAdminCommandHandler(new AdminForth()); _adminCommandHandler.registerAdminCommandHandler(new AdminMenu()); _adminCommandHandler.registerAdminCommandHandler(new AdminSeige()); _adminCommandHandler.registerAdminCommandHandler(new AdminPathNode()); _adminCommandHandler.registerAdminCommandHandler(new AdminEffects()); _adminCommandHandler.registerAdminCommandHandler(new AdminDoorControl()); _adminCommandHandler.registerAdminCommandHandler(new AdminTest()); _adminCommandHandler.registerAdminCommandHandler(new AdminMobGroup()); _adminCommandHandler.registerAdminCommandHandler(new AdminRes()); _adminCommandHandler.registerAdminCommandHandler(new AdminMammon()); _adminCommandHandler.registerAdminCommandHandler(new AdminUnblockIp()); //_adminCommandHandler.registerAdminCommandHandler(new AdminRadar()); _log.config("AdminCommandHandler: Loaded " + _adminCommandHandler.size() + " handlers."); _userCommandHandler = UserCommandHandler.getInstance(); _userCommandHandler.registerUserCommandHandler(new Loc()); _userCommandHandler.registerUserCommandHandler(new Escape()); _userCommandHandler.registerUserCommandHandler(new Time()); _log.config("UserCommandHandler: Loaded " + _userCommandHandler.size() + " handlers."); _voicedCommandHandler = VoicedCommandHandler.getInstance(); _voicedCommandHandler.registerVoicedCommandHandler(new kill()); _log.config("VoicedCommandHandler: Loaded " + _voicedCommandHandler.size() + " handlers."); _gmList = GmListTable.getInstance(); _scriptEngine = new FaenorScriptEngine(); _universe = Universe.getInstance(); Quest.init(); _clanTable.initClans(); L2Siege.loadSiegeData(); _shutdownHandler = Shutdown.getInstance(); Runtime.getRuntime().addShutdownHook(_shutdownHandler); try { _doorTable.getDoor(24190001).openMe(); _doorTable.getDoor(24190002).openMe(); _doorTable.getDoor(24190003).openMe(); _doorTable.getDoor(24190004).openMe(); _doorTable.getDoor(23180001).openMe(); _doorTable.getDoor(23180002).openMe(); _doorTable.getDoor(23180003).openMe(); _doorTable.getDoor(23180004).openMe(); _doorTable.getDoor(23180005).openMe(); _doorTable.getDoor(23180006).openMe(); } catch (NullPointerException e) { _log.warning("Door.csv does not contain the right door info. Update door.csv"); e.printStackTrace(); } _log.config("IdFactory: Free ObjctId's remaining: " + IdFactory.getInstance().size()); _jbf.exec("on-server-start"); _jbf.data.st.push(_doorTable); _jbf.exec("doors-table!"); _jbf.data.st.push(_world); _jbf.exec("world!"); System.gc(); // maxMemory is the upper limit the jvm can use, totalMemory the size of the current allocation pool, freeMemory the unused memory in the allocation pool long freeMem = (Runtime.getRuntime().maxMemory()-Runtime.getRuntime().totalMemory()+Runtime.getRuntime().freeMemory()) / 1024 / 1024; long totalMem = Runtime.getRuntime().maxMemory() / 1024 / 1024; _log.info("GameServer Started, free memory "+freeMem+" Mb of "+totalMem+" Mb"); } }