/* * 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */ package silentium.gameserver.configs; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; public final class MainConfig extends ConfigEngine { public static String LOGIN_BIND_ADDRESS; public static int REQUEST_ID; public static boolean ACCEPT_ALTERNATE_ID; public static String GAMESERVER_HOSTNAME; public static int PORT_GAME; public static String EXTERNAL_HOSTNAME; public static String INTERNAL_HOSTNAME; public static int GAME_SERVER_LOGIN_PORT; public static String GAME_SERVER_LOGIN_HOST; public static File DATAPACK_ROOT; public static enum IdFactoryType { BitSet, Stack } public static IdFactoryType IDFACTORY_TYPE; public static boolean BAD_ID_CHECKING; public static boolean SERVER_LIST_BRACKET; public static boolean SERVER_LIST_CLOCK; public static boolean SERVER_LIST_TESTSERVER; public static boolean SERVER_GMONLY; public static boolean TEST_SERVER; public static int DELETE_DAYS; public static int MAXIMUM_ONLINE_USERS; public static int MIN_PROTOCOL_REVISION; public static int MAX_PROTOCOL_REVISION; public static boolean JAIL_IS_PVP; public static int DEFAULT_PUNISH; public static int DEFAULT_PUNISH_PARAM; public static boolean AUTO_LOOT; public static boolean AUTO_LOOT_HERBS; public static boolean AUTO_LOOT_RAID; public static boolean LAZY_ITEMS_UPDATE; public static boolean ALLOW_DISCARDITEM; public static boolean MULTIPLE_ITEM_DROP; public static int AUTODESTROY_ITEM_AFTER; public static int HERB_AUTO_DESTROY_TIME; public static String PROTECTED_ITEMS; public static List<Integer> LIST_PROTECTED_ITEMS; public static boolean DESTROY_DROPPED_PLAYER_ITEM; public static boolean DESTROY_EQUIPABLE_PLAYER_ITEM; public static boolean SAVE_DROPPED_ITEM; public static boolean EMPTY_DROPPED_ITEM_TABLE_AFTER_LOAD; public static int SAVE_DROPPED_ITEM_INTERVAL; public static boolean CLEAR_DROPPED_ITEM_TABLE; public static float RATE_XP; public static float RATE_SP; public static float RATE_PARTY_XP; public static float RATE_PARTY_SP; public static float RATE_DROP_ADENA; public static float RATE_CONSUMABLE_COST; public static float RATE_DROP_ITEMS; public static float RATE_DROP_ITEMS_BY_RAID; public static float RATE_DROP_SPOIL; public static int RATE_DROP_MANOR; public static float RATE_QUEST_DROP; public static float RATE_QUEST_REWARD; public static float RATE_QUEST_REWARD_XP; public static float RATE_QUEST_REWARD_SP; public static float RATE_QUEST_REWARD_ADENA; public static float RATE_KARMA_EXP_LOST; public static float RATE_SIEGE_GUARDS_PRICE; public static int PLAYER_DROP_LIMIT; public static int PLAYER_RATE_DROP; public static int PLAYER_RATE_DROP_ITEM; public static int PLAYER_RATE_DROP_EQUIP; public static int PLAYER_RATE_DROP_EQUIP_WEAPON; public static int KARMA_DROP_LIMIT; public static int KARMA_RATE_DROP; public static int KARMA_RATE_DROP_ITEM; public static int KARMA_RATE_DROP_EQUIP; public static int KARMA_RATE_DROP_EQUIP_WEAPON; public static float PET_XP_RATE; public static int PET_FOOD_RATE; public static float SINEATER_XP_RATE; public static float RATE_DROP_COMMON_HERBS; public static float RATE_DROP_HP_HERBS; public static float RATE_DROP_MP_HERBS; public static float RATE_DROP_SPECIAL_HERBS; public static boolean ALLOW_FREIGHT; public static boolean ALLOW_WAREHOUSE; public static boolean ALLOW_WEAR; public static int WEAR_DELAY; public static int WEAR_PRICE; public static boolean ALLOW_LOTTERY; public static boolean ALLOW_RACE; public static boolean ALLOW_WATER; public static boolean ALLOWFISHING; public static boolean ALLOW_BOAT; public static boolean ALLOW_CURSED_WEAPONS; public static boolean ALLOW_MANOR; public static boolean ENABLE_FALLING_DAMAGE; public static boolean ALT_DEV_NO_QUESTS; public static boolean ALT_DEV_NO_SPAWNS; public static boolean DEVELOPER; public static boolean PACKET_HANDLER_DEBUG; public static boolean DEADLOCK_DETECTOR; public static long DEADLOCK_CHECK_INTERVAL; public static boolean RESTART_ON_DEADLOCK; public static boolean LOG_CHAT; public static boolean LOG_ITEMS; public static boolean GMAUDIT; public static boolean ENABLE_COMMUNITY_BOARD; public static String BBS_DEFAULT; public static int COORD_SYNCHRONIZE; public static int GEODATA; public static boolean FORCE_GEODATA; public static boolean GEODATA_CELLFINDING; public static String PATHFIND_BUFFERS; public static float LOW_WEIGHT; public static float MEDIUM_WEIGHT; public static float HIGH_WEIGHT; public static boolean ADVANCED_DIAGONAL_STRATEGY; public static float DIAGONAL_WEIGHT; public static int MAX_POSTFILTER_PASSES; public static boolean DEBUG_PATH; public static boolean L2WALKER_PROTECTION; public static boolean FORCE_INVENTORY_UPDATE; public static boolean AUTODELETE_INVALID_QUEST_DATA; public static boolean GAMEGUARD_ENFORCE; public static boolean SERVER_NEWS; public static int ZONE_TOWN; public static boolean DISABLE_TUTORIAL; public static int THREAD_P_EFFECTS = 6; // default 6 public static int THREAD_P_GENERAL = 15; // default 15 public static int GENERAL_PACKET_THREAD_CORE_SIZE = 4; // default 4 public static int IO_PACKET_THREAD_CORE_SIZE = 2; // default 2 public static int GENERAL_THREAD_CORE_SIZE = 4; // default 4 public static int AI_MAX_THREAD = 10; // default 10 public static boolean COUNT_PACKETS = false; // default false public static boolean DUMP_PACKET_COUNTS = false; // default false public static int DUMP_INTERVAL_SECONDS = 60; // default 60 public static int MINIMUM_UPDATE_DISTANCE = 50; // default 50 public static int MINIMUN_UPDATE_TIME = 500; // default 500 public static int KNOWNLIST_FORGET_DELAY = 10000; // default 10000 public static int PACKET_LIFETIME = 0; // default 0 (unlimited) public static boolean RESERVE_HOST_ON_LOGIN = false; // default false public static int MMO_SELECTOR_SLEEP_TIME = 20; // default 20 public static int MMO_MAX_SEND_PER_PASS = 12; // default 12 public static int MMO_MAX_READ_PER_PASS = 12; // default 12 public static int MMO_HELPER_BUFFER_COUNT = 20; // default 20 public static int CLIENT_PACKET_QUEUE_SIZE = 14; // default MMO_MAX_READ_PER_PASS + 2 public static int CLIENT_PACKET_QUEUE_MAX_BURST_SIZE = 13; // default MMO_MAX_READ_PER_PASS + 1 public static int CLIENT_PACKET_QUEUE_MAX_PACKETS_PER_SECOND = 80; // default 80 public static int CLIENT_PACKET_QUEUE_MEASURE_INTERVAL = 5; // default 5 public static int CLIENT_PACKET_QUEUE_MAX_AVERAGE_PACKETS_PER_SECOND = 40; // default 40 public static int CLIENT_PACKET_QUEUE_MAX_FLOODS_PER_MIN = 2; // default 2 public static int CLIENT_PACKET_QUEUE_MAX_OVERFLOWS_PER_MIN = 1; // default 1 public static int CLIENT_PACKET_QUEUE_MAX_UNDERFLOWS_PER_MIN = 1; // default 1 public static int CLIENT_PACKET_QUEUE_MAX_UNKNOWN_PER_MIN = 5; // default 5 public static void load() { try (InputStream is = new FileInputStream(new File(SERVER_FILE))) { Properties server = new Properties(); server.load(is); is.close(); GAMESERVER_HOSTNAME = server.getProperty("GameserverHostname"); PORT_GAME = Integer.parseInt(server.getProperty("GameserverPort", "7777")); EXTERNAL_HOSTNAME = server.getProperty("ExternalHostname", "*"); INTERNAL_HOSTNAME = server.getProperty("InternalHostname", "*"); GAME_SERVER_LOGIN_PORT = Integer.parseInt(server.getProperty("LoginPort", "9014")); GAME_SERVER_LOGIN_HOST = server.getProperty("LoginHost", "127.0.0.1"); REQUEST_ID = Integer.parseInt(server.getProperty("RequestServerID", "0")); ACCEPT_ALTERNATE_ID = Boolean.parseBoolean(server.getProperty("AcceptAlternateID", "True")); DATAPACK_ROOT = new File(server.getProperty("DatapackRoot", ".")).getCanonicalFile(); IDFACTORY_TYPE = IdFactoryType.valueOf(server.getProperty("IDFactory", "BitSet")); BAD_ID_CHECKING = Boolean.parseBoolean(server.getProperty("BadIdChecking", "True")); SERVER_LIST_BRACKET = Boolean.parseBoolean(server.getProperty("ServerListBrackets", "false")); SERVER_LIST_CLOCK = Boolean.parseBoolean(server.getProperty("ServerListClock", "false")); SERVER_GMONLY = Boolean.parseBoolean(server.getProperty("ServerGMOnly", "false")); TEST_SERVER = Boolean.parseBoolean(server.getProperty("TestServer", "false")); SERVER_LIST_TESTSERVER = Boolean.parseBoolean(server.getProperty("TestServer", "false")); DELETE_DAYS = Integer.parseInt(server.getProperty("DeleteCharAfterDays", "7")); MAXIMUM_ONLINE_USERS = Integer.parseInt(server.getProperty("MaximumOnlineUsers", "100")); MIN_PROTOCOL_REVISION = Integer.parseInt(server.getProperty("MinProtocolRevision", "730")); MAX_PROTOCOL_REVISION = Integer.parseInt(server.getProperty("MaxProtocolRevision", "746")); if (MIN_PROTOCOL_REVISION > MAX_PROTOCOL_REVISION) throw new Error("MinProtocolRevision is bigger than MaxProtocolRevision in server.properties."); JAIL_IS_PVP = Boolean.parseBoolean(server.getProperty("JailIsPvp", "True")); DEFAULT_PUNISH = Integer.parseInt(server.getProperty("DefaultPunish", "2")); DEFAULT_PUNISH_PARAM = Integer.parseInt(server.getProperty("DefaultPunishParam", "0")); AUTO_LOOT = Boolean.parseBoolean(server.getProperty("AutoLoot", "False")); AUTO_LOOT_HERBS = Boolean.parseBoolean(server.getProperty("AutoLootHerbs", "False")); AUTO_LOOT_RAID = Boolean.parseBoolean(server.getProperty("AutoLootRaid", "False")); LAZY_ITEMS_UPDATE = Boolean.parseBoolean(server.getProperty("LazyItemsUpdate", "False")); ALLOW_DISCARDITEM = Boolean.parseBoolean(server.getProperty("AllowDiscardItem", "True")); MULTIPLE_ITEM_DROP = Boolean.parseBoolean(server.getProperty("MultipleItemDrop", "True")); AUTODESTROY_ITEM_AFTER = Integer.parseInt(server.getProperty("AutoDestroyDroppedItemAfter", "0")); HERB_AUTO_DESTROY_TIME = Integer.parseInt(server.getProperty("AutoDestroyHerbTime", "15")) * 1000; PROTECTED_ITEMS = server.getProperty("ListOfProtectedItems"); LIST_PROTECTED_ITEMS = new ArrayList<>(); for (String id : PROTECTED_ITEMS.split(",")) LIST_PROTECTED_ITEMS.add(Integer.parseInt(id)); DESTROY_DROPPED_PLAYER_ITEM = Boolean.parseBoolean(server.getProperty("DestroyPlayerDroppedItem", "False")); DESTROY_EQUIPABLE_PLAYER_ITEM = Boolean.parseBoolean(server.getProperty("DestroyEquipableItem", "False")); SAVE_DROPPED_ITEM = Boolean.parseBoolean(server.getProperty("SaveDroppedItem", "False")); EMPTY_DROPPED_ITEM_TABLE_AFTER_LOAD = Boolean.parseBoolean(server.getProperty("EmptyDroppedItemTableAfterLoad", "False")); SAVE_DROPPED_ITEM_INTERVAL = Integer.parseInt(server.getProperty("SaveDroppedItemInterval", "0")) * 60000; CLEAR_DROPPED_ITEM_TABLE = Boolean.parseBoolean(server.getProperty("ClearDroppedItemTable", "False")); RATE_XP = Float.parseFloat(server.getProperty("RateXp", "1.")); RATE_SP = Float.parseFloat(server.getProperty("RateSp", "1.")); RATE_PARTY_XP = Float.parseFloat(server.getProperty("RatePartyXp", "1.")); RATE_PARTY_SP = Float.parseFloat(server.getProperty("RatePartySp", "1.")); RATE_DROP_ADENA = Float.parseFloat(server.getProperty("RateDropAdena", "1.")); RATE_CONSUMABLE_COST = Float.parseFloat(server.getProperty("RateConsumableCost", "1.")); RATE_DROP_ITEMS = Float.parseFloat(server.getProperty("RateDropItems", "1.")); RATE_DROP_ITEMS_BY_RAID = Float.parseFloat(server.getProperty("RateRaidDropItems", "1.")); RATE_DROP_SPOIL = Float.parseFloat(server.getProperty("RateDropSpoil", "1.")); RATE_DROP_MANOR = Integer.parseInt(server.getProperty("RateDropManor", "1")); RATE_QUEST_DROP = Float.parseFloat(server.getProperty("RateQuestDrop", "1.")); RATE_QUEST_REWARD = Float.parseFloat(server.getProperty("RateQuestReward", "1.")); RATE_QUEST_REWARD_XP = Float.parseFloat(server.getProperty("RateQuestRewardXP", "1.")); RATE_QUEST_REWARD_SP = Float.parseFloat(server.getProperty("RateQuestRewardSP", "1.")); RATE_QUEST_REWARD_ADENA = Float.parseFloat(server.getProperty("RateQuestRewardAdena", "1.")); RATE_KARMA_EXP_LOST = Float.parseFloat(server.getProperty("RateKarmaExpLost", "1.")); RATE_SIEGE_GUARDS_PRICE = Float.parseFloat(server.getProperty("RateSiegeGuardsPrice", "1.")); RATE_DROP_COMMON_HERBS = Float.parseFloat(server.getProperty("RateCommonHerbs", "1.")); RATE_DROP_HP_HERBS = Float.parseFloat(server.getProperty("RateHpHerbs", "1.")); RATE_DROP_MP_HERBS = Float.parseFloat(server.getProperty("RateMpHerbs", "1.")); RATE_DROP_SPECIAL_HERBS = Float.parseFloat(server.getProperty("RateSpecialHerbs", "1.")); PLAYER_DROP_LIMIT = Integer.parseInt(server.getProperty("PlayerDropLimit", "3")); PLAYER_RATE_DROP = Integer.parseInt(server.getProperty("PlayerRateDrop", "5")); PLAYER_RATE_DROP_ITEM = Integer.parseInt(server.getProperty("PlayerRateDropItem", "70")); PLAYER_RATE_DROP_EQUIP = Integer.parseInt(server.getProperty("PlayerRateDropEquip", "25")); PLAYER_RATE_DROP_EQUIP_WEAPON = Integer.parseInt(server.getProperty("PlayerRateDropEquipWeapon", "5")); PET_XP_RATE = Float.parseFloat(server.getProperty("PetXpRate", "1.")); PET_FOOD_RATE = Integer.parseInt(server.getProperty("PetFoodRate", "1")); SINEATER_XP_RATE = Float.parseFloat(server.getProperty("SinEaterXpRate", "1.")); KARMA_DROP_LIMIT = Integer.parseInt(server.getProperty("KarmaDropLimit", "10")); KARMA_RATE_DROP = Integer.parseInt(server.getProperty("KarmaRateDrop", "70")); KARMA_RATE_DROP_ITEM = Integer.parseInt(server.getProperty("KarmaRateDropItem", "50")); KARMA_RATE_DROP_EQUIP = Integer.parseInt(server.getProperty("KarmaRateDropEquip", "40")); KARMA_RATE_DROP_EQUIP_WEAPON = Integer.parseInt(server.getProperty("KarmaRateDropEquipWeapon", "10")); ALLOW_FREIGHT = Boolean.parseBoolean(server.getProperty("AllowFreight", "True")); ALLOW_WAREHOUSE = Boolean.parseBoolean(server.getProperty("AllowWarehouse", "True")); ALLOW_WEAR = Boolean.parseBoolean(server.getProperty("AllowWear", "True")); WEAR_DELAY = Integer.parseInt(server.getProperty("WearDelay", "5")); WEAR_PRICE = Integer.parseInt(server.getProperty("WearPrice", "10")); ALLOW_LOTTERY = Boolean.parseBoolean(server.getProperty("AllowLottery", "True")); ALLOW_RACE = Boolean.parseBoolean(server.getProperty("AllowRace", "True")); ALLOW_WATER = Boolean.parseBoolean(server.getProperty("AllowWater", "True")); ALLOWFISHING = Boolean.parseBoolean(server.getProperty("AllowFishing", "False")); ALLOW_MANOR = Boolean.parseBoolean(server.getProperty("AllowManor", "True")); ALLOW_BOAT = Boolean.parseBoolean(server.getProperty("AllowBoat", "True")); ALLOW_CURSED_WEAPONS = Boolean.parseBoolean(server.getProperty("AllowCursedWeapons", "True")); String str = server.getProperty("EnableFallingDamage", "auto"); ENABLE_FALLING_DAMAGE = "auto".equalsIgnoreCase(str) ? GEODATA > 0 : Boolean.parseBoolean(str); ALT_DEV_NO_QUESTS = Boolean.parseBoolean(server.getProperty("NoQuests", "False")); ALT_DEV_NO_SPAWNS = Boolean.parseBoolean(server.getProperty("NoSpawns", "False")); DEVELOPER = Boolean.parseBoolean(server.getProperty("Developer", "False")); PACKET_HANDLER_DEBUG = Boolean.parseBoolean(server.getProperty("PacketHandlerDebug", "False")); DEADLOCK_DETECTOR = Boolean.parseBoolean(server.getProperty("DeadLockDetector", "False")); DEADLOCK_CHECK_INTERVAL = Long.parseLong(server.getProperty("DeadLockCheckInterval", "20")); RESTART_ON_DEADLOCK = Boolean.parseBoolean(server.getProperty("RestartOnDeadlock", "False")); LOG_CHAT = Boolean.parseBoolean(server.getProperty("LogChat", "false")); LOG_ITEMS = Boolean.parseBoolean(server.getProperty("LogItems", "false")); GMAUDIT = Boolean.parseBoolean(server.getProperty("GMAudit", "False")); ENABLE_COMMUNITY_BOARD = Boolean.parseBoolean(server.getProperty("EnableCommunityBoard", "False")); BBS_DEFAULT = server.getProperty("BBSDefault", "_bbshome"); COORD_SYNCHRONIZE = Integer.parseInt(server.getProperty("CoordSynchronize", "-1")); GEODATA = Integer.parseInt(server.getProperty("GeoData", "0")); FORCE_GEODATA = Boolean.parseBoolean(server.getProperty("ForceGeoData", "True")); GEODATA_CELLFINDING = Boolean.parseBoolean(server.getProperty("CellPathFinding", "False")); PATHFIND_BUFFERS = server.getProperty("PathFindBuffers", "100x6;128x6;192x6;256x4;320x4;384x4;500x2"); LOW_WEIGHT = Float.parseFloat(server.getProperty("LowWeight", "0.5")); MEDIUM_WEIGHT = Float.parseFloat(server.getProperty("MediumWeight", "2")); HIGH_WEIGHT = Float.parseFloat(server.getProperty("HighWeight", "3")); ADVANCED_DIAGONAL_STRATEGY = Boolean.parseBoolean(server.getProperty("AdvancedDiagonalStrategy", "True")); DIAGONAL_WEIGHT = Float.parseFloat(server.getProperty("DiagonalWeight", "0.707")); MAX_POSTFILTER_PASSES = Integer.parseInt(server.getProperty("MaxPostfilterPasses", "3")); DEBUG_PATH = Boolean.parseBoolean(server.getProperty("DebugPath", "False")); L2WALKER_PROTECTION = Boolean.parseBoolean(server.getProperty("L2WalkerProtection", "False")); FORCE_INVENTORY_UPDATE = Boolean.parseBoolean(server.getProperty("ForceInventoryUpdate", "False")); AUTODELETE_INVALID_QUEST_DATA = Boolean.parseBoolean(server.getProperty("AutoDeleteInvalidQuestData", "False")); GAMEGUARD_ENFORCE = Boolean.parseBoolean(server.getProperty("GameGuardEnforce", "False")); ZONE_TOWN = Integer.parseInt(server.getProperty("ZoneTown", "0")); SERVER_NEWS = Boolean.parseBoolean(server.getProperty("ShowServerNews", "False")); DISABLE_TUTORIAL = Boolean.parseBoolean(server.getProperty("DisableTutorial", "False")); } catch (Exception e) { e.printStackTrace(); throw new Error("Server failed to load " + SERVER_FILE + " file."); } } }