SMain.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. using CustomFormControl;
  2. using Server.Account;
  3. using Server.Database;
  4. using Server.MirDatabase;
  5. using Server.MirEnvir;
  6. using Server.MirForms.Systems;
  7. using Server.MirObjects;
  8. using Server.Systems;
  9. using System.Collections;
  10. namespace Server
  11. {
  12. public partial class SMain : Form
  13. {
  14. public static Envir Envir => Envir.Main;
  15. public static Envir EditEnvir => Envir.Edit;
  16. protected static MessageQueue MessageQueue => MessageQueue.Instance;
  17. public SMain()
  18. {
  19. InitializeComponent();
  20. AutoResize();
  21. }
  22. private void AutoResize()
  23. {
  24. int columnCount = PlayersOnlineListView.Columns.Count;
  25. foreach (ColumnHeader column in PlayersOnlineListView.Columns)
  26. {
  27. column.Width = PlayersOnlineListView.Width / (columnCount - 1) - 1;
  28. }
  29. indexHeader.Width = 2;
  30. }
  31. public class ListViewItemComparer : IComparer // For Players Online tab level sorting
  32. {
  33. private int col;
  34. private SortOrder order;
  35. public ListViewItemComparer(int column, SortOrder order)
  36. {
  37. col = column;
  38. this.order = order;
  39. }
  40. public int Compare(object x, object y)
  41. {
  42. ListViewItem itemX = x as ListViewItem;
  43. ListViewItem itemY = y as ListViewItem;
  44. string stringX = itemX?.SubItems[col].Text ?? "";
  45. string stringY = itemY?.SubItems[col].Text ?? "";
  46. int result;
  47. if (col == 2)
  48. {
  49. int intX = 0, intY = 0;
  50. int.TryParse(stringX, out intX);
  51. int.TryParse(stringY, out intY);
  52. result = intX.CompareTo(intY);
  53. }
  54. else
  55. {
  56. result = String.Compare(stringX, stringY);
  57. }
  58. if (order == SortOrder.Descending)
  59. result = -result;
  60. return result;
  61. }
  62. }
  63. public static void Enqueue(Exception ex)
  64. {
  65. MessageQueue.Enqueue(ex);
  66. }
  67. public static void EnqueueDebugging(string msg)
  68. {
  69. MessageQueue.EnqueueDebugging(msg);
  70. }
  71. public static void EnqueueChat(string msg)
  72. {
  73. MessageQueue.EnqueueChat(msg);
  74. }
  75. public static void Enqueue(string msg)
  76. {
  77. MessageQueue.Enqueue(msg);
  78. }
  79. private void configToolStripMenuItem_Click(object sender, EventArgs e)
  80. {
  81. }
  82. private void InterfaceTimer_Tick(object sender, EventArgs e)
  83. {
  84. try
  85. {
  86. Text = $"Total: {Envir.LastCount}, Real: {Envir.LastRealCount}";
  87. PlayersLabel.Text = $"Players: {Envir.Players.Count}";
  88. MonsterLabel.Text = $"Monsters: {Envir.MonsterCount}";
  89. ConnectionsLabel.Text = $"Connections: {Envir.Connections.Count}";
  90. BlockedIPsLabel.Text = $"Blocked IPs: {Envir.IPBlocks.Count(x => x.Value > Envir.Now)}";
  91. UpTimeLabel.Text = $"Uptime: {Envir.Stopwatch.ElapsedMilliseconds / 1000 / 60 / 60 / 24}d:{Envir.Stopwatch.ElapsedMilliseconds / 1000 / 60 / 60 % 24}h:{Envir.Stopwatch.ElapsedMilliseconds / 1000 / 60 % 60}m:{Envir.Stopwatch.ElapsedMilliseconds / 1000 % 60}s";
  92. if (Settings.Multithreaded && (Envir.MobThreads != null))
  93. {
  94. CycleDelayLabel.Text = $"CycleDelays: {Envir.LastRunTime:0000}";
  95. for (int i = 0; i < Envir.MobThreads.Length; i++)
  96. {
  97. if (Envir.MobThreads[i] == null) break;
  98. CycleDelayLabel.Text = CycleDelayLabel.Text + $"|{Envir.MobThreads[i].LastRunTime:0000}";
  99. }
  100. }
  101. else
  102. CycleDelayLabel.Text = $"CycleDelay: {Envir.LastRunTime}";
  103. while (!MessageQueue.MessageLog.IsEmpty)
  104. {
  105. string message;
  106. if (!MessageQueue.MessageLog.TryDequeue(out message)) continue;
  107. LogTextBox.AppendText(message);
  108. }
  109. while (!MessageQueue.DebugLog.IsEmpty)
  110. {
  111. string message;
  112. if (!MessageQueue.DebugLog.TryDequeue(out message)) continue;
  113. DebugLogTextBox.AppendText(message);
  114. }
  115. while (!MessageQueue.ChatLog.IsEmpty)
  116. {
  117. string message;
  118. if (!MessageQueue.ChatLog.TryDequeue(out message)) continue;
  119. ChatLogTextBox.AppendText(message);
  120. }
  121. ProcessPlayersOnlineTab(false);
  122. ProcessGuildViewTab(false);
  123. }
  124. catch (Exception ex)
  125. {
  126. MessageBox.Show(ex.ToString());
  127. }
  128. }
  129. private ListViewItem CreateListView(CharacterInfo character)
  130. {
  131. ListViewItem ListItem = new ListViewItem(character.Index.ToString()) { Tag = character };
  132. ListItem.SubItems.Add(character.Name);
  133. ListItem.SubItems.Add(character.Level.ToString());
  134. ListItem.SubItems.Add(character.Class.ToString());
  135. ListItem.SubItems.Add(character.Gender.ToString());
  136. string mapName = MapInfo.GetMapTitleByIndex(character.CurrentMapIndex);
  137. ListItem.SubItems.Add($"{mapName}");
  138. return ListItem;
  139. }
  140. private void ProcessPlayersOnlineTab(bool forced = false)
  141. {
  142. if (PlayersOnlineListView.Items.Count != Envir.Players.Count || forced == true)
  143. {
  144. PlayersOnlineListView.Items.Clear();
  145. for (int i = PlayersOnlineListView.Items.Count; i < Envir.Players.Count; i++)
  146. {
  147. CharacterInfo character = Envir.Players[i].Info;
  148. ListViewItem tempItem = CreateListView(character);
  149. PlayersOnlineListView.Items.Add(tempItem);
  150. }
  151. }
  152. }
  153. private void startServerToolStripMenuItem_Click(object sender, EventArgs e)
  154. {
  155. Envir.Start();
  156. }
  157. private void stopServerToolStripMenuItem_Click(object sender, EventArgs e)
  158. {
  159. Envir.Stop();
  160. Envir.MonsterCount = 0;
  161. }
  162. private void SMain_FormClosing(object sender, FormClosingEventArgs e)
  163. {
  164. Envir.Stop();
  165. }
  166. private void closeServerToolStripMenuItem_Click(object sender, EventArgs e)
  167. {
  168. Close();
  169. }
  170. private void itemInfoToolStripMenuItem_Click(object sender, EventArgs e)
  171. {
  172. ItemInfoForm form = new ItemInfoForm();
  173. form.ShowDialog();
  174. }
  175. private void monsterInfoToolStripMenuItem_Click(object sender, EventArgs e)
  176. {
  177. MonsterInfoForm form = new MonsterInfoForm();
  178. form.ShowDialog();
  179. }
  180. private void nPCInfoToolStripMenuItem_Click(object sender, EventArgs e)
  181. {
  182. NPCInfoForm form = new NPCInfoForm();
  183. form.ShowDialog();
  184. }
  185. private void balanceConfigToolStripMenuItem_Click(object sender, EventArgs e)
  186. {
  187. BalanceConfigForm form = new BalanceConfigForm();
  188. form.ShowDialog();
  189. }
  190. private void questInfoToolStripMenuItem_Click(object sender, EventArgs e)
  191. {
  192. QuestInfoForm form = new QuestInfoForm();
  193. form.ShowDialog();
  194. }
  195. private void serverToolStripMenuItem_Click(object sender, EventArgs e)
  196. {
  197. ConfigForm form = new ConfigForm();
  198. form.ShowDialog();
  199. }
  200. private void balanceToolStripMenuItem_Click(object sender, EventArgs e)
  201. {
  202. BalanceConfigForm form = new BalanceConfigForm();
  203. form.ShowDialog();
  204. }
  205. private void accountToolStripMenuItem_Click(object sender, EventArgs e)
  206. {
  207. AccountInfoForm form = new AccountInfoForm();
  208. form.ShowDialog();
  209. }
  210. private void mapInfoToolStripMenuItem_Click(object sender, EventArgs e)
  211. {
  212. MapInfoForm form = new MapInfoForm();
  213. form.ShowDialog();
  214. }
  215. private void itemInfoToolStripMenuItem_Click_1(object sender, EventArgs e)
  216. {
  217. ItemInfoForm form = new ItemInfoForm();
  218. form.ShowDialog();
  219. }
  220. private void monsterInfoToolStripMenuItem_Click_1(object sender, EventArgs e)
  221. {
  222. MonsterInfoForm form = new MonsterInfoForm();
  223. form.ShowDialog();
  224. }
  225. private void nPCInfoToolStripMenuItem_Click_1(object sender, EventArgs e)
  226. {
  227. NPCInfoForm form = new NPCInfoForm();
  228. form.ShowDialog();
  229. }
  230. private void questInfoToolStripMenuItem_Click_1(object sender, EventArgs e)
  231. {
  232. QuestInfoForm form = new QuestInfoForm();
  233. form.ShowDialog();
  234. }
  235. private void dragonSystemToolStripMenuItem_Click(object sender, EventArgs e)
  236. {
  237. DragonInfoForm form = new DragonInfoForm();
  238. form.ShowDialog();
  239. }
  240. private void miningToolStripMenuItem_Click(object sender, EventArgs e)
  241. {
  242. MiningInfoForm form = new MiningInfoForm();
  243. form.ShowDialog();
  244. }
  245. private void guildsToolStripMenuItem_Click(object sender, EventArgs e)
  246. {
  247. GuildInfoForm form = new GuildInfoForm();
  248. form.ShowDialog();
  249. }
  250. private void fishingToolStripMenuItem_Click(object sender, EventArgs e)
  251. {
  252. SystemInfoForm form = new SystemInfoForm(0);
  253. form.ShowDialog();
  254. }
  255. private void GlobalMessageButton_Click(object sender, EventArgs e)
  256. {
  257. if (GlobalMessageTextBox.Text.Length < 1) return;
  258. foreach (var player in Envir.Players)
  259. {
  260. player.ReceiveChat(GlobalMessageTextBox.Text, ChatType.Announcement);
  261. }
  262. EnqueueChat(GlobalMessageTextBox.Text);
  263. GlobalMessageTextBox.Text = string.Empty;
  264. }
  265. private void PlayersOnlineListView_DoubleClick(object sender, EventArgs e)
  266. {
  267. CustomFormControl.ListViewNF list = (CustomFormControl.ListViewNF)sender;
  268. if (list.SelectedItems.Count > 0)
  269. {
  270. ListViewItem item = list.SelectedItems[0];
  271. string index = item.SubItems[0].Text;
  272. PlayerInfoForm form = new PlayerInfoForm(Convert.ToUInt32(index));
  273. form.ShowDialog();
  274. }
  275. }
  276. private void PlayersOnlineListView_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
  277. {
  278. e.Cancel = true;
  279. e.NewWidth = PlayersOnlineListView.Columns[e.ColumnIndex].Width;
  280. }
  281. private void mailToolStripMenuItem_Click(object sender, EventArgs e)
  282. {
  283. SystemInfoForm form = new SystemInfoForm(1);
  284. form.ShowDialog();
  285. }
  286. private void goodsToolStripMenuItem_Click(object sender, EventArgs e)
  287. {
  288. SystemInfoForm form = new SystemInfoForm(2);
  289. form.ShowDialog();
  290. }
  291. private void relationshipToolStripMenuItem_Click(object sender, EventArgs e)
  292. {
  293. SystemInfoForm form = new SystemInfoForm(4);
  294. form.ShowDialog();
  295. }
  296. private void refiningToolStripMenuItem_Click(object sender, EventArgs e)
  297. {
  298. SystemInfoForm form = new SystemInfoForm(3);
  299. form.ShowDialog();
  300. }
  301. private void mentorToolStripMenuItem_Click(object sender, EventArgs e)
  302. {
  303. SystemInfoForm form = new SystemInfoForm(5);
  304. form.ShowDialog();
  305. }
  306. private void magicInfoToolStripMenuItem_Click(object sender, EventArgs e)
  307. {
  308. MagicInfoForm form = new MagicInfoForm();
  309. form.ShowDialog();
  310. }
  311. private void SMain_Load(object sender, EventArgs e)
  312. {
  313. var loaded = EditEnvir.LoadDB();
  314. if (loaded)
  315. {
  316. Envir.Start();
  317. }
  318. AutoResize();
  319. }
  320. private void gemToolStripMenuItem_Click(object sender, EventArgs e)
  321. {
  322. SystemInfoForm form = new SystemInfoForm(6);
  323. form.ShowDialog();
  324. }
  325. private void conquestToolStripMenuItem_Click(object sender, EventArgs e)
  326. {
  327. ConquestInfoForm form = new ConquestInfoForm();
  328. form.ShowDialog();
  329. }
  330. private void rebootServerToolStripMenuItem_Click(object sender, EventArgs e)
  331. {
  332. Envir.Reboot();
  333. }
  334. private void respawnsToolStripMenuItem_Click(object sender, EventArgs e)
  335. {
  336. SystemInfoForm form = new SystemInfoForm(7);
  337. form.ShowDialog();
  338. }
  339. private void monsterTunerToolStripMenuItem_Click(object sender, EventArgs e)
  340. {
  341. if (!SMain.Envir.Running)
  342. {
  343. MessageBox.Show("Server must be running to tune monsters", "Notice",
  344. MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  345. return;
  346. }
  347. MonsterTunerForm form = new MonsterTunerForm();
  348. form.ShowDialog();
  349. }
  350. private void gameshopToolStripMenuItem_Click(object sender, EventArgs e)
  351. {
  352. GameShop form = new GameShop();
  353. form.ShowDialog();
  354. }
  355. private void itemNEWToolStripMenuItem_Click(object sender, EventArgs e)
  356. {
  357. ItemInfoFormNew form = new ItemInfoFormNew();
  358. form.ShowDialog();
  359. }
  360. private void monsterExperimentalToolStripMenuItem_Click(object sender, EventArgs e)
  361. {
  362. MonsterInfoFormNew form = new MonsterInfoFormNew();
  363. form.ShowDialog();
  364. }
  365. private void dropBuilderToolStripMenuItem_Click(object sender, EventArgs e)
  366. {
  367. MirForms.DropBuilder.DropGenForm GenForm = new MirForms.DropBuilder.DropGenForm();
  368. GenForm.ShowDialog();
  369. }
  370. private void clearBlockedIPsToolStripMenuItem_Click(object sender, EventArgs e)
  371. {
  372. Envir.IPBlocks.Clear();
  373. }
  374. private void nPCsToolStripMenuItem_Click(object sender, EventArgs e)
  375. {
  376. Envir.ReloadNPCs();
  377. }
  378. private void dropsToolStripMenuItem_Click(object sender, EventArgs e)
  379. {
  380. Envir.ReloadDrops();
  381. }
  382. private void lineMessageToolStripMenuItem_Click(object sender, EventArgs e)
  383. {
  384. Envir.ReloadLineMessages();
  385. }
  386. #region Guild View Tab
  387. public void ProcessGuildViewTab(bool forced = false)
  388. {
  389. if (GuildListView.Items.Count != Envir.GuildList.Count || forced == true)
  390. {
  391. GuildListView.Items.Clear();
  392. foreach (GuildInfo guild in Envir.GuildList)
  393. {
  394. ListViewItem tempItem = new ListViewItem(guild.GuildIndex.ToString()) { Tag = this };
  395. tempItem.SubItems.Add(guild.Name);
  396. if (guild.Ranks.Count > 0 && guild.Ranks[0].Members.Count > 0)
  397. {
  398. tempItem.SubItems.Add(guild.Ranks[0].Members[0].Name);
  399. }
  400. else
  401. {
  402. tempItem.SubItems.Add("DELETED");
  403. tempItem.ForeColor = Color.Red;
  404. }
  405. tempItem.SubItems.Add($"{guild.Membercount}/{guild.MemberCap}");
  406. tempItem.SubItems.Add(guild.Level.ToString());
  407. tempItem.SubItems.Add($"{guild.Gold}");
  408. tempItem.SubItems.Add(guild.HasGT ? guild.GTRent.ToString() : "None");
  409. GuildListView.Items.Add(tempItem);
  410. }
  411. }
  412. }
  413. private void GuildListView_DoubleClick(object sender, EventArgs e)
  414. {
  415. ListViewNF list = (ListViewNF)sender;
  416. if (list.SelectedItems.Count <= 0) return;
  417. ListViewItem item = list.SelectedItems[0];
  418. int index = Int32.Parse(item.Text);
  419. GuildObject Guild = Envir.GetGuild(index);
  420. GuildItemForm form = new GuildItemForm
  421. {
  422. GuildName = Guild.Name,
  423. Guild = Guild,
  424. main = this,
  425. };
  426. form.SetMemberCount(Guild.Info.Membercount, Guild.Info.MemberCap);
  427. form.SetGuildNotice(Guild.Info.Notice);
  428. form.SetBuffList(Guild.Info.BuffList, Settings.Guild_BuffList);
  429. form.SetGuildPoints(Guild.Info.SparePoints);
  430. form.SetGuildExperience(Guild.Info.Experience);
  431. if (Guild == null) return;
  432. foreach (var i in Guild.StoredItems)
  433. {
  434. if (i == null) continue;
  435. ListViewItem tempItem = new ListViewItem(i.Item.UniqueID.ToString()) { Tag = this };
  436. CharacterInfo character = Envir.GetCharacterInfo((int)i.UserId);
  437. if (character != null)
  438. tempItem.SubItems.Add(character.Name);
  439. else if (i.UserId == -1)
  440. tempItem.SubItems.Add("Server");
  441. else
  442. tempItem.SubItems.Add("Unknown");
  443. tempItem.SubItems.Add(i.Item.FriendlyName);
  444. tempItem.SubItems.Add(i.Item.Count.ToString());
  445. tempItem.SubItems.Add(i.Item.CurrentDura + "/" + i.Item.MaxDura);
  446. form.GuildItemListView.Items.Add(tempItem);
  447. }
  448. foreach (var r in Guild.Ranks)
  449. foreach (var m in r.Members)
  450. {
  451. ListViewItem tempItem = new ListViewItem(m.Name) { Tag = this };
  452. tempItem.SubItems.Add(r.Name);
  453. form.MemberListView.Items.Add(tempItem);
  454. }
  455. form.SetGuildRanks(Guild.Ranks);
  456. form.ShowDialog();
  457. }
  458. #endregion
  459. private void MainTabs_SelectedIndexChanged(object sender, EventArgs e)
  460. {
  461. ProcessPlayersOnlineTab(true);
  462. ProcessGuildViewTab(true);
  463. }
  464. private void heroesToolStripMenuItem_Click(object sender, EventArgs e)
  465. {
  466. SystemInfoForm form = new SystemInfoForm(8);
  467. form.ShowDialog();
  468. }
  469. private void CharacterToolStripMenuItem_Click(object sender, EventArgs e)
  470. {
  471. CharacterInfoForm form = new CharacterInfoForm();
  472. form.ShowDialog();
  473. }
  474. private void recipeToolStripMenuItem_Click(object sender, EventArgs e)
  475. {
  476. RecipeInfoForm form = new RecipeInfoForm();
  477. form.ShowDialog();
  478. }
  479. private void accountsToolStripMenuItem1_Click(object sender, EventArgs e)
  480. {
  481. AccountInfoForm form = new AccountInfoForm();
  482. form.ShowDialog();
  483. }
  484. private void marketToolStripMenuItem_Click(object sender, EventArgs e)
  485. {
  486. Market form = new Market();
  487. form.ShowDialog();
  488. }
  489. private void namelistsToolStripMenuItem_Click(object sender, EventArgs e)
  490. {
  491. Namelists form = new Namelists();
  492. form.ShowDialog();
  493. }
  494. private int sortColumn = -1;
  495. private void PlayersOnlineListView_ColumnClick(object sender, ColumnClickEventArgs e)
  496. {
  497. if (e.Column != sortColumn)
  498. {
  499. sortColumn = e.Column;
  500. PlayersOnlineListView.Sorting = SortOrder.Ascending;
  501. }
  502. else
  503. {
  504. PlayersOnlineListView.Sorting =
  505. PlayersOnlineListView.Sorting == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;
  506. }
  507. PlayersOnlineListView.ListViewItemSorter = new ListViewItemComparer(sortColumn, PlayersOnlineListView.Sorting);
  508. PlayersOnlineListView.Sort();
  509. }
  510. }
  511. }