ClientData.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. using System.Drawing;
  2. public class ClientMagic
  3. {
  4. public string Name;
  5. public Spell Spell;
  6. public byte BaseCost, LevelCost, Icon;
  7. public byte Level1, Level2, Level3;
  8. public ushort Need1, Need2, Need3;
  9. public byte Level, Key, Range;
  10. public ushort Experience;
  11. public bool IsTempSpell;
  12. public long CastTime, Delay;
  13. public ClientMagic() { }
  14. public ClientMagic(BinaryReader reader)
  15. {
  16. Name = reader.ReadString();
  17. Spell = (Spell)reader.ReadByte();
  18. BaseCost = reader.ReadByte();
  19. LevelCost = reader.ReadByte();
  20. Icon = reader.ReadByte();
  21. Level1 = reader.ReadByte();
  22. Level2 = reader.ReadByte();
  23. Level3 = reader.ReadByte();
  24. Need1 = reader.ReadUInt16();
  25. Need2 = reader.ReadUInt16();
  26. Need3 = reader.ReadUInt16();
  27. Level = reader.ReadByte();
  28. Key = reader.ReadByte();
  29. Experience = reader.ReadUInt16();
  30. Delay = reader.ReadInt64();
  31. Range = reader.ReadByte();
  32. CastTime = reader.ReadInt64();
  33. }
  34. public void Save(BinaryWriter writer)
  35. {
  36. writer.Write(Name);
  37. writer.Write((byte)Spell);
  38. writer.Write(BaseCost);
  39. writer.Write(LevelCost);
  40. writer.Write(Icon);
  41. writer.Write(Level1);
  42. writer.Write(Level2);
  43. writer.Write(Level3);
  44. writer.Write(Need1);
  45. writer.Write(Need2);
  46. writer.Write(Need3);
  47. writer.Write(Level);
  48. writer.Write(Key);
  49. writer.Write(Experience);
  50. writer.Write(Delay);
  51. writer.Write(Range);
  52. writer.Write(CastTime);
  53. }
  54. }
  55. public class ClientRecipeInfo
  56. {
  57. public uint Gold;
  58. public byte Chance;
  59. public UserItem Item;
  60. public List<UserItem> Tools = new List<UserItem>();
  61. public List<UserItem> Ingredients = new List<UserItem>();
  62. public ClientRecipeInfo() { }
  63. public ClientRecipeInfo(BinaryReader reader)
  64. {
  65. Gold = reader.ReadUInt32();
  66. Chance = reader.ReadByte();
  67. Item = new UserItem(reader);
  68. int count = reader.ReadInt32();
  69. for (int i = 0; i < count; i++)
  70. {
  71. Tools.Add(new UserItem(reader));
  72. }
  73. count = reader.ReadInt32();
  74. for (int i = 0; i < count; i++)
  75. {
  76. Ingredients.Add(new UserItem(reader));
  77. }
  78. }
  79. public void Save(BinaryWriter writer)
  80. {
  81. writer.Write(Gold);
  82. writer.Write(Chance);
  83. Item.Save(writer);
  84. writer.Write(Tools.Count);
  85. foreach (var tool in Tools)
  86. {
  87. tool.Save(writer);
  88. }
  89. writer.Write(Ingredients.Count);
  90. foreach (var ingredient in Ingredients)
  91. {
  92. ingredient.Save(writer);
  93. }
  94. }
  95. }
  96. public class ClientFriend
  97. {
  98. public int Index;
  99. public string Name;
  100. public string Memo = "";
  101. public bool Blocked;
  102. public bool Online;
  103. public ClientFriend() { }
  104. public ClientFriend(BinaryReader reader)
  105. {
  106. Index = reader.ReadInt32();
  107. Name = reader.ReadString();
  108. Memo = reader.ReadString();
  109. Blocked = reader.ReadBoolean();
  110. Online = reader.ReadBoolean();
  111. }
  112. public void Save(BinaryWriter writer)
  113. {
  114. writer.Write(Index);
  115. writer.Write(Name);
  116. writer.Write(Memo);
  117. writer.Write(Blocked);
  118. writer.Write(Online);
  119. }
  120. }
  121. public class ClientMail
  122. {
  123. public ulong MailID;
  124. public string SenderName;
  125. public string Message;
  126. public bool Opened, Locked, CanReply, Collected;
  127. public DateTime DateSent;
  128. public uint Gold;
  129. public List<UserItem> Items = new List<UserItem>();
  130. public ClientMail() { }
  131. public ClientMail(BinaryReader reader)
  132. {
  133. MailID = reader.ReadUInt64();
  134. SenderName = reader.ReadString();
  135. Message = reader.ReadString();
  136. Opened = reader.ReadBoolean();
  137. Locked = reader.ReadBoolean();
  138. CanReply = reader.ReadBoolean();
  139. Collected = reader.ReadBoolean();
  140. DateSent = DateTime.FromBinary(reader.ReadInt64());
  141. Gold = reader.ReadUInt32();
  142. int count = reader.ReadInt32();
  143. for (int i = 0; i < count; i++)
  144. Items.Add(new UserItem(reader));
  145. }
  146. public void Save(BinaryWriter writer)
  147. {
  148. writer.Write(MailID);
  149. writer.Write(SenderName);
  150. writer.Write(Message);
  151. writer.Write(Opened);
  152. writer.Write(Locked);
  153. writer.Write(CanReply);
  154. writer.Write(Collected);
  155. writer.Write(DateSent.ToBinary());
  156. writer.Write(Gold);
  157. writer.Write(Items.Count);
  158. for (int i = 0; i < Items.Count; i++)
  159. Items[i].Save(writer);
  160. }
  161. }
  162. public class ClientAuction
  163. {
  164. public ulong AuctionID;
  165. public UserItem Item;
  166. public string Seller = string.Empty;
  167. public uint Price;
  168. public DateTime ConsignmentDate = DateTime.MinValue;
  169. public MarketItemType ItemType;
  170. public ClientAuction() { }
  171. public ClientAuction(BinaryReader reader)
  172. {
  173. AuctionID = reader.ReadUInt64();
  174. Item = new UserItem(reader);
  175. Seller = reader.ReadString();
  176. Price = reader.ReadUInt32();
  177. ConsignmentDate = DateTime.FromBinary(reader.ReadInt64());
  178. ItemType = (MarketItemType)reader.ReadByte();
  179. }
  180. public void Save(BinaryWriter writer)
  181. {
  182. writer.Write(AuctionID);
  183. Item.Save(writer);
  184. writer.Write(Seller);
  185. writer.Write(Price);
  186. writer.Write(ConsignmentDate.ToBinary());
  187. writer.Write((byte)ItemType);
  188. }
  189. }
  190. public class ClientMovementInfo
  191. {
  192. public int Destination;
  193. public string Title;
  194. public Point Location;
  195. public int Icon;
  196. public ClientMovementInfo() { }
  197. public ClientMovementInfo(BinaryReader reader)
  198. {
  199. Destination = reader.ReadInt32();
  200. Title = reader.ReadString();
  201. Location = new Point(reader.ReadInt32(), reader.ReadInt32());
  202. Icon = reader.ReadInt32();
  203. }
  204. public void Save(BinaryWriter writer)
  205. {
  206. writer.Write(Destination);
  207. writer.Write(Title);
  208. writer.Write(Location.X);
  209. writer.Write(Location.Y);
  210. writer.Write(Icon);
  211. }
  212. }
  213. public class ClientNPCInfo
  214. {
  215. public uint ObjectID;
  216. public int Icon;
  217. // For NPC tooltips and linking
  218. public int Index;
  219. public string FileName = string.Empty;
  220. public string Name = string.Empty;
  221. public int MapIndex;
  222. public Point Location;
  223. public ushort Rate;
  224. public ushort Image;
  225. public bool ShowOnBigMap;
  226. public int BigMapIcon;
  227. public bool CanTeleportTo;
  228. public ClientNPCInfo() { }
  229. public ClientNPCInfo(BinaryReader reader)
  230. {
  231. Index = reader.ReadInt32();
  232. FileName = reader.ReadString();
  233. Name = reader.ReadString();
  234. MapIndex = reader.ReadInt32();
  235. Location = new Point(reader.ReadInt32(), reader.ReadInt32());
  236. Image = reader.ReadUInt16();
  237. Rate = reader.ReadUInt16();
  238. ShowOnBigMap = reader.ReadBoolean();
  239. BigMapIcon = reader.ReadInt32();
  240. ObjectID = reader.ReadUInt32();
  241. Icon = reader.ReadInt32();
  242. CanTeleportTo = reader.ReadBoolean();
  243. if (Icon == 0 && BigMapIcon != 0)
  244. Icon = BigMapIcon;
  245. }
  246. public void Save(BinaryWriter writer)
  247. {
  248. writer.Write(Index);
  249. writer.Write(FileName ?? string.Empty);
  250. writer.Write(Name ?? string.Empty);
  251. writer.Write(MapIndex);
  252. writer.Write(Location.X);
  253. writer.Write(Location.Y);
  254. writer.Write(Image);
  255. writer.Write(Rate);
  256. writer.Write(ShowOnBigMap);
  257. writer.Write(BigMapIcon);
  258. writer.Write(ObjectID);
  259. writer.Write(Icon);
  260. writer.Write(CanTeleportTo);
  261. }
  262. }
  263. public class ClientMapInfo
  264. {
  265. public int Width;
  266. public int Height;
  267. public int BigMap;
  268. public string Title;
  269. public List<ClientMovementInfo> Movements = new List<ClientMovementInfo>();
  270. public List<ClientNPCInfo> NPCs = new List<ClientNPCInfo>();
  271. public ClientMapInfo() { }
  272. public ClientMapInfo(BinaryReader reader)
  273. {
  274. Title = reader.ReadString();
  275. Width = reader.ReadInt32();
  276. Height = reader.ReadInt32();
  277. BigMap = reader.ReadInt32();
  278. var count = reader.ReadInt32();
  279. for (int i = 0; i < count; i++)
  280. Movements.Add(new ClientMovementInfo(reader));
  281. count = reader.ReadInt32();
  282. for (int i = 0; i < count; i++)
  283. NPCs.Add(new ClientNPCInfo(reader));
  284. }
  285. public void Save(BinaryWriter writer)
  286. {
  287. writer.Write(Title);
  288. writer.Write(Width);
  289. writer.Write(Height);
  290. writer.Write(BigMap);
  291. writer.Write(Movements.Count);
  292. for (int i = 0; i < Movements.Count; i++)
  293. Movements[i].Save(writer);
  294. writer.Write(NPCs.Count);
  295. for (int i = 0; i < NPCs.Count; i++)
  296. NPCs[i].Save(writer);
  297. }
  298. }
  299. public class ClientQuestInfo
  300. {
  301. public int Index;
  302. public uint NPCIndex;
  303. public string Name, Group;
  304. public List<string> Description = new List<string>();
  305. public List<string> TaskDescription = new List<string>();
  306. public List<string> ReturnDescription = new List<string>();
  307. public List<string> CompletionDescription = new List<string>();
  308. public int MinLevelNeeded, MaxLevelNeeded;
  309. public int QuestNeeded;
  310. public RequiredClass ClassNeeded;
  311. public QuestType Type;
  312. public int TimeLimitInSeconds = 0;
  313. public uint RewardGold;
  314. public uint RewardExp;
  315. public uint RewardCredit;
  316. public List<QuestItemReward> RewardsFixedItem = new List<QuestItemReward>();
  317. public List<QuestItemReward> RewardsSelectItem = new List<QuestItemReward>();
  318. public uint FinishNPCIndex;
  319. public bool SameFinishNPC
  320. {
  321. get { return NPCIndex == FinishNPCIndex; }
  322. }
  323. public ClientQuestInfo() { }
  324. public ClientQuestInfo(BinaryReader reader)
  325. {
  326. Index = reader.ReadInt32();
  327. NPCIndex = reader.ReadUInt32();
  328. Name = reader.ReadString();
  329. Group = reader.ReadString();
  330. int count = reader.ReadInt32();
  331. for (int i = 0; i < count; i++)
  332. Description.Add(reader.ReadString());
  333. count = reader.ReadInt32();
  334. for (int i = 0; i < count; i++)
  335. TaskDescription.Add(reader.ReadString());
  336. count = reader.ReadInt32();
  337. for (int i = 0; i < count; i++)
  338. ReturnDescription.Add(reader.ReadString());
  339. count = reader.ReadInt32();
  340. for (int i = 0; i < count; i++)
  341. CompletionDescription.Add(reader.ReadString());
  342. MinLevelNeeded = reader.ReadInt32();
  343. MaxLevelNeeded = reader.ReadInt32();
  344. QuestNeeded = reader.ReadInt32();
  345. ClassNeeded = (RequiredClass)reader.ReadByte();
  346. Type = (QuestType)reader.ReadByte();
  347. TimeLimitInSeconds = reader.ReadInt32();
  348. RewardGold = reader.ReadUInt32();
  349. RewardExp = reader.ReadUInt32();
  350. RewardCredit = reader.ReadUInt32();
  351. count = reader.ReadInt32();
  352. for (int i = 0; i < count; i++)
  353. RewardsFixedItem.Add(new QuestItemReward(reader));
  354. count = reader.ReadInt32();
  355. for (int i = 0; i < count; i++)
  356. RewardsSelectItem.Add(new QuestItemReward(reader));
  357. FinishNPCIndex = reader.ReadUInt32();
  358. }
  359. public void Save(BinaryWriter writer)
  360. {
  361. writer.Write(Index);
  362. writer.Write(NPCIndex);
  363. writer.Write(Name);
  364. writer.Write(Group);
  365. writer.Write(Description.Count);
  366. for (int i = 0; i < Description.Count; i++)
  367. writer.Write(Description[i]);
  368. writer.Write(TaskDescription.Count);
  369. for (int i = 0; i < TaskDescription.Count; i++)
  370. writer.Write(TaskDescription[i]);
  371. writer.Write(ReturnDescription.Count);
  372. for (int i = 0; i < ReturnDescription.Count; i++)
  373. writer.Write(ReturnDescription[i]);
  374. writer.Write(CompletionDescription.Count);
  375. for (int i = 0; i < CompletionDescription.Count; i++)
  376. writer.Write(CompletionDescription[i]);
  377. writer.Write(MinLevelNeeded);
  378. writer.Write(MaxLevelNeeded);
  379. writer.Write(QuestNeeded);
  380. writer.Write((byte)ClassNeeded);
  381. writer.Write((byte)Type);
  382. writer.Write(TimeLimitInSeconds);
  383. writer.Write(RewardGold);
  384. writer.Write(RewardExp);
  385. writer.Write(RewardCredit);
  386. writer.Write(RewardsFixedItem.Count);
  387. for (int i = 0; i < RewardsFixedItem.Count; i++)
  388. RewardsFixedItem[i].Save(writer);
  389. writer.Write(RewardsSelectItem.Count);
  390. for (int i = 0; i < RewardsSelectItem.Count; i++)
  391. RewardsSelectItem[i].Save(writer);
  392. writer.Write(FinishNPCIndex);
  393. }
  394. public QuestIcon GetQuestIcon(bool taken = false, bool completed = false)
  395. {
  396. QuestIcon icon = QuestIcon.None;
  397. switch (Type)
  398. {
  399. case QuestType.General:
  400. case QuestType.Repeatable:
  401. if (completed)
  402. icon = QuestIcon.QuestionYellow;
  403. else if (taken)
  404. icon = QuestIcon.QuestionWhite;
  405. else
  406. icon = QuestIcon.ExclamationYellow;
  407. break;
  408. case QuestType.Daily:
  409. if (completed)
  410. icon = QuestIcon.QuestionBlue;
  411. else if (taken)
  412. icon = QuestIcon.QuestionWhite;
  413. else
  414. icon = QuestIcon.ExclamationBlue;
  415. break;
  416. case QuestType.Story:
  417. if (completed)
  418. icon = QuestIcon.QuestionGreen;
  419. else if (taken)
  420. icon = QuestIcon.QuestionWhite;
  421. else
  422. icon = QuestIcon.ExclamationGreen;
  423. break;
  424. }
  425. return icon;
  426. }
  427. }
  428. public class ClientQuestProgress
  429. {
  430. public int Id;
  431. public ClientQuestInfo QuestInfo;
  432. public List<string> TaskList = new List<string>();
  433. public bool Taken;
  434. public bool Completed;
  435. public bool New;
  436. public QuestIcon Icon
  437. {
  438. get
  439. {
  440. return QuestInfo.GetQuestIcon(Taken, Completed);
  441. }
  442. }
  443. public ClientQuestProgress() { }
  444. public ClientQuestProgress(BinaryReader reader)
  445. {
  446. Id = reader.ReadInt32();
  447. int count = reader.ReadInt32();
  448. for (int i = 0; i < count; i++)
  449. TaskList.Add(reader.ReadString());
  450. Taken = reader.ReadBoolean();
  451. Completed = reader.ReadBoolean();
  452. New = reader.ReadBoolean();
  453. }
  454. public void Save(BinaryWriter writer)
  455. {
  456. writer.Write(Id);
  457. writer.Write(TaskList.Count);
  458. for (int i = 0; i < TaskList.Count; i++)
  459. writer.Write(TaskList[i]);
  460. writer.Write(Taken);
  461. writer.Write(Completed);
  462. writer.Write(New);
  463. }
  464. }
  465. public class ClientBuff
  466. {
  467. public BuffType Type;
  468. public string Caster;
  469. public bool Visible;
  470. public uint ObjectID;
  471. public long ExpireTime;
  472. public bool Infinite;
  473. public Stats Stats;
  474. public bool Paused;
  475. public int[] Values;
  476. public ClientBuff()
  477. {
  478. Stats = new Stats();
  479. }
  480. public ClientBuff(BinaryReader reader)
  481. {
  482. Caster = null;
  483. Type = (BuffType)reader.ReadByte();
  484. Visible = reader.ReadBoolean();
  485. ObjectID = reader.ReadUInt32();
  486. ExpireTime = reader.ReadInt64();
  487. Infinite = reader.ReadBoolean();
  488. Paused = reader.ReadBoolean();
  489. Stats = new Stats(reader);
  490. int count = reader.ReadInt32();
  491. Values = new int[count];
  492. for (int i = 0; i < count; i++)
  493. {
  494. Values[i] = reader.ReadInt32();
  495. }
  496. }
  497. public void Save(BinaryWriter writer)
  498. {
  499. writer.Write((byte)Type);
  500. writer.Write(Visible);
  501. writer.Write(ObjectID);
  502. writer.Write(ExpireTime);
  503. writer.Write(Infinite);
  504. writer.Write(Paused);
  505. Stats.Save(writer);
  506. writer.Write(Values.Length);
  507. for (int i = 0; i < Values.Length; i++)
  508. {
  509. writer.Write(Values[i]);
  510. }
  511. }
  512. }
  513. public class ClientHeroInformation
  514. {
  515. public int Index;
  516. public string Name;
  517. public ushort Level;
  518. public MirClass Class;
  519. public MirGender Gender;
  520. public ClientHeroInformation() { }
  521. public ClientHeroInformation(BinaryReader reader)
  522. {
  523. Index = reader.ReadInt32();
  524. Name = reader.ReadString();
  525. Level = reader.ReadUInt16();
  526. Class = (MirClass)reader.ReadByte();
  527. Gender = (MirGender)reader.ReadByte();
  528. }
  529. public void Save(BinaryWriter writer)
  530. {
  531. writer.Write(Index);
  532. writer.Write(Name);
  533. writer.Write(Level);
  534. writer.Write((byte)Class);
  535. writer.Write((byte)Gender);
  536. }
  537. public override string ToString()
  538. {
  539. string text = Name;
  540. text += Environment.NewLine + $"Level {Level} {Enum.GetName(typeof(MirGender), Gender).ToLower()} {Enum.GetName(typeof(MirClass), Class).ToLower()}";
  541. return text;
  542. }
  543. }