PlayerInfoForm.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. using Server.MirDatabase;
  2. using Server.MirEnvir;
  3. using Server.MirObjects;
  4. using System.Diagnostics;
  5. using System.Drawing.Text;
  6. using System.Numerics;
  7. namespace Server
  8. {
  9. public partial class PlayerInfoForm : Form
  10. {
  11. CharacterInfo Character = null;
  12. public PlayerInfoForm()
  13. {
  14. InitializeComponent();
  15. }
  16. public PlayerInfoForm(uint playerId)
  17. {
  18. InitializeComponent();
  19. PlayerObject player = SMain.Envir.GetPlayer(playerId);
  20. if (player == null)
  21. {
  22. Close();
  23. return;
  24. }
  25. Character = SMain.Envir.GetCharacterInfo(player.Name);
  26. UpdateTabs();
  27. }
  28. #region PlayerInfo
  29. private void UpdatePlayerInfo()
  30. {
  31. IndexTextBox.Text = Character.Index.ToString();
  32. NameTextBox.Text = Character.Name;
  33. LevelTextBox.Text = Character.Level.ToString();
  34. PKPointsTextBox.Text = Character.PKPoints.ToString();
  35. GoldTextBox.Text = $"{Character.AccountInfo.Gold:n0}";
  36. GameGoldTextBox.Text = String.Format("{0:n0}", Character.AccountInfo.Credit);
  37. if (Character?.Player != null)
  38. {
  39. CurrentMapLabel.Text = $"{Character.Player.CurrentMap.Info.Title} / {Character.Player.CurrentMap.Info.FileName}";
  40. CurrentXY.Text = $"X:{Character.CurrentLocation.X}: Y:{Character.CurrentLocation.Y}";
  41. ExpTextBox.Text = $"{string.Format("{0:#0.##%}", Character.Player.Experience / (double)Character.Player.MaxExperience)}";
  42. ACBox.Text = $"{Character.Player.Stats[Stat.MinAC]}-{Character.Player.Stats[Stat.MaxAC]}";
  43. AMCBox.Text = $"{Character.Player.Stats[Stat.MinMAC]}-{Character.Player.Stats[Stat.MaxMAC]}";
  44. DCBox.Text = $"{Character.Player.Stats[Stat.MinDC]}-{Character.Player.Stats[Stat.MaxDC]}";
  45. MCBox.Text = $"{Character.Player.Stats[Stat.MinMC]}-{Character.Player.Stats[Stat.MaxMC]}";
  46. SCBox.Text = $"{Character.Player.Stats[Stat.MinSC]}-{Character.Player.Stats[Stat.MaxSC]}";
  47. ACCBox.Text = $"{Character.Player.Stats[Stat.Accuracy]}";
  48. AGILBox.Text = $"{Character.Player.Stats[Stat.Agility]}";
  49. ATKSPDBox.Text = $"{Character.Player.Stats[Stat.AttackSpeed]}";
  50. }
  51. else
  52. {
  53. CurrentMapLabel.Text = "OFFLINE";
  54. CurrentXY.Text = "OFFLINE";
  55. }
  56. CurrentIPLabel.Text = Character.AccountInfo.LastIP;
  57. OnlineTimeLabel.Text = Character.LastLoginDate > Character.LastLogoutDate ? (SMain.Envir.Now - Character.LastLoginDate).TotalMinutes.ToString("##") + " minutes" : "Offline";
  58. ChatBanExpiryTextBox.Text = Character.ChatBanExpiryDate.ToString();
  59. }
  60. #endregion
  61. #region PlayerPets
  62. private void UpdatePetInfo()
  63. {
  64. ClearPetInfo();
  65. if (Character?.Player == null) return;
  66. foreach (MonsterObject Pet in Character.Player.Pets)
  67. {
  68. var listItem = new ListViewItem(Pet.Name) { Tag = Pet };
  69. listItem.SubItems.Add(Pet.PetLevel.ToString());
  70. listItem.SubItems.Add($"{Pet.Health}/{Pet.MaxHealth}");
  71. listItem.SubItems.Add($"Map: {Pet.CurrentMap.Info.Title}, X: {Pet.CurrentLocation.X}, Y: {Pet.CurrentLocation.Y}");
  72. PetView.Items.Add(listItem);
  73. }
  74. }
  75. private void ClearPetInfo()
  76. {
  77. PetView.Items.Clear();
  78. }
  79. #endregion
  80. #region PlayerMagics
  81. private void UpdatePlayerMagics()
  82. {
  83. MagicListViewNF.Items.Clear();
  84. for (int i = 0; i < Character.Magics.Count; i++)
  85. {
  86. UserMagic magic = Character.Magics[i];
  87. if (magic == null) continue;
  88. ListViewItem ListItem = new ListViewItem(magic.Info.Name.ToString()) { Tag = this };
  89. ListItem.SubItems.Add(magic.Level.ToString());
  90. switch (magic.Level)
  91. {
  92. case 0:
  93. ListItem.SubItems.Add($"{magic.Experience}/{magic.Info.Need1}");
  94. break;
  95. case 1:
  96. ListItem.SubItems.Add($"{magic.Experience}/{magic.Info.Need2}");
  97. break;
  98. case 2:
  99. ListItem.SubItems.Add($"{magic.Experience}/{magic.Info.Need3}");
  100. break;
  101. case 3:
  102. ListItem.SubItems.Add($"-");
  103. break;
  104. }
  105. if (magic.Key > 8)
  106. {
  107. var key = magic.Key % 8;
  108. ListItem.SubItems.Add(string.Format("CTRL+F{0}", key != 0 ? key : 8));
  109. }
  110. else if (magic.Key > 0)
  111. {
  112. ListItem.SubItems.Add(string.Format("F{0}", magic.Key));
  113. }
  114. else if (magic.Key == 0)
  115. {
  116. ListItem.SubItems.Add(string.Format("No Key", magic.Key));
  117. }
  118. ListItem.SubItems.Add(magic.Key.ToString());
  119. MagicListViewNF.Items.Add(ListItem);
  120. }
  121. }
  122. #endregion
  123. #region PlayerQuests
  124. private void UpdatePlayerQuests()
  125. {
  126. QuestInfoListViewNF.Items.Clear();
  127. foreach (int completedQuestID in Character.CompletedQuests)
  128. {
  129. QuestInfo completedQuest = SMain.Envir.GetQuestInfo(completedQuestID);
  130. ListViewItem item = new ListViewItem(completedQuestID.ToString());
  131. item.SubItems.Add("Completed");
  132. item.SubItems.Add(completedQuest.Name.ToString());
  133. QuestInfoListViewNF.Items.Add(item);
  134. }
  135. foreach (QuestProgressInfo currentQuest in Character.CurrentQuests)
  136. {
  137. ListViewItem item = new ListViewItem(currentQuest.Index.ToString());
  138. item.SubItems.Add("In Progress");
  139. item.SubItems.Add(currentQuest.Info.Name.ToString());
  140. QuestInfoListViewNF.Items.Add(item);
  141. }
  142. }
  143. #endregion
  144. #region PlayerItems
  145. private void UpdatePlayerItems()
  146. {
  147. PlayerItemInfoListViewNF.Items.Clear();
  148. if (Character == null) return;
  149. for (int i = 0; i < Character.Inventory.Length; i++)
  150. {
  151. UserItem inventoryItem = Character.Inventory[i];
  152. if (inventoryItem == null) continue;
  153. ListViewItem inventoryItemListItem = new ListViewItem($"{inventoryItem.UniqueID}");
  154. if (i < 6)
  155. {
  156. inventoryItemListItem.SubItems.Add($"Belt | Slot: [{i + 1}]");
  157. }
  158. else if (i >= 6 && i < 46)
  159. {
  160. inventoryItemListItem.SubItems.Add($"Inventory Bag I | Slot: [{i - 5}]");
  161. }
  162. else
  163. {
  164. inventoryItemListItem.SubItems.Add($"Inventory Bag II | Slot: [{i - 45}]");
  165. }
  166. inventoryItemListItem.SubItems.Add($"{inventoryItem.FriendlyName}");
  167. inventoryItemListItem.SubItems.Add($"{inventoryItem.Count}/{inventoryItem.Info.StackSize}");
  168. inventoryItemListItem.SubItems.Add($"{inventoryItem.CurrentDura}/{inventoryItem.MaxDura}");
  169. PlayerItemInfoListViewNF.Items.Add(inventoryItemListItem);
  170. }
  171. for (int i = 0; i < Character.QuestInventory.Length; i++)
  172. {
  173. UserItem questItem = Character.QuestInventory[i];
  174. if (questItem == null) continue;
  175. ListViewItem questItemListItem = new ListViewItem($"{questItem.UniqueID}");
  176. questItemListItem.SubItems.Add($"Quest Bag | Slot: [{i + 1}]");
  177. questItemListItem.SubItems.Add($"{questItem.FriendlyName}");
  178. questItemListItem.SubItems.Add($"{questItem.Count}/{questItem.Info.StackSize}");
  179. questItemListItem.SubItems.Add($"{questItem.CurrentDura}/{questItem.MaxDura}");
  180. PlayerItemInfoListViewNF.Items.Add(questItemListItem);
  181. }
  182. for (int i = 0; i < Character.AccountInfo.Storage.Length; i++)
  183. {
  184. UserItem storeItem = Character.AccountInfo.Storage[i];
  185. if (storeItem == null) continue;
  186. ListViewItem storeItemListItem = new ListViewItem($"{storeItem.UniqueID}");
  187. if (i < 80)
  188. {
  189. storeItemListItem.SubItems.Add($"Storage I | Slot: [{i + 1}]");
  190. }
  191. else
  192. {
  193. storeItemListItem.SubItems.Add($"Storage II | Slot: [{i - 79}]");
  194. }
  195. storeItemListItem.SubItems.Add($"{storeItem.FriendlyName}");
  196. storeItemListItem.SubItems.Add($"{storeItem.Count}/{storeItem.Info.StackSize}");
  197. storeItemListItem.SubItems.Add($"{storeItem.CurrentDura}/{storeItem.MaxDura}");
  198. PlayerItemInfoListViewNF.Items.Add(storeItemListItem);
  199. }
  200. for (int i = 0; i < Character.Equipment.Length; i++)
  201. {
  202. UserItem equipItem = Character.Equipment[i];
  203. if (equipItem == null) continue;
  204. ListViewItem equipItemListItem = new ListViewItem($"{equipItem.UniqueID}");
  205. equipItemListItem.SubItems.Add($"Equipment | Slot: [{i + 1}]");
  206. equipItemListItem.SubItems.Add($"{equipItem.FriendlyName}");
  207. equipItemListItem.SubItems.Add($"{equipItem.Count}/{equipItem.Info.StackSize}");
  208. equipItemListItem.SubItems.Add($"{equipItem.CurrentDura}/{equipItem.MaxDura}");
  209. PlayerItemInfoListViewNF.Items.Add(equipItemListItem);
  210. }
  211. }
  212. #endregion
  213. #region Buttons
  214. private void UpdateButton_Click(object sender, EventArgs e)
  215. {
  216. if (MessageBox.Show("Are you sure you want to Update?", "Update.", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning) != DialogResult.Yes) return;
  217. SaveChanges();
  218. }
  219. private void SaveChanges()
  220. {
  221. CharacterInfo info = Character;
  222. string tempGold = GoldTextBox.Text.Replace(",", "");
  223. string tempCredit = GameGoldTextBox.Text.Replace(",", "");
  224. info.Name = NameTextBox.Text;
  225. info.Level = Convert.ToByte(LevelTextBox.Text);
  226. info.PKPoints = Convert.ToInt32(PKPointsTextBox.Text);
  227. info.AccountInfo.Gold = Convert.ToUInt32(tempGold);
  228. info.AccountInfo.Credit = Convert.ToUInt32(tempCredit);
  229. UpdateTabs();
  230. }
  231. private void SendMessageButton_Click(object sender, EventArgs e)
  232. {
  233. if (Character?.Player == null) return;
  234. if (SendMessageTextBox.Text.Length < 1) return;
  235. Character.Player.ReceiveChat(SendMessageTextBox.Text, ChatType.Announcement);
  236. }
  237. private void KickButton_Click(object sender, EventArgs e)
  238. {
  239. if (Character?.Player == null) return;
  240. Character.Player.Connection.SendDisconnect(4);
  241. //also update account so player can't log back in for x minutes?
  242. }
  243. private void KillButton_Click(object sender, EventArgs e)
  244. {
  245. if (Character?.Player == null) return;
  246. Character.Player.Die();
  247. }
  248. private void KillPetsButton_Click(object sender, EventArgs e)
  249. {
  250. if (Character?.Player == null) return;
  251. for (int i = Character.Player.Pets.Count - 1; i >= 0; i--)
  252. Character.Player.Pets[i].Die();
  253. ClearPetInfo();
  254. }
  255. private void SafeZoneButton_Click(object sender, EventArgs e)
  256. {
  257. if (Character?.Player == null) return;
  258. Character.Player.Teleport(SMain.Envir.GetMap(Character.BindMapIndex), Character.BindLocation);
  259. }
  260. private void ChatBanButton_Click(object sender, EventArgs e)
  261. {
  262. if (Character?.Player == null) return;
  263. if (Character.AccountInfo.AdminAccount) return;
  264. Character.ChatBanned = true;
  265. DateTime date;
  266. DateTime.TryParse(ChatBanExpiryTextBox.Text, out date);
  267. Character.ChatBanExpiryDate = date;
  268. }
  269. private void ChatBanExpiryTextBox_TextChanged(object sender, EventArgs e)
  270. {
  271. if (ActiveControl != sender) return;
  272. DateTime temp;
  273. if (!DateTime.TryParse(ActiveControl.Text, out temp))
  274. {
  275. ActiveControl.BackColor = Color.Red;
  276. return;
  277. }
  278. ActiveControl.BackColor = SystemColors.Window;
  279. }
  280. private void OpenAccountButton_Click(object sender, EventArgs e)
  281. {
  282. string accountId = Character.AccountInfo.AccountID;
  283. AccountInfoForm form = new AccountInfoForm(accountId, true);
  284. form.ShowDialog();
  285. }
  286. private void CurrentIPLabel_Click(object sender, EventArgs e)
  287. {
  288. string ipAddress = CurrentIPLabel.Text;
  289. string url = $"https://whatismyipaddress.com/ip/{ipAddress}";
  290. try
  291. {
  292. System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(url)
  293. {
  294. UseShellExecute = true
  295. });
  296. CurrentIPLabel.ForeColor = Color.Blue;
  297. }
  298. catch (Exception ex)
  299. {
  300. MessageBox.Show($"Error opening URL: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  301. }
  302. }
  303. private void AccountBanButton_Click(object sender, EventArgs e)
  304. {
  305. if (Character.AccountInfo.AdminAccount) return;
  306. Character.AccountInfo.Banned = true;
  307. DateTime date;
  308. DateTime.TryParse(ChatBanExpiryTextBox.Text, out date);
  309. Character.AccountInfo.ExpiryDate = date;
  310. if (Character?.Player != null)
  311. {
  312. Character.Player.Connection.SendDisconnect(6);
  313. }
  314. }
  315. #endregion
  316. #region PlayerFlagSearch
  317. private List<ListViewItem> allFlagItems = new List<ListViewItem>();
  318. private void PopulatePlayerFlagsListView()
  319. {
  320. PlayerFlagsListView.Items.Clear();
  321. allFlagItems.Clear();
  322. for (int flagNumber = 1; flagNumber <= 1000; flagNumber++)
  323. {
  324. ListViewItem listItem = new ListViewItem(flagNumber.ToString());
  325. bool isFlagActive = flagNumber >= 0 && flagNumber < Character.Flags.Length && Character.Flags[flagNumber];
  326. listItem.SubItems.Add(isFlagActive ? "Active" : "Not Active");
  327. listItem.ForeColor = isFlagActive ? Color.Green : Color.Red;
  328. allFlagItems.Add(listItem);
  329. }
  330. FilterFlags();
  331. }
  332. private void FilterFlags()
  333. {
  334. PlayerFlagsListView.Items.Clear();
  335. foreach (var item in allFlagItems)
  336. {
  337. bool showItem = true;
  338. if (ActiveFlagsCheckBox.Checked && item.SubItems[1].Text != "Active")
  339. {
  340. showItem = false;
  341. }
  342. if (!string.IsNullOrEmpty(FlagSearchBox.Text))
  343. {
  344. if (int.TryParse(FlagSearchBox.Text, out int searchFlagNumber))
  345. {
  346. if (int.Parse(item.SubItems[0].Text) != searchFlagNumber)
  347. {
  348. showItem = false;
  349. }
  350. }
  351. else
  352. {
  353. showItem = false;
  354. }
  355. }
  356. if (showItem)
  357. {
  358. PlayerFlagsListView.Items.Add(item);
  359. }
  360. }
  361. }
  362. private void ActiveFlagsCheckBox_CheckedChanged(object sender, EventArgs e)
  363. {
  364. FilterFlags();
  365. }
  366. private void FlagSearchBox_TextChanged(object sender, EventArgs e)
  367. {
  368. FilterFlags();
  369. }
  370. private void OpenFlagsButton_Click(object sender, EventArgs e)
  371. {
  372. string filePath = Path.Combine("Envir", "SET [].txt");
  373. if (!File.Exists(filePath))
  374. {
  375. using (StreamWriter writer = new StreamWriter(filePath))
  376. {
  377. for (int i = 1; i <= 1999; i++)
  378. {
  379. writer.WriteLine($"[{i:D3}] -");
  380. }
  381. }
  382. }
  383. Process.Start("notepad.exe", filePath);
  384. }
  385. private void EnableSelectedFlag_Click(object sender, EventArgs e)
  386. {
  387. if (PlayerFlagsListView.SelectedItems.Count > 0)
  388. {
  389. ListViewItem selectedItem = PlayerFlagsListView.SelectedItems[0];
  390. int flagIndex = int.Parse(selectedItem.Text);
  391. var result = MessageBox.Show("Are you sure you want to enable this flag?", "Confirm Action", MessageBoxButtons.YesNo);
  392. if (result == DialogResult.Yes)
  393. {
  394. if (flagIndex >= 0 && flagIndex < Character.Flags.Length)
  395. {
  396. Character.Flags[flagIndex] = true;
  397. selectedItem.SubItems[1].Text = "Active";
  398. selectedItem.SubItems[1].ForeColor = Color.Green;
  399. }
  400. else
  401. {
  402. MessageBox.Show("Invalid flag index.");
  403. }
  404. }
  405. }
  406. else
  407. {
  408. MessageBox.Show("Please select a flag to enable.");
  409. }
  410. }
  411. private void DisableSelectedFlag_Click(object sender, EventArgs e)
  412. {
  413. if (PlayerFlagsListView.SelectedItems.Count > 0)
  414. {
  415. ListViewItem selectedItem = PlayerFlagsListView.SelectedItems[0];
  416. int flagIndex = int.Parse(selectedItem.Text);
  417. var result = MessageBox.Show("Are you sure you want to disable this flag?", "Confirm Action", MessageBoxButtons.YesNo);
  418. if (result == DialogResult.Yes)
  419. {
  420. if (flagIndex >= 0 && flagIndex < Character.Flags.Length)
  421. {
  422. Character.Flags[flagIndex] = false;
  423. selectedItem.SubItems[1].Text = "Inactive";
  424. selectedItem.SubItems[1].ForeColor = Color.Red;
  425. }
  426. else
  427. {
  428. MessageBox.Show("Invalid flag index.");
  429. }
  430. }
  431. }
  432. else
  433. {
  434. MessageBox.Show("Please select a flag to disable.");
  435. }
  436. }
  437. #endregion
  438. #region UpdateTabs
  439. private void UpdateTabs()
  440. {
  441. if (Character == null)
  442. {
  443. Close();
  444. return;
  445. }
  446. UpdatePlayerInfo();
  447. PopulatePlayerFlagsListView();
  448. UpdatePetInfo();
  449. UpdatePlayerItems();
  450. UpdatePlayerMagics();
  451. UpdatePlayerQuests();
  452. UpdateHeroInfo();
  453. }
  454. #endregion
  455. #region Tab Resize
  456. private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
  457. {
  458. switch (tabControl1.SelectedIndex)
  459. {
  460. case 0: //Player
  461. Size = new Size(703, 510);
  462. break;
  463. case 1: //Quest
  464. Size = new Size(423, 510);
  465. break;
  466. case 2: //Item
  467. Size = new Size(597, 510);
  468. break;
  469. case 3: //Magic
  470. Size = new Size(458, 510);
  471. break;
  472. case 4: //Pet
  473. Size = new Size(533, 510);
  474. break;
  475. case 5: //Hero
  476. Size = new Size(802, 510);
  477. break;
  478. }
  479. UpdateTabs();
  480. }
  481. #endregion
  482. #region Hero List
  483. private void UpdateHeroInfo()
  484. {
  485. if (Character?.Player != null && Character.Player.Hero != null)
  486. {
  487. HeroNameTextBox.Text = Character.Player.Hero.Name;
  488. HeroLevelTextBox.Text = Character.Player.Hero.Level.ToString();
  489. HeroClassTextBox.Text = $"{Character.Player.Hero.Class}";
  490. HeroCurrentMapLabel.Text = $"{Character.Player.Hero.CurrentMap.Info.Title} / {Character.Player.Hero.CurrentMap.Info.FileName}";
  491. HeroCurrentXY.Text = $"X:{Character.Player.Hero.CurrentLocation.X}: Y:{Character.Player.Hero.CurrentLocation.Y}";
  492. HeroExpTextBox.Text = $"{string.Format("{0:#0.##%}", Character.Player.Hero.Experience / (double)Character.Player.Hero.MaxExperience)}";
  493. HeroACBox.Text = $"{Character.Player.Hero.Stats[Stat.MinAC]}-{Character.Player.Hero.Stats[Stat.MaxAC]}";
  494. HeroAMCBox.Text = $"{Character.Player.Hero.Stats[Stat.MinMAC]}-{Character.Player.Hero.Stats[Stat.MaxMAC]}";
  495. HeroDCBox.Text = $"{Character.Player.Hero.Stats[Stat.MinDC]}-{Character.Player.Hero.Stats[Stat.MaxDC]}";
  496. HeroMCBox.Text = $"{Character.Player.Hero.Stats[Stat.MinMC]}-{Character.Player.Hero.Stats[Stat.MaxMC]}";
  497. HeroSCBox.Text = $"{Character.Player.Hero.Stats[Stat.MinSC]}-{Character.Player.Hero.Stats[Stat.MaxSC]}";
  498. HeroACCBox.Text = $"{Character.Player.Hero.Stats[Stat.Accuracy]}";
  499. HeroAGILBox.Text = $"{Character.Player.Hero.Stats[Stat.Agility]}";
  500. HeroATKSPDBox.Text = $"{Character.Player.Hero.Stats[Stat.AttackSpeed]}";
  501. UpdateHeroMagic();
  502. UpdateHeroItems();
  503. }
  504. else
  505. {
  506. HeroCurrentMapLabel.Text = "OFFLINE";
  507. HeroCurrentXY.Text = "OFFLINE";
  508. }
  509. }
  510. private void UpdateHeroMagic()
  511. {
  512. HeroMagicList.Items.Clear();
  513. if (Character == null || Character.Heroes == null) return;
  514. foreach (HeroInfo hero in Character.Heroes)
  515. {
  516. if (hero == null) continue;
  517. foreach (UserMagic magic in hero.Magics)
  518. {
  519. if (magic == null) continue;
  520. ListViewItem listItem = new ListViewItem(magic.Info.Name.ToString()) { Tag = this };
  521. listItem.SubItems.Add(magic.Level.ToString());
  522. switch (magic.Level)
  523. {
  524. case 0:
  525. listItem.SubItems.Add($"{magic.Experience}/{magic.Info.Need1}");
  526. break;
  527. case 1:
  528. listItem.SubItems.Add($"{magic.Experience}/{magic.Info.Need2}");
  529. break;
  530. case 2:
  531. listItem.SubItems.Add($"{magic.Experience}/{magic.Info.Need3}");
  532. break;
  533. case 3:
  534. listItem.SubItems.Add("-");
  535. break;
  536. }
  537. if (magic.Key > 8)
  538. {
  539. var key = magic.Key % 8;
  540. listItem.SubItems.Add(string.Format("CTRL+F{0}", key != 0 ? key : 8));
  541. }
  542. else if (magic.Key > 0)
  543. {
  544. listItem.SubItems.Add(string.Format("F{0}", magic.Key));
  545. }
  546. else
  547. {
  548. listItem.SubItems.Add("No Key");
  549. }
  550. listItem.SubItems.Add(magic.Key.ToString());
  551. HeroMagicList.Items.Add(listItem);
  552. }
  553. }
  554. }
  555. private void UpdateHeroItems()
  556. {
  557. HeroItemInfoListViewNF.Items.Clear();
  558. if (Character == null || Character.Heroes == null) return;
  559. HeroInfo selectedHero = Character.Heroes.FirstOrDefault();
  560. if (selectedHero == null) return;
  561. for (int i = 0; i < selectedHero.Inventory.Length; i++)
  562. {
  563. UserItem inventoryItem = selectedHero.Inventory[i];
  564. if (inventoryItem == null) continue;
  565. ListViewItem inventoryItemListItem = new ListViewItem($"{inventoryItem.UniqueID}");
  566. if (i < 6)
  567. {
  568. inventoryItemListItem.SubItems.Add($"Belt | Slot: [{i + 1}]");
  569. }
  570. else if (i >= 6 && i < 46)
  571. {
  572. inventoryItemListItem.SubItems.Add($"Inventory Bag I | Slot: [{i - 5}]");
  573. }
  574. else
  575. {
  576. inventoryItemListItem.SubItems.Add($"Inventory Bag II | Slot: [{i - 45}]");
  577. }
  578. inventoryItemListItem.SubItems.Add($"{inventoryItem.FriendlyName}");
  579. inventoryItemListItem.SubItems.Add($"{inventoryItem.Count}/{inventoryItem.Info.StackSize}");
  580. inventoryItemListItem.SubItems.Add($"{inventoryItem.CurrentDura}/{inventoryItem.MaxDura}");
  581. HeroItemInfoListViewNF.Items.Add(inventoryItemListItem);
  582. }
  583. for (int i = 0; i < selectedHero.Equipment.Length; i++)
  584. {
  585. UserItem equipItem = selectedHero.Equipment[i];
  586. if (equipItem == null) continue;
  587. ListViewItem equipItemListItem = new ListViewItem($"{equipItem.UniqueID}");
  588. equipItemListItem.SubItems.Add($"Equipment | Slot: [{i + 1}]");
  589. equipItemListItem.SubItems.Add($"{equipItem.FriendlyName}");
  590. equipItemListItem.SubItems.Add($"{equipItem.Count}/{equipItem.Info.StackSize}");
  591. equipItemListItem.SubItems.Add($"{equipItem.CurrentDura}/{equipItem.MaxDura}");
  592. HeroItemInfoListViewNF.Items.Add(equipItemListItem);
  593. }
  594. }
  595. private void HeroUpdateButton_Click(object sender, EventArgs e)
  596. {
  597. if (MessageBox.Show("Are you sure you want to Update?", "Update.", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning) != DialogResult.Yes) return;
  598. HeroSaveChanges();
  599. }
  600. private void HeroSaveChanges()
  601. {
  602. if (Character == null || Character.Heroes == null) return;
  603. HeroInfo selectedHero = Character.Heroes.FirstOrDefault();
  604. if (selectedHero == null) return;
  605. selectedHero.Name = HeroNameTextBox.Text;
  606. selectedHero.Level = Convert.ToByte(HeroLevelTextBox.Text);
  607. UpdateTabs();
  608. }
  609. #endregion
  610. }
  611. }