Settings.cs 96 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800
  1. using System.Collections.Generic;
  2. using System.Security.Cryptography;
  3. using Server.MirDatabase;
  4. using Server.MirObjects;
  5. using Shared;
  6. namespace Server
  7. {
  8. public static class Settings
  9. {
  10. private static MessageQueue MessageQueue
  11. {
  12. get { return MessageQueue.Instance; }
  13. }
  14. public const int Day = 24 * Hour, Hour = 60 * Minute, Minute = 60 * Second, Second = 1000;
  15. public static readonly string EnvirPath = Path.Combine(".", "Envir"),
  16. ConfigPath = Path.Combine(".", "Configs"),
  17. MapPath = Path.Combine(".", "Maps"),
  18. ExportPath = Path.Combine(".", "Exports"),
  19. GuildPath = Path.Combine(".", "Guilds"),
  20. ConquestsPath = Path.Combine(".", "Conquests"),
  21. NPCPath = Path.Combine(EnvirPath, "NPCs"),
  22. GoodsPath = Path.Combine(EnvirPath, "Goods"),
  23. RecipePath = Path.Combine(EnvirPath, "Recipe"),
  24. QuestPath = Path.Combine(EnvirPath, "Quests"),
  25. DropPath = Path.Combine(EnvirPath, "Drops"),
  26. RoutePath = Path.Combine(EnvirPath, "Routes"),
  27. NameListPath = Path.Combine(EnvirPath, "NameLists"),
  28. ValuePath = Path.Combine(EnvirPath, "Values"),
  29. NoticePath = Path.Combine(EnvirPath, "Notice.txt"),
  30. MinimapsPath = Path.Combine(EnvirPath, "Previews", "Minimaps"),
  31. NPCPreviewPath = Path.Combine(EnvirPath, "Previews", "NPC"),
  32. Previews = Path.Combine(EnvirPath, "Previews");
  33. private static readonly InIReader Reader = new InIReader(Path.Combine(ConfigPath, "Setup.ini"));
  34. public static Notice Notice;
  35. //General
  36. public static string VersionPath = Path.Combine(".", "Mir2.Exe");
  37. public static bool CheckVersion = true;
  38. public static List<byte[]> VersionHashes;
  39. public static string GMPassword = "C#Mir 4.0";
  40. public static bool Multithreaded = true;
  41. public static int ThreadLimit = 2;
  42. public static bool TestServer = false;
  43. public static bool EnforceDBChecks = true;
  44. public static bool MonsterProcessWhenAlone = false;
  45. public static string DefaultNPCFilename = "00Default";
  46. public static string MonsterNPCFilename = "00Monster";
  47. public static string RobotNPCFilename = "00Robot";
  48. public static string FishingDropFilename = "00Fishing";
  49. public static string AwakeningDropFilename = "00Awakening";
  50. public static string StrongboxDropFilename = "00Strongbox";
  51. public static string BlackstoneDropFilename = "00Blackstone";
  52. public static string Language = "English";
  53. //Network
  54. public static string IPAddress = "127.0.0.1";
  55. public static ushort Port = 7000,
  56. TimeOut = 10000,
  57. MaxUser = 50,
  58. RelogDelay = 50,
  59. MaxIP = 5,
  60. MaxPacket = 50;
  61. public static int IPBlockSeconds = 5;
  62. //HTTP
  63. public static bool StartHTTPService = false;
  64. public static string HTTPIPAddress = "http://127.0.0.1:5679/";
  65. public static string HTTPTrustedIPAddress = "127.0.0.1";
  66. //Permission
  67. public static bool AllowNewAccount = true,
  68. AllowChangePassword = true,
  69. AllowLogin = true,
  70. AllowNewCharacter = true,
  71. AllowDeleteCharacter = true,
  72. AllowStartGame = false,
  73. AllowCreateAssassin = true,
  74. AllowCreateArcher = true,
  75. RequireStoragePassword = true;
  76. public static int AllowedResolution = 1024;
  77. //Optional
  78. public static bool SafeZoneBorder = false,
  79. SafeZoneHealing = false,
  80. GameMasterEffect = false,
  81. GatherOrbsPerLevel = true,
  82. ExpMobLevelDifference = true;
  83. public static int LineMessageTimer = 10;
  84. //Database
  85. public static int SaveDelay = 5;
  86. public static short CredxGold = 30;
  87. //Game
  88. public static List<long> ExperienceList = new List<long>();
  89. public static List<long> HeroExperienceList = new List<long>();
  90. public static List<long> OrbsExpList = new List<long>();
  91. public static List<long> OrbsDefList = new List<long>();
  92. public static List<long> OrbsDmgList = new List<long>();
  93. public static float DropRate = 1F, ExpRate = 1F;
  94. public static int TeleportToNPCCost = 3000;
  95. public static int ItemTimeOut = 30,
  96. PlayerDiedItemTimeOut = 120,
  97. DropRange = 4,
  98. DropStackSize = 5,
  99. PKDelay = 12;
  100. public static bool MonsterRecallEnabled = true;
  101. public static int MonsterRecallRange = 12;
  102. public static int MonsterRecallCooldown = 5000;
  103. public static bool MonsterRarityEnabled = true;
  104. public static double MonsterRarityUncommonChancePercent = 3.0,
  105. MonsterRarityRareChancePercent = 0.75,
  106. MonsterRarityEliteChancePercent = 0.1;
  107. public static double MonsterRarityUncommonHpMultiplier = 1.25,
  108. MonsterRarityUncommonDefenseMultiplier = 1.15,
  109. MonsterRarityUncommonDamageMultiplier = 1.15,
  110. MonsterRarityUncommonExpMultiplier = 1.20,
  111. MonsterRarityUncommonGoldMultiplier = 1.25;
  112. public static int MonsterRarityUncommonItemDropBonusPercent = 15,
  113. MonsterRarityUncommonGoldDropBonusPercent = 15;
  114. public static double MonsterRarityRareHpMultiplier = 1.60,
  115. MonsterRarityRareDefenseMultiplier = 1.30,
  116. MonsterRarityRareDamageMultiplier = 1.35,
  117. MonsterRarityRareExpMultiplier = 1.60,
  118. MonsterRarityRareGoldMultiplier = 1.75;
  119. public static int MonsterRarityRareItemDropBonusPercent = 35,
  120. MonsterRarityRareGoldDropBonusPercent = 35;
  121. public static double MonsterRarityEliteHpMultiplier = 2.25,
  122. MonsterRarityEliteDefenseMultiplier = 1.55,
  123. MonsterRarityEliteDamageMultiplier = 1.65,
  124. MonsterRarityEliteExpMultiplier = 2.20,
  125. MonsterRarityEliteGoldMultiplier = 2.50;
  126. public static int MonsterRarityEliteItemDropBonusPercent = 75,
  127. MonsterRarityEliteGoldDropBonusPercent = 75;
  128. public static bool PetSave = false;
  129. public static int MaxBossTames = 1;
  130. public static int RestedPeriod = 60,
  131. RestedBuffLength = 10,
  132. RestedExpBonus = 5,
  133. RestedMaxBonus = 24,
  134. NewbieGuildMaxSize = 1000;
  135. public static string NewbieGuild = "NewbieGuild",
  136. SkeletonName = "BoneFamiliar",
  137. ShinsuName = "Shinsu",
  138. BugBatName = "BugBat",
  139. Zuma1 = "ZumaStatue",
  140. Zuma2 = "ZumaGuardian",
  141. Zuma3 = "ZumaArcher",
  142. Zuma4 = "WedgeMoth",
  143. Zuma5 = "ZumaArcher3",
  144. Zuma6 = "ZumaStatue3",
  145. Zuma7 = "ZumaGuardian3",
  146. Turtle1 = "RedTurtle",
  147. Turtle2 = "GreenTurtle",
  148. Turtle3 = "BlueTurtle",
  149. Turtle4 = "TowerTurtle",
  150. Turtle5 = "FinialTurtle",
  151. BoneMonster1 = "BoneSpearman",
  152. BoneMonster2 = "BoneBlademan",
  153. BoneMonster3 = "BoneArcher",
  154. BoneMonster4 = "BoneCaptain",
  155. BehemothMonster1 = "Hugger",
  156. BehemothMonster2 = "PoisonHugger",
  157. BehemothMonster3 = "MutatedHugger",
  158. HellKnight1 = "HellKnight1",
  159. HellKnight2 = "HellKnight2",
  160. HellKnight3 = "HellKnight3",
  161. HellKnight4 = "HellKnight4",
  162. HellBomb1 = "HellBomb1",
  163. HellBomb2 = "HellBomb2",
  164. HellBomb3 = "HellBomb3",
  165. WhiteSnake = "WhiteSerpent",
  166. AngelName = "HolyDeva",
  167. BombSpiderName = "BombSpider",
  168. CloneName = "Clone",
  169. AssassinCloneName = "AssassinClone",
  170. VampireName = "VampireSpider",
  171. ToadName = "SpittingToad",
  172. SnakeTotemName = "SnakeTotem",
  173. SnakesName = "CharmedSnake",
  174. AncientBatName = "AncientBat",
  175. TucsonGeneralEgg = "GeneralTucson",
  176. GeneralMeowMeowMob1 = "StainHammerCat",
  177. GeneralMeowMeowMob2 = "BlackHammerCat",
  178. GeneralMeowMeowMob3 = "StrayCat",
  179. GeneralMeowMeowMob4 = "CatShaman",
  180. KingHydraxMob = "Hydrax",
  181. HornedCommanderMob = "HornedSorceror",
  182. HornedCommanderBombMob = "BoulderSpirit",
  183. SnowWolfKingMob = "SnowWolf",
  184. ScrollMob1 = "WarriorScroll",
  185. ScrollMob2 = "TaoistScroll",
  186. ScrollMob3 = "WizardScroll",
  187. ScrollMob4 = "AssassinScroll",
  188. StoneName = "StoneTrap",
  189. HeroName = "Hero";
  190. public static string HealRing = "Healing",
  191. FireRing = "FireBall",
  192. ParalysisRing = "Paralysis",
  193. BlinkSkill = "Blink";
  194. public static string PKTownMapName = "3";
  195. public static int PKTownPositionX = 848,
  196. PKTownPositionY = 677;
  197. public static uint MaxDropGold = 2000;
  198. public static bool DropGold = true;
  199. public static string CreatureBlackStoneName = "BlackCreatureStone";
  200. //Fishing Settings
  201. public static int FishingAttempts = 30;
  202. public static int FishingSuccessStart = 10;
  203. public static int FishingSuccessMultiplier = 10;
  204. public static long FishingDelay = 0;
  205. public static int FishingMobSpawnChance = 5;
  206. public static string FishingMonster = "GiantKeratoid";
  207. //Mail Settings
  208. public static bool MailAutoSendGold = false;
  209. public static bool MailAutoSendItems = false;
  210. public static bool MailFreeWithStamp = true;
  211. public static uint MailCostPer1KGold = 100;
  212. public static uint MailItemInsurancePercentage = 5;
  213. public static uint MailCapacity = 100;
  214. //Refine Settings
  215. public static bool OnlyRefineWeapon = true;
  216. public static byte RefineBaseChance = 20;
  217. public static int RefineTime = 20;
  218. public static byte RefineIncrease = 1;
  219. public static byte RefineCritChance = 10;
  220. public static byte RefineCritIncrease = 2;
  221. public static byte RefineWepStatReduce = 6;
  222. public static byte RefineItemStatReduce = 15;
  223. public static int RefineCost = 125;
  224. public static string RefineOreName = "BlackIronOre";
  225. //Marriage Settings
  226. public static int LoverEXPBonus = 5;
  227. public static int MarriageCooldown = 7;
  228. public static bool WeddingRingRecall = true;
  229. public static int MarriageLevelRequired = 10;
  230. public static int ReplaceWedRingCost = 125;
  231. //Mentor Settings
  232. public static byte MentorLevelGap = 10;
  233. public static bool MentorSkillBoost = true;
  234. public static byte MentorLength = 7;
  235. public static byte MentorDamageBoost = 10;
  236. public static byte MentorExpBoost = 10;
  237. public static byte MenteeExpBank = 1;
  238. //Gem Settings
  239. public static bool GemStatIndependent = true;
  240. //Goods Settings
  241. public static bool GoodsOn = true;
  242. public static uint GoodsMaxStored = 15;
  243. public static uint GoodsBuyBackTime = 60;
  244. public static uint GoodsBuyBackMaxStored = 20;
  245. public static bool GoodsHideAddedStats = true;
  246. public static BaseStats[] ClassBaseStats = new BaseStats[5] { new BaseStats(MirClass.Warrior), new BaseStats(MirClass.Wizard), new BaseStats(MirClass.Taoist), new BaseStats(MirClass.Assassin), new BaseStats(MirClass.Archer) };
  247. public static BaseStats[] HeroBaseStats = new BaseStats[5] { new BaseStats(MirClass.Warrior), new BaseStats(MirClass.Wizard), new BaseStats(MirClass.Taoist), new BaseStats(MirClass.Assassin), new BaseStats(MirClass.Archer) };
  248. public static List<RandomItemStat> RandomItemStatsList = new List<RandomItemStat>();
  249. public static List<MineSet> MineSetList = new List<MineSet>();
  250. public static WorldMapSetup WorldMapSetup = new WorldMapSetup();
  251. //item related settings
  252. public static byte MagicResistWeight = 10,
  253. PoisonResistWeight = 10,
  254. CriticalRateWeight = 5,
  255. CriticalDamageWeight = 50,
  256. FreezingAttackWeight = 10,
  257. PoisonAttackWeight = 10,
  258. HealthRegenWeight = 10,
  259. ManaRegenWeight = 10,
  260. MaxLuck = 10;
  261. public static ushort ItemSealDelay = 60;
  262. public static bool PvpCanResistMagic = false,
  263. PvpCanResistPoison = false,
  264. PvpCanFreeze = false;
  265. public static byte RangeAccuracyBonus = 0;
  266. //Hero related settings
  267. public static bool AllowNewHero = true;
  268. public static byte Hero_RequiredLevel = 22;
  269. public static bool[] Hero_CanCreateClass = new bool[0];
  270. public static string HeroSealItemName = "SealedHero";
  271. public static ushort HeroMaximumSealCount = 5;
  272. public static byte MaximumHeroCount = 9;
  273. public static bool AllowObserve;
  274. //Guild related settings
  275. public static bool NewbieGuildBuffEnabled = true;
  276. public static int NewbieGuildExpBuff = 5;
  277. public static byte Guild_RequiredLevel = 22, Guild_PointPerLevel = 0;
  278. public static float Guild_ExpRate = 0.01f;
  279. public static uint Guild_WarCost = 3000;
  280. public static long Guild_WarTime = 180;
  281. public static List<GuildItemVolume> Guild_CreationCostList = new List<GuildItemVolume>();
  282. public static List<long> Guild_ExperienceList = new List<long>();
  283. public static List<int> Guild_MembercapList = new List<int>();
  284. public static List<GuildBuffInfo> Guild_BuffList = new List<GuildBuffInfo>();
  285. public static long GroupInviteDelay { get; internal set; } = 2000;
  286. public static long TradeDelay { get; internal set; } = 2000;
  287. //Archive Settings
  288. public static int ArchiveInactiveCharacterAfterMonths = 12;
  289. public static int ArchiveDeletedCharacterAfterMonths = 1;
  290. public static int BuyGTGold = 10000000, ExtendGT = 1000000, GTDays = 30;
  291. public static readonly string DbLanguageFile = @"DbLanguage.json";
  292. public static void LoadVersion()
  293. {
  294. try
  295. {
  296. VersionHashes = new List<byte[]>();
  297. var paths = VersionPath.Split(',');
  298. //foreach (var path in paths)
  299. //{
  300. // if (File.Exists(path))
  301. // using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
  302. // using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
  303. // VersionHashes.Add(md5.ComputeHash(stream));
  304. //}
  305. foreach (var path in paths)
  306. {
  307. if (File.Exists(path))
  308. using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
  309. using (MD5 md5 = MD5.Create())
  310. VersionHashes.Add(md5.ComputeHash(stream));
  311. }
  312. }
  313. catch (Exception ex)
  314. {
  315. MessageQueue.Enqueue(ex);
  316. }
  317. }
  318. public static void Load()
  319. {
  320. //General
  321. VersionPath = Reader.ReadString("General", "VersionPath", VersionPath);
  322. CheckVersion = Reader.ReadBoolean("General", "CheckVersion", CheckVersion);
  323. RelogDelay = Reader.ReadUInt16("General", "RelogDelay", RelogDelay);
  324. GMPassword = Reader.ReadString("General", "GMPassword", GMPassword);
  325. Multithreaded = Reader.ReadBoolean("General", "Multithreaded", Multithreaded);
  326. ThreadLimit = Reader.ReadInt32("General", "ThreadLimit", ThreadLimit);
  327. TestServer = Reader.ReadBoolean("General", "TestServer", TestServer);
  328. EnforceDBChecks = Reader.ReadBoolean("General", "EnforceDBChecks", EnforceDBChecks);
  329. MonsterProcessWhenAlone = Reader.ReadBoolean("General", "MonsterProcessWhenAlone", MonsterProcessWhenAlone);
  330. Language=Reader.ReadString("General", "Language", Language);
  331. //Paths
  332. IPAddress = Reader.ReadString("Network", "IPAddress", IPAddress);
  333. Port = Reader.ReadUInt16("Network", "Port", Port);
  334. TimeOut = Reader.ReadUInt16("Network", "TimeOut", TimeOut);
  335. MaxUser = Reader.ReadUInt16("Network", "MaxUser", MaxUser);
  336. MaxIP = Reader.ReadUInt16("Network", "MaxIP", MaxIP);
  337. MaxPacket = Reader.ReadUInt16("Network", "MaxPacket", MaxPacket);
  338. //HTTP
  339. StartHTTPService = Reader.ReadBoolean("Network", "StartHTTPService", StartHTTPService);
  340. HTTPIPAddress = Reader.ReadString("Network", "HTTPIPAddress", HTTPIPAddress);
  341. HTTPTrustedIPAddress = Reader.ReadString("Network", "HTTPTrustedIPAddress", HTTPTrustedIPAddress);
  342. //Permission
  343. AllowNewAccount = Reader.ReadBoolean("Permission", "AllowNewAccount", AllowNewAccount);
  344. AllowChangePassword = Reader.ReadBoolean("Permission", "AllowChangePassword", AllowChangePassword);
  345. AllowLogin = Reader.ReadBoolean("Permission", "AllowLogin", AllowLogin);
  346. AllowNewCharacter = Reader.ReadBoolean("Permission", "AllowNewCharacter", AllowNewCharacter);
  347. AllowDeleteCharacter = Reader.ReadBoolean("Permission", "AllowDeleteCharacter", AllowDeleteCharacter);
  348. AllowStartGame = Reader.ReadBoolean("Permission", "AllowStartGame", AllowStartGame);
  349. AllowCreateAssassin = Reader.ReadBoolean("Permission", "AllowCreateAssassin", AllowCreateAssassin);
  350. AllowCreateArcher = Reader.ReadBoolean("Permission", "AllowCreateArcher", AllowCreateArcher);
  351. RequireStoragePassword = Reader.ReadBoolean("Permission", "RequireStoragePassword", RequireStoragePassword);
  352. AllowedResolution = Reader.ReadInt32("Permission", "MaxResolution", AllowedResolution);
  353. //Optional
  354. SafeZoneBorder = Reader.ReadBoolean("Optional", "SafeZoneBorder", SafeZoneBorder);
  355. SafeZoneHealing = Reader.ReadBoolean("Optional", "SafeZoneHealing", SafeZoneHealing);
  356. GatherOrbsPerLevel = Reader.ReadBoolean("Optional", "GatherOrbsPerLevel", GatherOrbsPerLevel);
  357. ExpMobLevelDifference = Reader.ReadBoolean("Optional", "ExpMobLevelDifference", ExpMobLevelDifference);
  358. GameMasterEffect = Reader.ReadBoolean("Optional", "GameMasterEffect", GameMasterEffect);
  359. LineMessageTimer = Reader.ReadInt32("Optional", "LineMessageTimer", LineMessageTimer);
  360. //Database
  361. SaveDelay = Reader.ReadInt32("Database", "SaveDelay", SaveDelay);
  362. CredxGold = Reader.ReadInt16("Database", "CredxGold", CredxGold);
  363. //Game
  364. DropRate = Reader.ReadSingle("Game", "DropRate", DropRate);
  365. ExpRate = Reader.ReadSingle("Game", "ExpRate", ExpRate);
  366. ItemTimeOut = Reader.ReadInt32("Game", "ItemTimeOut", ItemTimeOut);
  367. PlayerDiedItemTimeOut = Reader.ReadInt32("Game", "PlayerDiedItemTimeOut", PlayerDiedItemTimeOut);
  368. PetSave = Reader.ReadBoolean("Game", "PetSave", PetSave);
  369. MaxBossTames = Math.Max(0, Reader.ReadInt32("Game", "MaxBossTames", MaxBossTames));
  370. PKDelay = Reader.ReadInt32("Game", "PKDelay", PKDelay);
  371. MonsterRecallEnabled = Reader.ReadBoolean("Game", "MonsterRecallEnabled", MonsterRecallEnabled);
  372. MonsterRecallRange = Reader.ReadInt32("Game", "MonsterRecallRange", MonsterRecallRange);
  373. MonsterRecallCooldown = Reader.ReadInt32("Game", "MonsterRecallCooldown", MonsterRecallCooldown);
  374. NewbieGuild = Reader.ReadString("Game", "NewbieGuild", NewbieGuild);
  375. NewbieGuildMaxSize = Reader.ReadInt32("Game", "NewbieGuildMaxSize", NewbieGuildMaxSize);
  376. SkeletonName = Reader.ReadString("Game", "SkeletonName", SkeletonName);
  377. BugBatName = Reader.ReadString("Game", "BugBatName", BugBatName);
  378. ShinsuName = Reader.ReadString("Game", "ShinsuName", ShinsuName);
  379. Zuma1 = Reader.ReadString("Game", "Zuma1", Zuma1);
  380. Zuma2 = Reader.ReadString("Game", "Zuma2", Zuma2);
  381. Zuma3 = Reader.ReadString("Game", "Zuma3", Zuma3);
  382. Zuma4 = Reader.ReadString("Game", "Zuma4", Zuma4);
  383. Zuma5 = Reader.ReadString("Game", "Zuma5", Zuma5);
  384. Zuma6 = Reader.ReadString("Game", "Zuma6", Zuma6);
  385. Zuma7 = Reader.ReadString("Game", "Zuma7", Zuma7);
  386. Turtle1 = Reader.ReadString("Game", "Turtle1", Turtle1);
  387. Turtle2 = Reader.ReadString("Game", "Turtle2", Turtle2);
  388. Turtle3 = Reader.ReadString("Game", "Turtle3", Turtle3);
  389. Turtle4 = Reader.ReadString("Game", "Turtle4", Turtle4);
  390. Turtle5 = Reader.ReadString("Game", "Turtle5", Turtle5);
  391. BoneMonster1 = Reader.ReadString("Game", "BoneMonster1", BoneMonster1);
  392. BoneMonster2 = Reader.ReadString("Game", "BoneMonster2", BoneMonster2);
  393. BoneMonster3 = Reader.ReadString("Game", "BoneMonster3", BoneMonster3);
  394. BoneMonster4 = Reader.ReadString("Game", "BoneMonster4", BoneMonster4);
  395. BehemothMonster1 = Reader.ReadString("Game", "BehemothMonster1", BehemothMonster1);
  396. BehemothMonster2 = Reader.ReadString("Game", "BehemothMonster2", BehemothMonster2);
  397. BehemothMonster3 = Reader.ReadString("Game", "BehemothMonster3", BehemothMonster3);
  398. HellKnight1 = Reader.ReadString("Game", "HellKnight1", HellKnight1);
  399. HellKnight2 = Reader.ReadString("Game", "HellKnight2", HellKnight2);
  400. HellKnight3 = Reader.ReadString("Game", "HellKnight3", HellKnight3);
  401. HellKnight4 = Reader.ReadString("Game", "HellKnight4", HellKnight4);
  402. HellBomb1 = Reader.ReadString("Game", "HellBomb1", HellBomb1);
  403. HellBomb2 = Reader.ReadString("Game", "HellBomb2", HellBomb2);
  404. HellBomb3 = Reader.ReadString("Game", "HellBomb3", HellBomb3);
  405. GeneralMeowMeowMob1 = Reader.ReadString("Game", "GeneralMeowMeowMob1", GeneralMeowMeowMob1);
  406. GeneralMeowMeowMob2 = Reader.ReadString("Game", "GeneralMeowMeowMob2", GeneralMeowMeowMob2);
  407. GeneralMeowMeowMob3 = Reader.ReadString("Game", "GeneralMeowMeowMob3", GeneralMeowMeowMob3);
  408. GeneralMeowMeowMob4 = Reader.ReadString("Game", "GeneralMeowMeowMob4", GeneralMeowMeowMob4);
  409. KingHydraxMob = Reader.ReadString("Game", "KingHydraxMob", KingHydraxMob);
  410. HornedCommanderMob = Reader.ReadString("Game", "HornedCommanderMob", HornedCommanderMob);
  411. HornedCommanderBombMob = Reader.ReadString("Game", "HornedCommanderBombMob", HornedCommanderBombMob);
  412. SnowWolfKingMob = Reader.ReadString("Game", "SnowWolfKingMob", SnowWolfKingMob);
  413. ScrollMob1 = Reader.ReadString("Game", "ScrollMob1", ScrollMob1);
  414. ScrollMob2 = Reader.ReadString("Game", "ScrollMob2", ScrollMob2);
  415. ScrollMob3 = Reader.ReadString("Game", "ScrollMob3", ScrollMob3);
  416. ScrollMob4 = Reader.ReadString("Game", "ScrollMob4", ScrollMob4);
  417. WhiteSnake = Reader.ReadString("Game", "WhiteSnake", WhiteSnake);
  418. AngelName = Reader.ReadString("Game", "AngelName", AngelName);
  419. BombSpiderName = Reader.ReadString("Game", "BombSpiderName", BombSpiderName);
  420. CloneName = Reader.ReadString("Game", "CloneName", CloneName);
  421. FishingMonster = Reader.ReadString("Game", "FishMonster", FishingMonster);
  422. AssassinCloneName = Reader.ReadString("Game", "AssassinCloneName", AssassinCloneName);
  423. VampireName = Reader.ReadString("Game", "VampireName", VampireName);
  424. ToadName = Reader.ReadString("Game", "ToadName", ToadName);
  425. SnakeTotemName = Reader.ReadString("Game", "SnakeTotemName", SnakeTotemName);
  426. SnakesName = Reader.ReadString("Game", "SnakesName", SnakesName);
  427. StoneName = Reader.ReadString("Game", "StoneName", StoneName);
  428. AncientBatName = Reader.ReadString("Game", "AncientBatName", AncientBatName);
  429. TucsonGeneralEgg = Reader.ReadString("Game", "TucsonGeneralEgg", TucsonGeneralEgg);
  430. GroupInviteDelay = Reader.ReadInt64("Game", "GroupInviteDelay", GroupInviteDelay);
  431. TradeDelay = Reader.ReadInt64("Game", "TradeDelay", TradeDelay);
  432. TeleportToNPCCost = Reader.ReadInt32("Game", "TeleportToNPCCost", TeleportToNPCCost);
  433. HeroName = Reader.ReadString("Game", "HeroName", HeroName);
  434. //Rested
  435. RestedPeriod = Reader.ReadInt32("Rested", "Period", RestedPeriod);
  436. RestedBuffLength = Reader.ReadInt32("Rested", "BuffLength", RestedBuffLength);
  437. RestedExpBonus = Reader.ReadInt32("Rested", "ExpBonus", RestedExpBonus);
  438. RestedMaxBonus = Reader.ReadInt32("Rested", "MaxBonus", RestedMaxBonus);
  439. //Items
  440. HealRing = Reader.ReadString("Items", "HealRing", HealRing);
  441. FireRing = Reader.ReadString("Items", "FireRing", FireRing);
  442. BlinkSkill = Reader.ReadString("Items", "BlinkSkill", BlinkSkill);
  443. //PKTown
  444. PKTownMapName = Reader.ReadString("PKTown", "PKTownMapName", PKTownMapName);
  445. PKTownPositionX = Reader.ReadInt32("PKTown", "PKTownPositionX", PKTownPositionX);
  446. PKTownPositionY = Reader.ReadInt32("PKTown", "PKTownPositionY", PKTownPositionY);
  447. DropGold = Reader.ReadBoolean("DropGold", "DropGold", DropGold);
  448. MaxDropGold = Reader.ReadUInt32("DropGold", "MaxDropGold", MaxDropGold);
  449. MagicResistWeight = Reader.ReadByte("Items","MagicResistWeight",MagicResistWeight);
  450. PoisonResistWeight = Reader.ReadByte("Items","PoisonResistWeight",PoisonResistWeight);
  451. CriticalRateWeight = Reader.ReadByte("Items","CriticalRateWeight",CriticalRateWeight);
  452. CriticalDamageWeight = Math.Max((byte)1, Reader.ReadByte("Items","CriticalDamageWeight",CriticalDamageWeight));
  453. FreezingAttackWeight = Reader.ReadByte("Items","FreezingAttackWeight",FreezingAttackWeight);
  454. PoisonAttackWeight = Reader.ReadByte("Items","PoisonAttackWeight",PoisonAttackWeight);
  455. HealthRegenWeight = Math.Max((byte)1, Reader.ReadByte("Items", "HealthRegenWeight", HealthRegenWeight));
  456. ManaRegenWeight = Math.Max((byte)1, Reader.ReadByte("Items", "ManaRegenWeight", ManaRegenWeight));
  457. MaxLuck = Reader.ReadByte("Items", "MaxLuck", MaxLuck);
  458. ItemSealDelay = Reader.ReadUInt16("Items", "SealDelay", ItemSealDelay);
  459. PvpCanResistMagic = Reader.ReadBoolean("Items","PvpCanResistMagic",PvpCanResistMagic);
  460. PvpCanResistPoison = Reader.ReadBoolean("Items", "PvpCanResistPoison", PvpCanResistPoison);
  461. PvpCanFreeze = Reader.ReadBoolean("Items", "PvpCanFreeze", PvpCanFreeze);
  462. RangeAccuracyBonus = Reader.ReadByte("Bonus", "RangeAccuracyBonus", RangeAccuracyBonus);
  463. CreatureBlackStoneName = Reader.ReadString("IntelligentCreatures", "CreatureBlackStoneName", CreatureBlackStoneName);
  464. AllowObserve = Reader.ReadBoolean("Observe", "AllowObserve", AllowObserve);
  465. //Archive
  466. ArchiveInactiveCharacterAfterMonths = Math.Max(1, Reader.ReadInt32("Archive", "InactiveCharacterMonths", ArchiveInactiveCharacterAfterMonths));
  467. ArchiveDeletedCharacterAfterMonths = Math.Max(1, Reader.ReadInt32("Archive", "DeletedCharacterMonths", ArchiveDeletedCharacterAfterMonths));
  468. if (!Directory.Exists(EnvirPath))
  469. Directory.CreateDirectory(EnvirPath);
  470. if (!Directory.Exists(ConfigPath))
  471. Directory.CreateDirectory(ConfigPath);
  472. if (!Directory.Exists(MapPath))
  473. Directory.CreateDirectory(MapPath);
  474. if (!Directory.Exists(NPCPath))
  475. Directory.CreateDirectory(NPCPath);
  476. if (!Directory.Exists(GoodsPath))
  477. Directory.CreateDirectory(GoodsPath);
  478. if (!Directory.Exists(QuestPath))
  479. Directory.CreateDirectory(QuestPath);
  480. if (!Directory.Exists(DropPath))
  481. Directory.CreateDirectory(DropPath);
  482. if (!Directory.Exists(ExportPath))
  483. Directory.CreateDirectory(ExportPath);
  484. if (!Directory.Exists(RoutePath))
  485. Directory.CreateDirectory(RoutePath);
  486. if (!Directory.Exists(NameListPath))
  487. Directory.CreateDirectory(NameListPath);
  488. if (!Directory.Exists(RecipePath))
  489. Directory.CreateDirectory(RecipePath);
  490. string PreviewsPath = Path.Combine(EnvirPath, "Previews");
  491. if (!Directory.Exists(PreviewsPath))
  492. Directory.CreateDirectory(PreviewsPath);
  493. string NPCPreviewPath = Path.Combine(EnvirPath, "Previews", "NPC");
  494. if (!Directory.Exists(NPCPreviewPath))
  495. Directory.CreateDirectory(NPCPreviewPath);
  496. string MinimapsPath = Path.Combine(EnvirPath, "Previews", "Minimaps");
  497. if (!Directory.Exists(MinimapsPath))
  498. Directory.CreateDirectory(MinimapsPath);
  499. string fileName = Path.Combine(Settings.NPCPath, DefaultNPCFilename + ".txt");
  500. if (!File.Exists(fileName))
  501. {
  502. FileStream NewFile = File.Create(fileName);
  503. NewFile.Close();
  504. }
  505. fileName = Path.Combine(Settings.NPCPath, MonsterNPCFilename + ".txt");
  506. if (!File.Exists(fileName))
  507. {
  508. FileStream NewFile = File.Create(fileName);
  509. NewFile.Close();
  510. }
  511. fileName = Path.Combine(Settings.NPCPath, RobotNPCFilename + ".txt");
  512. if (!File.Exists(fileName))
  513. {
  514. FileStream NewFile = File.Create(fileName);
  515. NewFile.Close();
  516. }
  517. LoadVersion();
  518. LoadEXP();
  519. LoadHeroEXP();
  520. LoadBaseStats();
  521. LoadHeroBaseStats();
  522. LoadRandomItemStats();
  523. LoadMines();
  524. LoadGuildSettings();
  525. LoadAwakeAttribute();
  526. LoadFishing();
  527. LoadMail();
  528. LoadRefine();
  529. LoadMarriage();
  530. LoadMentor();
  531. LoadGoods();
  532. LoadMonsterRarity();
  533. LoadGem();
  534. LoadNotice();
  535. LoadWorldMap();
  536. LoadHeroSettings();
  537. string languageDirectory = @".\Localization\";
  538. if (!Directory.Exists(languageDirectory))
  539. {
  540. Directory.CreateDirectory(languageDirectory);
  541. }
  542. string settingLanguageFile = Path.Combine(languageDirectory, Language + ".json");
  543. GameLanguage.LoadServerLanguage(settingLanguageFile);
  544. }
  545. public static void LoadNotice()
  546. {
  547. Notice = new Notice();
  548. if (!File.Exists(NoticePath))
  549. {
  550. FileStream NewFile = File.Create(NoticePath);
  551. NewFile.Close();
  552. }
  553. var lines = File.ReadAllLines(NoticePath);
  554. if (lines.Length == 0)
  555. {
  556. return;
  557. }
  558. Notice.LastUpdate = File.GetLastWriteTime(NoticePath);
  559. var links = new List<string>();
  560. for (int i = 0; i < lines.Length; i++)
  561. {
  562. var line = lines[i];
  563. if (string.Compare(line, "TITLE", false) > 0 && line.Contains("="))
  564. {
  565. Notice.Title = line.Split('=')[1];
  566. continue;
  567. }
  568. Notice.Message += line + "\r\n";
  569. }
  570. }
  571. public static void Save()
  572. {
  573. //General
  574. Reader.Write("General", "VersionPath", VersionPath);
  575. Reader.Write("General", "CheckVersion", CheckVersion);
  576. Reader.Write("General", "RelogDelay", RelogDelay);
  577. Reader.Write("General", "Multithreaded", Multithreaded);
  578. Reader.Write("General", "ThreadLimit", ThreadLimit);
  579. Reader.Write("General", "TestServer", TestServer);
  580. Reader.Write("General", "EnforceDBChecks", EnforceDBChecks);
  581. Reader.Write("General", "MonsterProcessWhenAlone", MonsterProcessWhenAlone);
  582. Reader.Write("General", "Language", Language);
  583. //Paths
  584. Reader.Write("Network", "IPAddress", IPAddress);
  585. Reader.Write("Network", "Port", Port);
  586. Reader.Write("Network", "TimeOut", TimeOut);
  587. Reader.Write("Network", "MaxUser", MaxUser);
  588. Reader.Write("Network", "MaxIP", MaxIP);
  589. //HTTP
  590. Reader.Write("Network", "StartHTTPService", StartHTTPService);
  591. Reader.Write("Network", "HTTPIPAddress", HTTPIPAddress);
  592. Reader.Write("Network", "HTTPTrustedIPAddress", HTTPTrustedIPAddress);
  593. //Permission
  594. Reader.Write("Permission", "AllowNewAccount", AllowNewAccount);
  595. Reader.Write("Permission", "AllowChangePassword", AllowChangePassword);
  596. Reader.Write("Permission", "AllowLogin", AllowLogin);
  597. Reader.Write("Permission", "AllowNewCharacter", AllowNewCharacter);
  598. Reader.Write("Permission", "AllowDeleteCharacter", AllowDeleteCharacter);
  599. Reader.Write("Permission", "AllowStartGame", AllowStartGame);
  600. Reader.Write("Permission", "AllowCreateAssassin", AllowCreateAssassin);
  601. Reader.Write("Permission", "AllowCreateArcher", AllowCreateArcher);
  602. Reader.Write("Permission", "RequireStoragePassword", RequireStoragePassword);
  603. Reader.Write("Permission", "MaxResolution", AllowedResolution);
  604. //Optional
  605. Reader.Write("Optional", "SafeZoneBorder", SafeZoneBorder);
  606. Reader.Write("Optional", "SafeZoneHealing", SafeZoneHealing);
  607. Reader.Write("Optional", "GatherOrbsPerLevel", GatherOrbsPerLevel);
  608. Reader.Write("Optional", "ExpMobLevelDifference", ExpMobLevelDifference);
  609. Reader.Write("Optional", "GameMasterEffect", GameMasterEffect);
  610. Reader.Write("Optional", "LineMessageTimer", LineMessageTimer);
  611. //Database
  612. Reader.Write("Database", "SaveDelay", SaveDelay);
  613. Reader.Write("Database", "CredxGold", CredxGold);
  614. //Game
  615. Reader.Write("Game", "DropRate", DropRate);
  616. Reader.Write("Game", "ExpRate", ExpRate);
  617. Reader.Write("Game", "ItemTimeOut", ItemTimeOut);
  618. Reader.Write("Game", "PlayerDiedItemTimeOut", PlayerDiedItemTimeOut);
  619. Reader.Write("Game", "PetSave", PetSave);
  620. Reader.Write("Game", "MaxBossTames", MaxBossTames);
  621. Reader.Write("Game", "PKDelay", PKDelay);
  622. Reader.Write("Game", "NewbieGuild", NewbieGuild);
  623. Reader.Write("Game", "NewbieGuildMaxSize", NewbieGuildMaxSize);
  624. Reader.Write("Game", "SkeletonName", SkeletonName);
  625. Reader.Write("Game", "BugBatName", BugBatName);
  626. Reader.Write("Game", "ShinsuName", ShinsuName);
  627. Reader.Write("Game", "Zuma1", Zuma1);
  628. Reader.Write("Game", "Zuma2", Zuma2);
  629. Reader.Write("Game", "Zuma3", Zuma3);
  630. Reader.Write("Game", "Zuma4", Zuma4);
  631. Reader.Write("Game", "Zuma5", Zuma5);
  632. Reader.Write("Game", "Zuma6", Zuma6);
  633. Reader.Write("Game", "Zuma7", Zuma7);
  634. Reader.Write("Game", "Turtle1", Turtle1);
  635. Reader.Write("Game", "Turtle2", Turtle2);
  636. Reader.Write("Game", "Turtle3", Turtle3);
  637. Reader.Write("Game", "Turtle4", Turtle4);
  638. Reader.Write("Game", "Turtle5", Turtle5);
  639. Reader.Write("Game", "BoneMonster1", BoneMonster1);
  640. Reader.Write("Game", "BoneMonster2", BoneMonster2);
  641. Reader.Write("Game", "BoneMonster3", BoneMonster3);
  642. Reader.Write("Game", "BoneMonster4", BoneMonster4);
  643. Reader.Write("Game", "BehemothMonster1", BehemothMonster1);
  644. Reader.Write("Game", "BehemothMonster2", BehemothMonster2);
  645. Reader.Write("Game", "BehemothMonster3", BehemothMonster3);
  646. Reader.Write("Game", "HellKnight1", HellKnight1);
  647. Reader.Write("Game", "HellKnight2", HellKnight2);
  648. Reader.Write("Game", "HellKnight3", HellKnight3);
  649. Reader.Write("Game", "HellKnight4", HellKnight4);
  650. Reader.Write("Game", "HellBomb1", HellBomb1);
  651. Reader.Write("Game", "HellBomb2", HellBomb2);
  652. Reader.Write("Game", "HellBomb3", HellBomb3);
  653. Reader.Write("Game", "WhiteSnake", WhiteSnake);
  654. Reader.Write("Game", "AngelName", AngelName);
  655. Reader.Write("Game", "BombSpiderName", BombSpiderName);
  656. Reader.Write("Game", "CloneName", CloneName);
  657. Reader.Write("Game", "AssassinCloneName", AssassinCloneName);
  658. Reader.Write("Game", "VampireName", VampireName);
  659. Reader.Write("Game", "ToadName", ToadName);
  660. Reader.Write("Game", "SnakeTotemName", SnakeTotemName);
  661. Reader.Write("Game", "SnakesName", SnakesName);
  662. Reader.Write("Game", "StoneName", StoneName);
  663. Reader.Write("Game", "AncientBatName", AncientBatName);
  664. Reader.Write("Game", "TucsonGeneralEgg", TucsonGeneralEgg);
  665. Reader.Write("Game", "GroupInviteDelay", GroupInviteDelay);
  666. Reader.Write("Game", "TradeDelay", TradeDelay);
  667. Reader.Write("Rested", "Period", RestedPeriod);
  668. Reader.Write("Rested", "BuffLength", RestedBuffLength);
  669. Reader.Write("Rested", "ExpBonus", RestedExpBonus);
  670. Reader.Write("Rested", "MaxBonus", RestedMaxBonus);
  671. Reader.Write("Items", "HealRing", HealRing);
  672. Reader.Write("Items", "FireRing", FireRing);
  673. Reader.Write("Items", "BlinkSkill", BlinkSkill);
  674. Reader.Write("PKTown", "PKTownMapName", PKTownMapName);
  675. Reader.Write("PKTown", "PKTownPositionX", PKTownPositionX);
  676. Reader.Write("PKTown", "PKTownPositionY", PKTownPositionY);
  677. Reader.Write("DropGold", "DropGold", DropGold);
  678. Reader.Write("DropGold", "MaxDropGold", MaxDropGold);
  679. Reader.Write("Items", "MagicResistWeight", MagicResistWeight);
  680. Reader.Write("Items", "PoisonResistWeight", PoisonResistWeight);
  681. Reader.Write("Items", "CriticalRateWeight", CriticalRateWeight);
  682. Reader.Write("Items", "CriticalDamageWeight", CriticalDamageWeight);
  683. Reader.Write("Items", "FreezingAttackWeight", FreezingAttackWeight);
  684. Reader.Write("Items", "PoisonAttackWeight", PoisonAttackWeight);
  685. Reader.Write("Items", "HealthRegenWeight", HealthRegenWeight);
  686. Reader.Write("Items", "ManaRegenWeight", ManaRegenWeight);
  687. Reader.Write("Items", "MaxLuck", MaxLuck);
  688. Reader.Write("Items", "SealDelay", ItemSealDelay);
  689. Reader.Write("Items", "PvpCanResistMagic", PvpCanResistMagic);
  690. Reader.Write("Items", "PvpCanResistPoison", PvpCanResistPoison);
  691. Reader.Write("Items", "PvpCanFreeze", PvpCanFreeze);
  692. Reader.Write("Bonus", "RangeAccuracyBonus", RangeAccuracyBonus);
  693. Reader.Write("Observe", "AllowObserve", AllowObserve);
  694. Reader.Write("Game", "GeneralMeowMeowMob1", GeneralMeowMeowMob1);
  695. Reader.Write("Game", "GeneralMeowMeowMob2", GeneralMeowMeowMob2);
  696. Reader.Write("Game", "GeneralMeowMeowMob3", GeneralMeowMeowMob3);
  697. Reader.Write("Game", "GeneralMeowMeowMob4", GeneralMeowMeowMob4);
  698. Reader.Write("Game", "KingHydraxMob", KingHydraxMob);
  699. Reader.Write("Game", "HornedCommanderMob", HornedCommanderMob);
  700. Reader.Write("Game", "HornedCommanderBombMob", HornedCommanderBombMob);
  701. Reader.Write("Game", "SnowWolfKingMob", SnowWolfKingMob);
  702. Reader.Write("Game", "ScrollMob1", ScrollMob1);
  703. Reader.Write("Game", "ScrollMob2", ScrollMob2);
  704. Reader.Write("Game", "ScrollMob3", ScrollMob3);
  705. Reader.Write("Game", "ScrollMob4", ScrollMob4);
  706. Reader.Write("IntelligentCreatures", "CreatureBlackStoneName", CreatureBlackStoneName);
  707. //Archive
  708. Reader.Write("Archive", "InactiveCharacterMonths", ArchiveInactiveCharacterAfterMonths);
  709. Reader.Write("Archive", "DeletedCharacterMonths", ArchiveDeletedCharacterAfterMonths);
  710. Reader.Write("Game", "TeleportToNPCCost", TeleportToNPCCost);
  711. Reader.Write("Game", "HeroName", HeroName);
  712. SaveAwakeAttribute();
  713. }
  714. public static void LoadEXP()
  715. {
  716. long exp = 100;
  717. InIReader reader = new InIReader(Path.Combine(ConfigPath, "ExpList.ini"));
  718. for (int i = 1; i <= 500; i++)
  719. {
  720. exp = reader.ReadInt64("Exp", "Level" + i, exp);
  721. ExperienceList.Add(exp);
  722. }
  723. //ArcherSpells - Elemental system
  724. reader = new InIReader(Path.Combine(ConfigPath, "OrbsExpList.ini"));
  725. for (int i = 1; i <= 4; i++)
  726. {
  727. exp = i * 50;//default exp value
  728. exp = reader.ReadInt64("Exp", "Orb" + i, exp);
  729. OrbsExpList.Add(exp);
  730. exp = i * 2;//default defense value
  731. exp = reader.ReadInt64("Def", "Orb" + i, exp);
  732. OrbsDefList.Add(exp);
  733. exp = i * 4;//default power value
  734. exp = reader.ReadInt64("Att", "Orb" + i, exp);
  735. OrbsDmgList.Add(exp);
  736. }
  737. }
  738. public static void LoadHeroEXP()
  739. {
  740. long exp = 100;
  741. InIReader reader = new InIReader(Path.Combine(ConfigPath, "HeroExpList.ini"));
  742. for (int i = 1; i <= 500; i++)
  743. {
  744. exp = reader.ReadInt64("Exp", "Level" + i, exp);
  745. HeroExperienceList.Add(exp);
  746. }
  747. }
  748. public static void LoadWorldMap()
  749. {
  750. InIReader reader = null;
  751. string path = Path.Combine(ConfigPath, "WorldMap.ini");
  752. if (!File.Exists(path))
  753. {
  754. FileStream newFile = File.Create(path);
  755. newFile.Close();
  756. reader = new InIReader(path);
  757. reader.Write("Setup", "Enabled", false);
  758. reader.Write("Layout", "Button0ImageIndex", "");
  759. reader.Write("Layout", "Button0Title", "");
  760. reader.Write("Layout", "Button0MapIndex", "");
  761. }
  762. if (reader == null)
  763. reader = new InIReader(path);
  764. WorldMapSetup.Enabled = reader.ReadBoolean("Setup", "Enabled", false);
  765. int c = 0;
  766. while (true)
  767. {
  768. int imageIndex = reader.ReadInt32("Layout", $"Button{c}ImageIndex", -1, false);
  769. if (imageIndex == -1)
  770. break;
  771. WorldMapIcon icon = new WorldMapIcon()
  772. {
  773. ImageIndex = imageIndex,
  774. Title = reader.ReadString("Layout", $"Button{c}Title", ""),
  775. MapIndex = reader.ReadInt32("Layout", $"Button{c}MapIndex", 0)
  776. };
  777. WorldMapSetup.Icons.Add(icon);
  778. c++;
  779. }
  780. }
  781. public static void LoadBaseStats()
  782. {
  783. for (int i = 0; i < ClassBaseStats.Length; i++)
  784. {
  785. if (!File.Exists(Path.Combine(ConfigPath, $"BaseStats{ClassBaseStats[i].Job}.ini")))
  786. {
  787. SaveBaseStats(new BaseStats[1] { new BaseStats(ClassBaseStats[i].Job) });
  788. continue;
  789. }
  790. InIReader reader = new InIReader(Path.Combine(ConfigPath, $"BaseStats{ClassBaseStats[i].Job}.ini"));
  791. ClassBaseStats[i].Stats.Clear();
  792. ClassBaseStats[i].Caps.Clear();
  793. foreach (var stat in Enum.GetValues(typeof(Stat)))
  794. {
  795. var key = stat.ToString();
  796. var formula = reader.ReadString(key, "Formula", null, false);
  797. if (!string.IsNullOrEmpty(formula))
  798. {
  799. var baseStat = new BaseStat((Stat)stat)
  800. {
  801. FormulaType = (StatFormula)Enum.Parse(typeof(StatFormula), formula, true),
  802. Base = reader.ReadInt32(key, "Base", 0),
  803. Gain = reader.ReadFloat(key, "Gain", 0),
  804. GainRate = reader.ReadFloat(key, "GainRate", 0),
  805. Max = reader.ReadInt32(key, "Max", 0)
  806. };
  807. ClassBaseStats[i].Stats.Add(baseStat);
  808. }
  809. ClassBaseStats[i].Caps[(Stat)stat] = reader.ReadInt32("Caps", key, 0, false);
  810. }
  811. }
  812. }
  813. public static void LoadHeroBaseStats()
  814. {
  815. for (int i = 0; i < HeroBaseStats.Length; i++)
  816. {
  817. if (!File.Exists(Path.Combine(ConfigPath, $"HeroBaseStats{HeroBaseStats[i].Job}.ini")))
  818. {
  819. SaveHeroBaseStats(new BaseStats[1] { new BaseStats(HeroBaseStats[i].Job) });
  820. continue;
  821. }
  822. InIReader reader = new InIReader(Path.Combine(ConfigPath, $"HeroBaseStats{HeroBaseStats[i].Job}.ini"));
  823. HeroBaseStats[i].Stats.Clear();
  824. HeroBaseStats[i].Caps.Clear();
  825. foreach (var stat in Enum.GetValues(typeof(Stat)))
  826. {
  827. var key = stat.ToString();
  828. var formula = reader.ReadString(key, "Formula", null, false);
  829. if (!string.IsNullOrEmpty(formula))
  830. {
  831. var baseStat = new BaseStat((Stat)stat)
  832. {
  833. FormulaType = (StatFormula)Enum.Parse(typeof(StatFormula), formula, true),
  834. Base = reader.ReadInt32(key, "Base", 0),
  835. Gain = reader.ReadFloat(key, "Gain", 0),
  836. GainRate = reader.ReadFloat(key, "GainRate", 0),
  837. Max = reader.ReadInt32(key, "Max", 0)
  838. };
  839. HeroBaseStats[i].Stats.Add(baseStat);
  840. }
  841. HeroBaseStats[i].Caps[(Stat)stat] = reader.ReadInt32("Caps", key, 0, false);
  842. }
  843. }
  844. }
  845. public static void SaveBaseStats(BaseStats[] classStats = null)
  846. {
  847. if (classStats == null)
  848. {
  849. classStats = ClassBaseStats;
  850. }
  851. foreach (var baseStats in classStats)
  852. {
  853. File.Delete(Path.Combine(ConfigPath, $"BaseStats{baseStats.Job}.ini"));
  854. InIReader reader = new InIReader(Path.Combine(ConfigPath, $"BaseStats{baseStats.Job}.ini"));
  855. foreach (var stat in baseStats.Stats)
  856. {
  857. reader.Write(stat.Type.ToString(), "Formula", stat.FormulaType.ToString());
  858. reader.Write(stat.Type.ToString(), "Base", stat.Base.ToString());
  859. reader.Write(stat.Type.ToString(), "Gain", stat.Gain.ToString());
  860. reader.Write(stat.Type.ToString(), "GainRate", stat.GainRate.ToString());
  861. reader.Write(stat.Type.ToString(), "Max", stat.Max.ToString());
  862. }
  863. foreach (var item in baseStats.Caps.Values)
  864. {
  865. reader.Write("Caps", item.Key.ToString(), item.Value);
  866. }
  867. }
  868. }
  869. public static void SaveHeroBaseStats(BaseStats[] heroStats = null)
  870. {
  871. if (heroStats == null)
  872. {
  873. heroStats = HeroBaseStats;
  874. }
  875. foreach (var baseStats in heroStats)
  876. {
  877. File.Delete(Path.Combine(ConfigPath, $"HeroBaseStats{baseStats.Job}.ini"));
  878. InIReader reader = new InIReader(Path.Combine(ConfigPath, $"HeroBaseStats{baseStats.Job}.ini"));
  879. foreach (var stat in baseStats.Stats)
  880. {
  881. reader.Write(stat.Type.ToString(), "Formula", stat.FormulaType.ToString());
  882. reader.Write(stat.Type.ToString(), "Base", stat.Base.ToString());
  883. reader.Write(stat.Type.ToString(), "Gain", stat.Gain.ToString());
  884. reader.Write(stat.Type.ToString(), "GainRate", stat.GainRate.ToString());
  885. reader.Write(stat.Type.ToString(), "Max", stat.Max.ToString());
  886. }
  887. foreach (var item in baseStats.Caps.Values)
  888. {
  889. reader.Write("Caps", item.Key.ToString(), item.Value);
  890. }
  891. }
  892. }
  893. public static void LoadRandomItemStats()
  894. {
  895. if (!File.Exists(Path.Combine(ConfigPath, "RandomItemStats.ini")))
  896. {
  897. RandomItemStatsList.Add(new RandomItemStat());
  898. RandomItemStatsList.Add(new RandomItemStat(ItemType.Weapon));
  899. RandomItemStatsList.Add(new RandomItemStat(ItemType.Armour));
  900. RandomItemStatsList.Add(new RandomItemStat(ItemType.Helmet));
  901. RandomItemStatsList.Add(new RandomItemStat(ItemType.Necklace));
  902. RandomItemStatsList.Add(new RandomItemStat(ItemType.Bracelet));
  903. RandomItemStatsList.Add(new RandomItemStat(ItemType.Ring));
  904. RandomItemStatsList.Add(new RandomItemStat(ItemType.Belt));
  905. SaveRandomItemStats();
  906. return;
  907. }
  908. InIReader reader = new InIReader(Path.Combine(ConfigPath, "RandomItemStats.ini"));
  909. int i = 0;
  910. RandomItemStat stat;
  911. while (reader.ReadByte("Item" + i.ToString(),"MaxDuraChance",255) != 255)
  912. {
  913. stat = new RandomItemStat();
  914. stat.MaxDuraChance = reader.ReadByte("Item" + i.ToString(), "MaxDuraChance", 0);
  915. stat.MaxDuraStatChance = reader.ReadByte("Item" + i.ToString(), "MaxDuraStatChance", 1);
  916. stat.MaxDuraMaxStat = reader.ReadByte("Item" + i.ToString(), "MaxDuraMaxStat", 1);
  917. stat.MaxAcChance = reader.ReadByte("Item" + i.ToString(), "MaxAcChance", 0);
  918. stat.MaxAcStatChance = reader.ReadByte("Item" + i.ToString(), "MaxAcStatChance", 1);
  919. stat.MaxAcMaxStat = reader.ReadByte("Item" + i.ToString(), "MaxAcMaxStat", 1);
  920. stat.MaxMacChance = reader.ReadByte("Item" + i.ToString(), "MaxMacChance", 0);
  921. stat.MaxMacStatChance = reader.ReadByte("Item" + i.ToString(), "MaxMacStatChance", 1);
  922. stat.MaxMacMaxStat = reader.ReadByte("Item" + i.ToString(), "MaxMACMaxStat", 1);
  923. stat.MaxDcChance = reader.ReadByte("Item" + i.ToString(), "MaxDcChance", 0);
  924. stat.MaxDcStatChance = reader.ReadByte("Item" + i.ToString(), "MaxDcStatChance", 1);
  925. stat.MaxDcMaxStat = reader.ReadByte("Item" + i.ToString(), "MaxDcMaxStat", 1);
  926. stat.MaxMcChance = reader.ReadByte("Item" + i.ToString(), "MaxMcChance", 0);
  927. stat.MaxMcStatChance = reader.ReadByte("Item" + i.ToString(), "MaxMcStatChance", 1);
  928. stat.MaxMcMaxStat = reader.ReadByte("Item" + i.ToString(), "MaxMcMaxStat", 1);
  929. stat.MaxScChance = reader.ReadByte("Item" + i.ToString(), "MaxScChance", 0);
  930. stat.MaxScStatChance = reader.ReadByte("Item" + i.ToString(), "MaxScStatChance", 1);
  931. stat.MaxScMaxStat = reader.ReadByte("Item" + i.ToString(), "MaxScMaxStat", 1);
  932. stat.AccuracyChance = reader.ReadByte("Item" + i.ToString(), "AccuracyChance", 0);
  933. stat.AccuracyStatChance = reader.ReadByte("Item" + i.ToString(), "AccuracyStatChance", 1);
  934. stat.AccuracyMaxStat = reader.ReadByte("Item" + i.ToString(), "AccuracyMaxStat", 1);
  935. stat.AgilityChance = reader.ReadByte("Item" + i.ToString(), "AgilityChance", 0);
  936. stat.AgilityStatChance = reader.ReadByte("Item" + i.ToString(), "AgilityStatChance", 1);
  937. stat.AgilityMaxStat = reader.ReadByte("Item" + i.ToString(), "AgilityMaxStat", 1);
  938. stat.HpChance = reader.ReadByte("Item" + i.ToString(), "HpChance", 0);
  939. stat.HpStatChance = reader.ReadByte("Item" + i.ToString(), "HpStatChance", 1);
  940. stat.HpMaxStat = reader.ReadByte("Item" + i.ToString(), "HpMaxStat", 1);
  941. stat.MpChance = reader.ReadByte("Item" + i.ToString(), "MpChance", 0);
  942. stat.MpStatChance = reader.ReadByte("Item" + i.ToString(), "MpStatChance", 1);
  943. stat.MpMaxStat = reader.ReadByte("Item" + i.ToString(), "MpMaxStat", 1);
  944. stat.StrongChance = reader.ReadByte("Item" + i.ToString(), "StrongChance", 0);
  945. stat.StrongStatChance = reader.ReadByte("Item" + i.ToString(), "StrongStatChance", 1);
  946. stat.StrongMaxStat = reader.ReadByte("Item" + i.ToString(), "StrongMaxStat", 1);
  947. stat.MagicResistChance = reader.ReadByte("Item" + i.ToString(), "MagicResistChance", 0);
  948. stat.MagicResistStatChance = reader.ReadByte("Item" + i.ToString(), "MagicResistStatChance", 1);
  949. stat.MagicResistMaxStat = reader.ReadByte("Item" + i.ToString(), "MagicResistMaxStat", 1);
  950. stat.PoisonResistChance = reader.ReadByte("Item" + i.ToString(), "PoisonResistChance", 0);
  951. stat.PoisonResistStatChance = reader.ReadByte("Item" + i.ToString(), "PoisonResistStatChance", 1);
  952. stat.PoisonResistMaxStat = reader.ReadByte("Item" + i.ToString(), "PoisonResistMaxStat", 1);
  953. stat.HpRecovChance = reader.ReadByte("Item" + i.ToString(), "HpRecovChance", 0);
  954. stat.HpRecovStatChance = reader.ReadByte("Item" + i.ToString(), "HpRecovStatChance", 1);
  955. stat.HpRecovMaxStat = reader.ReadByte("Item" + i.ToString(), "HpRecovMaxStat", 1);
  956. stat.MpRecovChance = reader.ReadByte("Item" + i.ToString(), "MpRecovChance", 0);
  957. stat.MpRecovStatChance = reader.ReadByte("Item" + i.ToString(), "MpRecovStatChance", 1);
  958. stat.MpRecovMaxStat = reader.ReadByte("Item" + i.ToString(), "MpRecovMaxStat", 1);
  959. stat.PoisonRecovChance = reader.ReadByte("Item" + i.ToString(), "PoisonRecovChance", 0);
  960. stat.PoisonRecovStatChance = reader.ReadByte("Item" + i.ToString(), "PoisonRecovStatChance", 1);
  961. stat.PoisonRecovMaxStat = reader.ReadByte("Item" + i.ToString(), "PoisonRecovMaxStat", 1);
  962. stat.CriticalRateChance = reader.ReadByte("Item" + i.ToString(), "CriticalRateChance", 0);
  963. stat.CriticalRateStatChance = reader.ReadByte("Item" + i.ToString(), "CriticalRateStatChance", 1);
  964. stat.CriticalRateMaxStat = reader.ReadByte("Item" + i.ToString(), "CriticalRateMaxStat", 1);
  965. stat.CriticalDamageChance = reader.ReadByte("Item" + i.ToString(), "CriticalDamageChance", 0);
  966. stat.CriticalDamageStatChance = reader.ReadByte("Item" + i.ToString(), "CriticalDamageStatChance", 1);
  967. stat.CriticalDamageMaxStat = reader.ReadByte("Item" + i.ToString(), "CriticalDamageMaxStat", 1);
  968. stat.FreezeChance = reader.ReadByte("Item" + i.ToString(), "FreezeChance", 0);
  969. stat.FreezeStatChance = reader.ReadByte("Item" + i.ToString(), "FreezeStatChance", 1);
  970. stat.FreezeMaxStat = reader.ReadByte("Item" + i.ToString(), "FreezeMaxStat", 1);
  971. stat.PoisonAttackChance = reader.ReadByte("Item" + i.ToString(), "PoisonAttackChance", 0);
  972. stat.PoisonAttackStatChance = reader.ReadByte("Item" + i.ToString(), "PoisonAttackStatChance", 1);
  973. stat.PoisonAttackMaxStat = reader.ReadByte("Item" + i.ToString(), "PoisonAttackMaxStat", 1);
  974. stat.AttackSpeedChance = reader.ReadByte("Item" + i.ToString(), "AttackSpeedChance", 0);
  975. stat.AttackSpeedStatChance = reader.ReadByte("Item" + i.ToString(), "AttackSpeedStatChance", 1);
  976. stat.AttackSpeedMaxStat = reader.ReadByte("Item" + i.ToString(), "AttackSpeedMaxStat", 1);
  977. stat.LuckChance = reader.ReadByte("Item" + i.ToString(), "LuckChance", 0);
  978. stat.LuckStatChance = reader.ReadByte("Item" + i.ToString(), "LuckStatChance", 1);
  979. stat.LuckMaxStat = reader.ReadByte("Item" + i.ToString(), "LuckMaxStat", 1);
  980. stat.CurseChance = reader.ReadByte("Item" + i.ToString(), "CurseChance", 0);
  981. stat.SlotChance = reader.ReadByte("Item" + i.ToString(), "SlotChance", 0);
  982. stat.SlotStatChance = reader.ReadByte("Item" + i.ToString(), "SlotStatChance", 0);
  983. stat.SlotMaxStat = reader.ReadByte("Item" + i.ToString(), "SlotMaxStat", 0);
  984. RandomItemStatsList.Add(stat);
  985. i++;
  986. }
  987. }
  988. public static void SaveRandomItemStats()
  989. {
  990. File.Delete(Path.Combine(ConfigPath, "RandomItemStats.ini"));
  991. InIReader reader = new InIReader(Path.Combine(ConfigPath, "RandomItemStats.ini"));
  992. RandomItemStat stat;
  993. for (int i = 0; i < RandomItemStatsList.Count; i++)
  994. {
  995. stat = RandomItemStatsList[i];
  996. reader.Write("Item" + i.ToString(), "MaxDuraChance", stat.MaxDuraChance);
  997. reader.Write("Item" + i.ToString(), "MaxDuraStatChance", stat.MaxDuraStatChance);
  998. reader.Write("Item" + i.ToString(), "MaxDuraMaxStat", stat.MaxDuraMaxStat);
  999. reader.Write("Item" + i.ToString(), "MaxAcChance", stat.MaxAcChance);
  1000. reader.Write("Item" + i.ToString(), "MaxAcStatChance", stat.MaxAcStatChance);
  1001. reader.Write("Item" + i.ToString(), "MaxAcMaxStat", stat.MaxAcMaxStat);
  1002. reader.Write("Item" + i.ToString(), "MaxMacChance", stat.MaxMacChance);
  1003. reader.Write("Item" + i.ToString(), "MaxMacStatChance", stat.MaxMacStatChance);
  1004. reader.Write("Item" + i.ToString(), "MaxMACMaxStat", stat.MaxMacMaxStat);
  1005. reader.Write("Item" + i.ToString(), "MaxDcChance", stat.MaxDcChance);
  1006. reader.Write("Item" + i.ToString(), "MaxDcStatChance", stat.MaxDcStatChance);
  1007. reader.Write("Item" + i.ToString(), "MaxDcMaxStat", stat.MaxDcMaxStat);
  1008. reader.Write("Item" + i.ToString(), "MaxMcChance", stat.MaxMcChance);
  1009. reader.Write("Item" + i.ToString(), "MaxMcStatChance", stat.MaxMcStatChance);
  1010. reader.Write("Item" + i.ToString(), "MaxMcMaxStat", stat.MaxMcMaxStat);
  1011. reader.Write("Item" + i.ToString(), "MaxScChance", stat.MaxScChance);
  1012. reader.Write("Item" + i.ToString(), "MaxScStatChance", stat.MaxScStatChance);
  1013. reader.Write("Item" + i.ToString(), "MaxScMaxStat", stat.MaxScMaxStat);
  1014. reader.Write("Item" + i.ToString(), "AccuracyChance", stat.AccuracyChance);
  1015. reader.Write("Item" + i.ToString(), "AccuracyStatChance", stat.AccuracyStatChance);
  1016. reader.Write("Item" + i.ToString(), "AccuracyMaxStat", stat.AccuracyMaxStat);
  1017. reader.Write("Item" + i.ToString(), "AgilityChance", stat.AgilityChance);
  1018. reader.Write("Item" + i.ToString(), "AgilityStatChance", stat.AgilityStatChance);
  1019. reader.Write("Item" + i.ToString(), "AgilityMaxStat", stat.AgilityMaxStat);
  1020. reader.Write("Item" + i.ToString(), "HpChance", stat.HpChance);
  1021. reader.Write("Item" + i.ToString(), "HpStatChance", stat.HpStatChance);
  1022. reader.Write("Item" + i.ToString(), "HpMaxStat", stat.HpMaxStat);
  1023. reader.Write("Item" + i.ToString(), "MpChance", stat.MpChance);
  1024. reader.Write("Item" + i.ToString(), "MpStatChance", stat.MpStatChance);
  1025. reader.Write("Item" + i.ToString(), "MpMaxStat", stat.MpMaxStat);
  1026. reader.Write("Item" + i.ToString(), "StrongChance", stat.StrongChance);
  1027. reader.Write("Item" + i.ToString(), "StrongStatChance", stat.StrongStatChance);
  1028. reader.Write("Item" + i.ToString(), "StrongMaxStat", stat.StrongMaxStat);
  1029. reader.Write("Item" + i.ToString(), "MagicResistChance", stat.MagicResistChance);
  1030. reader.Write("Item" + i.ToString(), "MagicResistStatChance", stat.MagicResistStatChance);
  1031. reader.Write("Item" + i.ToString(), "MagicResistMaxStat", stat.MagicResistMaxStat);
  1032. reader.Write("Item" + i.ToString(), "PoisonResistChance", stat.PoisonResistChance);
  1033. reader.Write("Item" + i.ToString(), "PoisonResistStatChance", stat.PoisonResistStatChance);
  1034. reader.Write("Item" + i.ToString(), "PoisonResistMaxStat", stat.PoisonResistMaxStat);
  1035. reader.Write("Item" + i.ToString(), "HpRecovChance", stat.HpRecovChance);
  1036. reader.Write("Item" + i.ToString(), "HpRecovStatChance", stat.HpRecovStatChance);
  1037. reader.Write("Item" + i.ToString(), "HpRecovMaxStat", stat.HpRecovMaxStat);
  1038. reader.Write("Item" + i.ToString(), "MpRecovChance", stat.MpRecovChance);
  1039. reader.Write("Item" + i.ToString(), "MpRecovStatChance", stat.MpRecovStatChance);
  1040. reader.Write("Item" + i.ToString(), "MpRecovMaxStat", stat.MpRecovMaxStat);
  1041. reader.Write("Item" + i.ToString(), "PoisonRecovChance", stat.PoisonRecovChance);
  1042. reader.Write("Item" + i.ToString(), "PoisonRecovStatChance", stat.PoisonRecovStatChance);
  1043. reader.Write("Item" + i.ToString(), "PoisonRecovMaxStat", stat.PoisonRecovMaxStat);
  1044. reader.Write("Item" + i.ToString(), "CriticalRateChance", stat.CriticalRateChance);
  1045. reader.Write("Item" + i.ToString(), "CriticalRateStatChance", stat.CriticalRateStatChance);
  1046. reader.Write("Item" + i.ToString(), "CriticalRateMaxStat", stat.CriticalRateMaxStat);
  1047. reader.Write("Item" + i.ToString(), "CriticalDamageChance", stat.CriticalDamageChance);
  1048. reader.Write("Item" + i.ToString(), "CriticalDamageStatChance", stat.CriticalDamageStatChance);
  1049. reader.Write("Item" + i.ToString(), "CriticalDamageMaxStat", stat.CriticalDamageMaxStat);
  1050. reader.Write("Item" + i.ToString(), "FreezeChance", stat.FreezeChance);
  1051. reader.Write("Item" + i.ToString(), "FreezeStatChance", stat.FreezeStatChance);
  1052. reader.Write("Item" + i.ToString(), "FreezeMaxStat", stat.FreezeMaxStat);
  1053. reader.Write("Item" + i.ToString(), "PoisonAttackChance", stat.PoisonAttackChance);
  1054. reader.Write("Item" + i.ToString(), "PoisonAttackStatChance", stat.PoisonAttackStatChance);
  1055. reader.Write("Item" + i.ToString(), "PoisonAttackMaxStat", stat.PoisonAttackMaxStat);
  1056. reader.Write("Item" + i.ToString(), "AttackSpeedChance", stat.AttackSpeedChance);
  1057. reader.Write("Item" + i.ToString(), "AttackSpeedStatChance", stat.AttackSpeedStatChance);
  1058. reader.Write("Item" + i.ToString(), "AttackSpeedMaxStat", stat.AttackSpeedMaxStat);
  1059. reader.Write("Item" + i.ToString(), "LuckChance", stat.LuckChance);
  1060. reader.Write("Item" + i.ToString(), "LuckStatChance", stat.LuckStatChance);
  1061. reader.Write("Item" + i.ToString(), "LuckMaxStat", stat.LuckMaxStat);
  1062. reader.Write("Item" + i.ToString(), "CurseChance", stat.CurseChance);
  1063. reader.Write("Item" + i.ToString(), "SlotChance", stat.SlotChance);
  1064. reader.Write("Item" + i.ToString(), "SlotStatChance", stat.SlotStatChance);
  1065. reader.Write("Item" + i.ToString(), "SlotMaxStat", stat.SlotMaxStat);
  1066. }
  1067. }
  1068. public static void LoadMines()
  1069. {
  1070. if (!File.Exists(Path.Combine(ConfigPath, "Mines.ini")))
  1071. {
  1072. MineSetList.Add(new MineSet(1));
  1073. MineSetList.Add(new MineSet(2));
  1074. SaveMines();
  1075. return;
  1076. }
  1077. InIReader reader = new InIReader(Path.Combine(ConfigPath, "Mines.ini"));
  1078. int i = 0;
  1079. MineSet mine;
  1080. while (reader.ReadByte("Mine" + i.ToString(), "SpotRegenRate", 255) != 255)
  1081. {
  1082. mine = new MineSet();
  1083. mine.Name = reader.ReadString("Mine" + i.ToString(), "Name", mine.Name);
  1084. mine.SpotRegenRate = reader.ReadByte("Mine" + i.ToString(), "SpotRegenRate", mine.SpotRegenRate);
  1085. mine.MaxStones = reader.ReadByte("Mine" + i.ToString(), "MaxStones", mine.MaxStones);
  1086. mine.HitRate = reader.ReadByte("Mine" + i.ToString(), "HitRate", mine.HitRate);
  1087. mine.DropRate = reader.ReadByte("Mine" + i.ToString(), "DropRate", mine.DropRate);
  1088. mine.TotalSlots = reader.ReadByte("Mine" + i.ToString(), "TotalSlots", mine.TotalSlots);
  1089. int j = 0;
  1090. while (reader.ReadByte("Mine" + i.ToString(), "D" + j.ToString() + "-MinSlot", 255) != 255)
  1091. {
  1092. mine.Drops.Add(new MineDrop()
  1093. {
  1094. ItemName = reader.ReadString("Mine" + i.ToString(), "D" + j.ToString() + "-ItemName", ""),
  1095. MinSlot = reader.ReadByte("Mine" + i.ToString(), "D" + j.ToString() + "-MinSlot", 255),
  1096. MaxSlot = reader.ReadByte("Mine" + i.ToString(), "D" + j.ToString() + "-MaxSlot", 255),
  1097. MinDura = reader.ReadByte("Mine" + i.ToString(), "D" + j.ToString() + "-MinDura", 255),
  1098. MaxDura = reader.ReadByte("Mine" + i.ToString(), "D" + j.ToString() + "-MaxDura", 255),
  1099. BonusChance = reader.ReadByte("Mine" + i.ToString(), "D" + j.ToString() + "-BonusChance", 255),
  1100. MaxBonusDura = reader.ReadByte("Mine" + i.ToString(), "D" + j.ToString() + "-MaxBonusDura", 255)
  1101. });
  1102. j++;
  1103. }
  1104. MineSetList.Add(mine);
  1105. i++;
  1106. }
  1107. }
  1108. public static void SaveMines()
  1109. {
  1110. File.Delete(Path.Combine(ConfigPath, "Mines.ini"));
  1111. InIReader reader = new InIReader(Path.Combine(ConfigPath, "Mines.ini"));
  1112. MineSet mine;
  1113. for (int i = 0; i < MineSetList.Count; i++)
  1114. {
  1115. mine = MineSetList[i];
  1116. reader.Write("Mine" + i.ToString(), "Name", mine.Name);
  1117. reader.Write("Mine" + i.ToString(), "SpotRegenRate", mine.SpotRegenRate);
  1118. reader.Write("Mine" + i.ToString(), "MaxStones", mine.MaxStones);
  1119. reader.Write("Mine" + i.ToString(), "HitRate", mine.HitRate);
  1120. reader.Write("Mine" + i.ToString(), "DropRate", mine.DropRate);
  1121. reader.Write("Mine" + i.ToString(), "TotalSlots", mine.TotalSlots);
  1122. for (int j = 0; j < mine.Drops.Count; j++)
  1123. {
  1124. MineDrop Drop = mine.Drops[j];
  1125. reader.Write("Mine" + i.ToString(), "D" + j.ToString() + "-ItemName", Drop.ItemName);
  1126. reader.Write("Mine" + i.ToString(), "D" + j.ToString() + "-MinSlot", Drop.MinSlot);
  1127. reader.Write("Mine" + i.ToString(), "D" + j.ToString() + "-MaxSlot", Drop.MaxSlot);
  1128. reader.Write("Mine" + i.ToString(), "D" + j.ToString() + "-MinDura", Drop.MinDura);
  1129. reader.Write("Mine" + i.ToString(), "D" + j.ToString() + "-MaxDura", Drop.MaxDura);
  1130. reader.Write("Mine" + i.ToString(), "D" + j.ToString() + "-BonusChance", Drop.BonusChance);
  1131. reader.Write("Mine" + i.ToString(), "D" + j.ToString() + "-MaxBonusDura", Drop.MaxBonusDura);
  1132. }
  1133. }
  1134. }
  1135. public static void LoadHeroSettings()
  1136. {
  1137. Array.Resize(ref Hero_CanCreateClass, Enum.GetNames(typeof(MirClass)).Length);
  1138. if (!File.Exists(Path.Combine(ConfigPath, "HeroSettings.ini")))
  1139. {
  1140. for (int i = 0; i < Hero_CanCreateClass.Length; i++)
  1141. Hero_CanCreateClass[i] = true;
  1142. SaveHeroSettings();
  1143. return;
  1144. }
  1145. InIReader reader = new InIReader(Path.Combine(ConfigPath, "HeroSettings.ini"));
  1146. AllowNewHero = reader.ReadBoolean("Hero", "AllowNewHero", AllowNewHero);
  1147. Hero_RequiredLevel = reader.ReadByte("Hero", "MinimumLevel", Hero_RequiredLevel);
  1148. MaximumHeroCount = reader.ReadByte("Hero", "MaximumCount", MaximumHeroCount);
  1149. for (int i = 0; i < Hero_CanCreateClass.Length; i++)
  1150. Hero_CanCreateClass[i] = reader.ReadBoolean("Hero", $"CanCreate{Enum.GetName(typeof(MirClass), i)}", true);
  1151. HeroSealItemName = reader.ReadString("Hero", "SealItemName", HeroSealItemName);
  1152. HeroMaximumSealCount = reader.ReadUInt16("Hero", "MaximumSealCount", HeroMaximumSealCount);
  1153. }
  1154. public static void SaveHeroSettings()
  1155. {
  1156. File.Delete(Path.Combine(ConfigPath, "HeroSettings.ini"));
  1157. InIReader reader = new InIReader(Path.Combine(ConfigPath, "HeroSettings.ini"));
  1158. reader.Write("Hero", "AllowNewHero", AllowNewHero);
  1159. reader.Write("Hero", "MinimumLevel", Hero_RequiredLevel);
  1160. reader.Write("Hero", "MaximumCount", MaximumHeroCount);
  1161. for (int i = 0; i < Hero_CanCreateClass.Length; i++)
  1162. reader.Write("Hero", $"CanCreate{Enum.GetName(typeof(MirClass), i)}", Hero_CanCreateClass[i]);
  1163. reader.Write("Hero", "SealItemName", HeroSealItemName);
  1164. reader.Write("Hero", "MaximumSealCount", HeroMaximumSealCount);
  1165. }
  1166. public static void LoadGuildSettings()
  1167. {
  1168. if (!File.Exists(Path.Combine(ConfigPath, "GuildSettings.ini")))
  1169. {
  1170. Guild_CreationCostList.Add(new GuildItemVolume(){Amount = 1000000});
  1171. Guild_CreationCostList.Add(new GuildItemVolume(){ItemName = "WoomaHorn",Amount = 1});
  1172. return;
  1173. }
  1174. InIReader reader = new InIReader(Path.Combine(ConfigPath, "GuildSettings.ini"));
  1175. Guild_RequiredLevel = reader.ReadByte("Guilds", "MinimumLevel", Guild_RequiredLevel);
  1176. Guild_ExpRate = reader.ReadFloat("Guilds", "ExpRate", Guild_ExpRate);
  1177. Guild_PointPerLevel = reader.ReadByte("Guilds", "PointPerLevel", Guild_PointPerLevel);
  1178. Guild_WarTime = reader.ReadInt64("Guilds", "WarTime", Guild_WarTime);
  1179. Guild_WarCost = reader.ReadUInt32("Guilds", "WarCost", Guild_WarCost);
  1180. NewbieGuildBuffEnabled = reader.ReadBoolean("Guilds", "NewbieGuildBuffEnabled", NewbieGuildBuffEnabled);
  1181. NewbieGuildExpBuff = reader.ReadInt32("Guilds", "NewbieGuildExpBuff", NewbieGuildExpBuff);
  1182. int i = 0;
  1183. while (reader.ReadUInt32("Required-" + i.ToString(),"Amount",0) != 0)
  1184. {
  1185. Guild_CreationCostList.Add(new GuildItemVolume()
  1186. {
  1187. ItemName = reader.ReadString("Required-" + i.ToString(), "ItemName", ""),
  1188. Amount = reader.ReadUInt32("Required-" + i.ToString(), "Amount", 0)
  1189. }
  1190. );
  1191. i++;
  1192. }
  1193. i = 0;
  1194. while (reader.ReadInt64("Exp", "Level-" + i.ToString(), -1) != -1)
  1195. {
  1196. Guild_ExperienceList.Add(reader.ReadInt64("Exp", "Level-" + i.ToString(), 0));
  1197. i++;
  1198. }
  1199. i = 0;
  1200. while (reader.ReadInt32("Cap", "Level-" + i.ToString(), -1) != -1)
  1201. {
  1202. Guild_MembercapList.Add(reader.ReadInt32("Cap", "Level-" + i.ToString(), 0));
  1203. i++;
  1204. }
  1205. byte TotalBuffs = reader.ReadByte("Guilds", "TotalBuffs", 0);
  1206. for (i = 0; i < TotalBuffs; i++)
  1207. {
  1208. Guild_BuffList.Add(new GuildBuffInfo(reader, i));
  1209. }
  1210. }
  1211. public static void SaveGuildSettings()
  1212. {
  1213. File.Delete(Path.Combine(ConfigPath, "GuildSettings.ini"));
  1214. InIReader reader = new InIReader(Path.Combine(ConfigPath, "GuildSettings.ini"));
  1215. reader.Write("Guilds", "MinimumLevel", Guild_RequiredLevel);
  1216. reader.Write("Guilds", "ExpRate", Guild_ExpRate);
  1217. reader.Write("Guilds", "PointPerLevel", Guild_PointPerLevel);
  1218. reader.Write("Guilds", "TotalBuffs", Guild_BuffList.Count);
  1219. reader.Write("Guilds", "WarTime", Guild_WarTime);
  1220. reader.Write("Guilds", "WarCost", Guild_WarCost);
  1221. reader.Write("Guilds", "NewbieGuildExpBuff", NewbieGuildExpBuff);
  1222. reader.Write("Guilds", "NewbieGuildBuffEnabled", NewbieGuildBuffEnabled);
  1223. int i;
  1224. for (i = 0; i < Guild_ExperienceList.Count; i++)
  1225. {
  1226. reader.Write("Exp", "Level-" + i.ToString(), Guild_ExperienceList[i]);
  1227. }
  1228. for (i = 0; i < Guild_MembercapList.Count; i++)
  1229. {
  1230. reader.Write("Cap", "Level-" + i.ToString(), Guild_MembercapList[i]);
  1231. }
  1232. for (i = 0; i < Guild_CreationCostList.Count; i++)
  1233. {
  1234. reader.Write("Required-" + i.ToString(), "ItemName", Guild_CreationCostList[i].ItemName);
  1235. reader.Write("Required-" + i.ToString(), "Amount", Guild_CreationCostList[i].Amount);
  1236. }
  1237. for (i = 0; i < Guild_BuffList.Count; i++)
  1238. {
  1239. Guild_BuffList[i].Save(reader, i);
  1240. }
  1241. }
  1242. public static void LinkGuildCreationItems(List<ItemInfo> ItemList)
  1243. {
  1244. for (int i = 0; i < Guild_CreationCostList.Count; i++)
  1245. {
  1246. if (Guild_CreationCostList[i].ItemName != "")
  1247. for (int j = 0; j < ItemList.Count; j++)
  1248. {
  1249. if (String.Compare(ItemList[j].Name.Replace(" ", ""), Guild_CreationCostList[i].ItemName, StringComparison.OrdinalIgnoreCase) != 0) continue;
  1250. Guild_CreationCostList[i].Item = ItemList[j];
  1251. break;
  1252. }
  1253. }
  1254. }
  1255. public static void LoadAwakeAttribute()
  1256. {
  1257. if (!File.Exists(Path.Combine(ConfigPath, "AwakeningSystem.ini")))
  1258. {
  1259. return;
  1260. }
  1261. InIReader reader = new InIReader(Path.Combine(ConfigPath, "AwakeningSystem.ini"));
  1262. Awake.AwakeSuccessRate = reader.ReadByte("Attribute", "SuccessRate", Awake.AwakeSuccessRate);
  1263. Awake.AwakeHitRate = reader.ReadByte("Attribute", "HitRate", Awake.AwakeHitRate);
  1264. Awake.MaxAwakeLevel = reader.ReadInt32("Attribute", "MaxUpgradeLevel", Awake.MaxAwakeLevel);
  1265. Awake.Awake_WeaponRate = reader.ReadByte("IncreaseValue", "WeaponValue", Awake.Awake_WeaponRate);
  1266. Awake.Awake_HelmetRate = reader.ReadByte("IncreaseValue", "HelmetValue", Awake.Awake_HelmetRate);
  1267. Awake.Awake_ArmorRate = reader.ReadByte("IncreaseValue", "ArmorValue", Awake.Awake_ArmorRate);
  1268. for (int i = 0; i < 5; i++)
  1269. {
  1270. Awake.AwakeChanceMax[i] = reader.ReadByte("Value", "ChanceMax_" + ((ItemGrade)(i + 1)).ToString(), Awake.AwakeChanceMax[i]);
  1271. }
  1272. for (int i = 0; i < (int)AwakeType.HPMP; i++)
  1273. {
  1274. List<byte>[] value = new List<byte>[2];
  1275. for (int k = 0; k < 2; k++)
  1276. {
  1277. value[k] = new List<byte>();
  1278. }
  1279. for (int j = 0; j < 5; j++)
  1280. {
  1281. byte material1 = 1;
  1282. material1 = reader.ReadByte("Materials_BaseValue", ((AwakeType)(i + 1)).ToString() + "_" + ((ItemGrade)(j + 1)).ToString() + "_Material1", material1);
  1283. byte material2 = 1;
  1284. material2 = reader.ReadByte("Materials_BaseValue", ((AwakeType)(i + 1)).ToString() + "_" + ((ItemGrade)(j + 1)).ToString() + "_Material2", material2);
  1285. value[0].Add(material1);
  1286. value[1].Add(material2);
  1287. }
  1288. Awake.AwakeMaterials.Add(value);
  1289. }
  1290. for (int c = 0; c < 5; c++)
  1291. {
  1292. Awake.AwakeMaterialRate[c] = reader.ReadFloat("Materials_IncreaseValue", "Materials_" + ((ItemGrade)(c + 1)).ToString(), Awake.AwakeMaterialRate[c]);
  1293. }
  1294. }
  1295. public static void SaveAwakeAttribute()
  1296. {
  1297. File.Delete(Path.Combine(ConfigPath, "AwakeningSystem.ini"));
  1298. InIReader reader = new InIReader(Path.Combine(ConfigPath, "AwakeningSystem.ini"));
  1299. reader.Write("Attribute", "SuccessRate", Awake.AwakeSuccessRate);
  1300. reader.Write("Attribute", "HitRate", Awake.AwakeHitRate);
  1301. reader.Write("Attribute", "MaxUpgradeLevel", Awake.MaxAwakeLevel);
  1302. reader.Write("IncreaseValue", "WeaponValue", Awake.Awake_WeaponRate);
  1303. reader.Write("IncreaseValue", "HelmetValue", Awake.Awake_HelmetRate);
  1304. reader.Write("IncreaseValue", "ArmorValue", Awake.Awake_ArmorRate);
  1305. for (int i = 0; i < 5; i++)
  1306. {
  1307. reader.Write("Value", "ChanceMax_" + ((ItemGrade)(i + 1)).ToString(), Awake.AwakeChanceMax[i]);
  1308. }
  1309. if (Awake.AwakeMaterials.Count == 0)
  1310. {
  1311. for (int i = 0; i < (int)AwakeType.HPMP; i++)
  1312. {
  1313. for (int j = 0; j < 5; j++)
  1314. {
  1315. reader.Write("Materials_BaseValue", ((AwakeType)(i + 1)).ToString() + "_" + ((ItemGrade)(j + 1)).ToString() + "_Material1", 1);
  1316. reader.Write("Materials_BaseValue", ((AwakeType)(i + 1)).ToString() + "_" + ((ItemGrade)(j + 1)).ToString() + "_Material2", 1);
  1317. }
  1318. }
  1319. }
  1320. else
  1321. {
  1322. for (int i = 0; i < (int)AwakeType.HPMP; i++)
  1323. {
  1324. List<byte>[] value = Awake.AwakeMaterials[i];
  1325. for (int j = 0; j < value[0].Count; j++)
  1326. {
  1327. reader.Write("Materials_BaseValue", ((AwakeType)(i + 1)).ToString() + "_" + ((ItemGrade)(j + 1)).ToString() + "_Material1", value[0][j]);
  1328. reader.Write("Materials_BaseValue", ((AwakeType)(i + 1)).ToString() + "_" + ((ItemGrade)(j + 1)).ToString() + "_Material2", value[1][j]);
  1329. }
  1330. Awake.AwakeMaterials.Add(value);
  1331. }
  1332. }
  1333. for (int c = 0; c < 5; c++)
  1334. {
  1335. reader.Write("Materials_IncreaseValue", "Materials_" + ((ItemGrade)(c + 1)).ToString(), Awake.AwakeMaterialRate[c]);
  1336. }
  1337. }
  1338. public static void LoadFishing()
  1339. {
  1340. if (!File.Exists(Path.Combine(ConfigPath, "FishingSystem.ini")))
  1341. {
  1342. SaveFishing();
  1343. return;
  1344. }
  1345. InIReader reader = new InIReader(Path.Combine(ConfigPath, "FishingSystem.ini"));
  1346. FishingAttempts = reader.ReadInt32("Rates", "Attempts", FishingAttempts);
  1347. FishingSuccessStart = reader.ReadInt32("Rates", "SuccessStart", FishingSuccessStart);
  1348. FishingSuccessMultiplier = reader.ReadInt32("Rates", "SuccessMultiplier", FishingSuccessMultiplier);
  1349. FishingDelay = reader.ReadInt64("Rates", "Delay", FishingDelay);
  1350. FishingMobSpawnChance = reader.ReadInt32("Rates", "MonsterSpawnChance", FishingMobSpawnChance);
  1351. FishingMonster = reader.ReadString("Game", "Monster", FishingMonster);
  1352. }
  1353. public static void SaveFishing()
  1354. {
  1355. File.Delete(Path.Combine(ConfigPath, "FishingSystem.ini"));
  1356. InIReader reader = new InIReader(Path.Combine(ConfigPath, "FishingSystem.ini"));
  1357. reader.Write("Rates", "Attempts", FishingAttempts);
  1358. reader.Write("Rates", "SuccessStart", FishingSuccessStart);
  1359. reader.Write("Rates", "SuccessMultiplier", FishingSuccessMultiplier);
  1360. reader.Write("Rates", "Delay", FishingDelay);
  1361. reader.Write("Rates", "MonsterSpawnChance", FishingMobSpawnChance);
  1362. reader.Write("Game", "Monster", FishingMonster);
  1363. }
  1364. public static void LoadMail()
  1365. {
  1366. if (!File.Exists(Path.Combine(ConfigPath, "MailSystem.ini")))
  1367. {
  1368. SaveMail();
  1369. return;
  1370. }
  1371. InIReader reader = new InIReader(Path.Combine(ConfigPath, "MailSystem.ini"));
  1372. MailAutoSendGold = reader.ReadBoolean("AutoSend", "Gold", MailAutoSendGold);
  1373. MailAutoSendItems = reader.ReadBoolean("AutoSend", "Items", MailAutoSendItems);
  1374. MailFreeWithStamp = reader.ReadBoolean("Rates", "FreeWithStamp", MailFreeWithStamp);
  1375. MailCostPer1KGold = reader.ReadUInt32("Rates", "CostPer1k", MailCostPer1KGold);
  1376. MailItemInsurancePercentage = reader.ReadUInt32("Rates", "InsurancePerItem", MailItemInsurancePercentage);
  1377. MailCapacity = reader.ReadUInt32("General", "MailCapacity", MailCapacity);
  1378. }
  1379. public static void SaveMail()
  1380. {
  1381. File.Delete(Path.Combine(ConfigPath, "MailSystem.ini"));
  1382. InIReader reader = new InIReader(Path.Combine(ConfigPath, "MailSystem.ini"));
  1383. reader.Write("AutoSend", "Gold", MailAutoSendGold);
  1384. reader.Write("AutoSend", "Items", MailAutoSendItems);
  1385. reader.Write("Rates", "FreeWithStamp", MailFreeWithStamp);
  1386. reader.Write("Rates", "CostPer1k", MailCostPer1KGold);
  1387. reader.Write("Rates", "InsurancePerItem", MailItemInsurancePercentage);
  1388. reader.Write("General", "MailCapacity", MailCapacity);
  1389. }
  1390. public static void LoadRefine()
  1391. {
  1392. if (!File.Exists(Path.Combine(ConfigPath, "RefineSystem.ini")))
  1393. {
  1394. SaveRefine();
  1395. return;
  1396. }
  1397. InIReader reader = new InIReader(Path.Combine(ConfigPath, "RefineSystem.ini"));
  1398. OnlyRefineWeapon = reader.ReadBoolean("Config", "OnlyRefineWeapon", OnlyRefineWeapon);
  1399. RefineBaseChance = reader.ReadByte("Config", "BaseChance", RefineBaseChance);
  1400. RefineTime = reader.ReadInt32("Config", "Time", RefineTime);
  1401. RefineIncrease = reader.ReadByte("Config", "StatIncrease", RefineIncrease);
  1402. RefineCritChance = reader.ReadByte("Config", "CritChance", RefineCritChance);
  1403. RefineCritIncrease = reader.ReadByte("Config", "CritIncrease", RefineCritIncrease);
  1404. RefineWepStatReduce = reader.ReadByte("Config", "WepStatReducedChance", RefineWepStatReduce);
  1405. RefineItemStatReduce = reader.ReadByte("Config", "ItemStatReducedChance", RefineItemStatReduce);
  1406. RefineCost = reader.ReadInt32("Config", "RefineCost", RefineCost);
  1407. RefineOreName = reader.ReadString("Ore", "OreName", RefineOreName);
  1408. }
  1409. public static void SaveRefine()
  1410. {
  1411. File.Delete(Path.Combine(ConfigPath, "RefineSystem.ini"));
  1412. InIReader reader = new InIReader(Path.Combine(ConfigPath, "RefineSystem.ini"));
  1413. reader.Write("Config", "OnlyRefineWeapon", OnlyRefineWeapon);
  1414. reader.Write("Config", "BaseChance", RefineBaseChance);
  1415. reader.Write("Config", "Time", RefineTime);
  1416. reader.Write("Config", "StatIncrease", RefineIncrease);
  1417. reader.Write("Config", "CritChance", RefineCritChance);
  1418. reader.Write("Config", "CritIncrease", RefineCritIncrease);
  1419. reader.Write("Config", "WepStatReducedChance", RefineWepStatReduce);
  1420. reader.Write("Config", "ItemStatReducedChance", RefineItemStatReduce);
  1421. reader.Write("Config", "RefineCost", RefineCost);
  1422. reader.Write("Ore", "OreName", RefineOreName);
  1423. }
  1424. public static void LoadMarriage()
  1425. {
  1426. if (!File.Exists(Path.Combine(ConfigPath, "MarriageSystem.ini")))
  1427. {
  1428. SaveMarriage();
  1429. return;
  1430. }
  1431. InIReader reader = new InIReader(Path.Combine(ConfigPath, "MarriageSystem.ini"));
  1432. LoverEXPBonus = reader.ReadInt32("Config", "EXPBonus", LoverEXPBonus);
  1433. MarriageCooldown = reader.ReadInt32("Config", "MarriageCooldown", MarriageCooldown);
  1434. WeddingRingRecall = reader.ReadBoolean("Config", "AllowLoverRecall", WeddingRingRecall);
  1435. MarriageLevelRequired = reader.ReadInt32("Config", "MinimumLevel", MarriageLevelRequired);
  1436. ReplaceWedRingCost = reader.ReadInt32("Config", "ReplaceRingCost", ReplaceWedRingCost);
  1437. }
  1438. public static void SaveMarriage()
  1439. {
  1440. File.Delete(Path.Combine(ConfigPath, "MarriageSystem.ini"));
  1441. InIReader reader = new InIReader(Path.Combine(ConfigPath, "MarriageSystem.ini"));
  1442. reader.Write("Config", "EXPBonus", LoverEXPBonus);
  1443. reader.Write("Config", "MarriageCooldown", MarriageCooldown);
  1444. reader.Write("Config", "AllowLoverRecall", WeddingRingRecall);
  1445. reader.Write("Config", "MinimumLevel", MarriageLevelRequired);
  1446. reader.Write("Config", "ReplaceRingCost", ReplaceWedRingCost);
  1447. }
  1448. public static void LoadMentor()
  1449. {
  1450. if (!File.Exists(Path.Combine(ConfigPath, "MentorSystem.ini")))
  1451. {
  1452. SaveMentor();
  1453. return;
  1454. }
  1455. InIReader reader = new InIReader(Path.Combine(ConfigPath, "MentorSystem.ini"));
  1456. MentorLevelGap = reader.ReadByte("Config", "LevelGap", MentorLevelGap);
  1457. MentorSkillBoost = reader.ReadBoolean("Config", "MenteeSkillBoost", MentorSkillBoost);
  1458. MentorLength = reader.ReadByte("Config", "MentorshipLength", MentorLength);
  1459. MentorDamageBoost = reader.ReadByte("Config", "MentorDamageBoost", MentorDamageBoost);
  1460. MentorExpBoost = reader.ReadByte("Config", "MenteeExpBoost", MentorExpBoost);
  1461. MenteeExpBank = reader.ReadByte("Config", "PercentXPtoMentor", MenteeExpBank);
  1462. }
  1463. public static void SaveMentor()
  1464. {
  1465. File.Delete(Path.Combine(ConfigPath, "MentorSystem.ini"));
  1466. InIReader reader = new InIReader(Path.Combine(ConfigPath, "MentorSystem.ini"));
  1467. reader.Write("Config", "LevelGap", MentorLevelGap);
  1468. reader.Write("Config", "MenteeSkillBoost", MentorSkillBoost);
  1469. reader.Write("Config", "MentorshipLength", MentorLength);
  1470. reader.Write("Config", "MentorDamageBoost", MentorDamageBoost);
  1471. reader.Write("Config", "MenteeExpBoost", MentorExpBoost);
  1472. reader.Write("Config", "PercentXPtoMentor", MenteeExpBank);
  1473. }
  1474. public static void LoadGem()
  1475. {
  1476. if (!File.Exists(Path.Combine(ConfigPath, "GemSystem.ini")))
  1477. {
  1478. SaveGem();
  1479. return;
  1480. }
  1481. InIReader reader = new InIReader(Path.Combine(ConfigPath, "GemSystem.ini"));
  1482. GemStatIndependent = reader.ReadBoolean("Config", "GemStatIndependent", GemStatIndependent);
  1483. }
  1484. public static void SaveGem()
  1485. {
  1486. File.Delete(Path.Combine(ConfigPath, "GemSystem.ini"));
  1487. InIReader reader = new InIReader(Path.Combine(ConfigPath, "GemSystem.ini"));
  1488. reader.Write("Config", "GemStatIndependent", GemStatIndependent);
  1489. }
  1490. public static void LoadGoods()
  1491. {
  1492. if (!File.Exists(Path.Combine(ConfigPath, "GoodsSystem.ini")))
  1493. {
  1494. SaveGoods();
  1495. return;
  1496. }
  1497. InIReader reader = new InIReader(Path.Combine(ConfigPath, "GoodsSystem.ini"));
  1498. GoodsOn = reader.ReadBoolean("Goods", "On", GoodsOn);
  1499. GoodsMaxStored = reader.ReadUInt32("Goods", "MaxStored", GoodsMaxStored);
  1500. GoodsBuyBackTime = reader.ReadUInt32("Goods", "BuyBackTime", GoodsBuyBackTime);
  1501. GoodsBuyBackMaxStored = reader.ReadUInt32("Goods", "BuyBackMaxStored", GoodsBuyBackMaxStored);
  1502. GoodsHideAddedStats = reader.ReadBoolean("Goods", "HideAddedStats", GoodsHideAddedStats);
  1503. }
  1504. public static void SaveGoods()
  1505. {
  1506. File.Delete(Path.Combine(ConfigPath, "GoodsSystem.ini"));
  1507. InIReader reader = new InIReader(Path.Combine(ConfigPath, "GoodsSystem.ini"));
  1508. reader.Write("Goods", "On", GoodsOn);
  1509. reader.Write("Goods", "MaxStored", GoodsMaxStored);
  1510. reader.Write("Goods", "BuyBackTime", GoodsBuyBackTime);
  1511. reader.Write("Goods", "BuyBackMaxStored", GoodsBuyBackMaxStored);
  1512. reader.Write("Goods", "HideAddedStats", GoodsHideAddedStats);
  1513. }
  1514. public static void LoadMonsterRarity()
  1515. {
  1516. var rarityReader = new InIReader(Path.Combine(ConfigPath, "MonsterRarity.ini"));
  1517. MonsterRarityEnabled = rarityReader.ReadBoolean("General", "Enabled", MonsterRarityEnabled);
  1518. MonsterRarityUncommonChancePercent = ReadRarityChancePercent(rarityReader, "UncommonChancePercent", MonsterRarityUncommonChancePercent);
  1519. MonsterRarityRareChancePercent = ReadRarityChancePercent(rarityReader, "RareChancePercent", MonsterRarityRareChancePercent);
  1520. MonsterRarityEliteChancePercent = ReadRarityChancePercent(rarityReader, "EliteChancePercent", MonsterRarityEliteChancePercent);
  1521. MonsterRarityUncommonHpMultiplier = rarityReader.ReadDouble("Uncommon", "HpMultiplier", MonsterRarityUncommonHpMultiplier);
  1522. MonsterRarityUncommonDefenseMultiplier = rarityReader.ReadDouble("Uncommon", "DefenseMultiplier", MonsterRarityUncommonDefenseMultiplier);
  1523. MonsterRarityUncommonDamageMultiplier = rarityReader.ReadDouble("Uncommon", "DamageMultiplier", MonsterRarityUncommonDamageMultiplier);
  1524. MonsterRarityUncommonExpMultiplier = rarityReader.ReadDouble("Uncommon", "ExpMultiplier", MonsterRarityUncommonExpMultiplier);
  1525. MonsterRarityUncommonGoldMultiplier = rarityReader.ReadDouble("Uncommon", "GoldMultiplier", MonsterRarityUncommonGoldMultiplier);
  1526. MonsterRarityUncommonItemDropBonusPercent = rarityReader.ReadInt32("Uncommon", "ItemDropBonusPercent", MonsterRarityUncommonItemDropBonusPercent);
  1527. MonsterRarityUncommonGoldDropBonusPercent = rarityReader.ReadInt32("Uncommon", "GoldDropBonusPercent", MonsterRarityUncommonGoldDropBonusPercent);
  1528. MonsterRarityRareHpMultiplier = rarityReader.ReadDouble("Rare", "HpMultiplier", MonsterRarityRareHpMultiplier);
  1529. MonsterRarityRareDefenseMultiplier = rarityReader.ReadDouble("Rare", "DefenseMultiplier", MonsterRarityRareDefenseMultiplier);
  1530. MonsterRarityRareDamageMultiplier = rarityReader.ReadDouble("Rare", "DamageMultiplier", MonsterRarityRareDamageMultiplier);
  1531. MonsterRarityRareExpMultiplier = rarityReader.ReadDouble("Rare", "ExpMultiplier", MonsterRarityRareExpMultiplier);
  1532. MonsterRarityRareGoldMultiplier = rarityReader.ReadDouble("Rare", "GoldMultiplier", MonsterRarityRareGoldMultiplier);
  1533. MonsterRarityRareItemDropBonusPercent = rarityReader.ReadInt32("Rare", "ItemDropBonusPercent", MonsterRarityRareItemDropBonusPercent);
  1534. MonsterRarityRareGoldDropBonusPercent = rarityReader.ReadInt32("Rare", "GoldDropBonusPercent", MonsterRarityRareGoldDropBonusPercent);
  1535. MonsterRarityEliteHpMultiplier = rarityReader.ReadDouble("Elite", "HpMultiplier", MonsterRarityEliteHpMultiplier);
  1536. MonsterRarityEliteDefenseMultiplier = rarityReader.ReadDouble("Elite", "DefenseMultiplier", MonsterRarityEliteDefenseMultiplier);
  1537. MonsterRarityEliteDamageMultiplier = rarityReader.ReadDouble("Elite", "DamageMultiplier", MonsterRarityEliteDamageMultiplier);
  1538. MonsterRarityEliteExpMultiplier = rarityReader.ReadDouble("Elite", "ExpMultiplier", MonsterRarityEliteExpMultiplier);
  1539. MonsterRarityEliteGoldMultiplier = rarityReader.ReadDouble("Elite", "GoldMultiplier", MonsterRarityEliteGoldMultiplier);
  1540. MonsterRarityEliteItemDropBonusPercent = rarityReader.ReadInt32("Elite", "ItemDropBonusPercent", MonsterRarityEliteItemDropBonusPercent);
  1541. MonsterRarityEliteGoldDropBonusPercent = rarityReader.ReadInt32("Elite", "GoldDropBonusPercent", MonsterRarityEliteGoldDropBonusPercent);
  1542. MonsterRarityData.SetEnabled(MonsterRarityEnabled);
  1543. MonsterRarityData.Configure(MonsterRarityUncommonChancePercent, MonsterRarityRareChancePercent, MonsterRarityEliteChancePercent);
  1544. var overrides = new Dictionary<MonsterType, MonsterRarityProfile>
  1545. {
  1546. [MonsterType.Uncommon] = new MonsterRarityProfile
  1547. {
  1548. HpMultiplier = MonsterRarityUncommonHpMultiplier,
  1549. DefenseMultiplier = MonsterRarityUncommonDefenseMultiplier,
  1550. DamageMultiplier = MonsterRarityUncommonDamageMultiplier,
  1551. ExpMultiplier = MonsterRarityUncommonExpMultiplier,
  1552. GoldMultiplier = MonsterRarityUncommonGoldMultiplier,
  1553. ItemDropBonusPercent = MonsterRarityUncommonItemDropBonusPercent,
  1554. GoldDropBonusPercent = MonsterRarityUncommonGoldDropBonusPercent,
  1555. NameColour = MonsterRarityData.GetProfile(MonsterType.Uncommon).NameColour
  1556. },
  1557. [MonsterType.Rare] = new MonsterRarityProfile
  1558. {
  1559. HpMultiplier = MonsterRarityRareHpMultiplier,
  1560. DefenseMultiplier = MonsterRarityRareDefenseMultiplier,
  1561. DamageMultiplier = MonsterRarityRareDamageMultiplier,
  1562. ExpMultiplier = MonsterRarityRareExpMultiplier,
  1563. GoldMultiplier = MonsterRarityRareGoldMultiplier,
  1564. ItemDropBonusPercent = MonsterRarityRareItemDropBonusPercent,
  1565. GoldDropBonusPercent = MonsterRarityRareGoldDropBonusPercent,
  1566. NameColour = MonsterRarityData.GetProfile(MonsterType.Rare).NameColour
  1567. },
  1568. [MonsterType.Elite] = new MonsterRarityProfile
  1569. {
  1570. HpMultiplier = MonsterRarityEliteHpMultiplier,
  1571. DefenseMultiplier = MonsterRarityEliteDefenseMultiplier,
  1572. DamageMultiplier = MonsterRarityEliteDamageMultiplier,
  1573. ExpMultiplier = MonsterRarityEliteExpMultiplier,
  1574. GoldMultiplier = MonsterRarityEliteGoldMultiplier,
  1575. ItemDropBonusPercent = MonsterRarityEliteItemDropBonusPercent,
  1576. GoldDropBonusPercent = MonsterRarityEliteGoldDropBonusPercent,
  1577. NameColour = MonsterRarityData.GetProfile(MonsterType.Elite).NameColour
  1578. }
  1579. };
  1580. MonsterRarityData.ConfigureProfiles(overrides);
  1581. }
  1582. private static double ReadRarityChancePercent(InIReader reader, string percentKey, double defaultPercent)
  1583. {
  1584. double percent = reader.ReadDouble("General", percentKey, defaultPercent, false);
  1585. if (percent < 0) return 0;
  1586. if (percent > 100) return 100;
  1587. return percent;
  1588. }
  1589. }
  1590. }