GameShop.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. using Server.MirEnvir;
  2. namespace Server
  3. {
  4. public partial class GameShop : Form
  5. {
  6. private List<GameShopItem> SelectedItems;
  7. public Envir Envir => SMain.EditEnvir;
  8. public GameShop()
  9. {
  10. InitializeComponent();
  11. LoadGameShopItems();
  12. GameShopSearchBox_TextChanged(this, EventArgs.Empty);
  13. }
  14. private void GameShop_Load(object sender, EventArgs e)
  15. {
  16. UpdateInterface();
  17. LoadItemsIntoComboBox();
  18. ItemComboBox.SelectedIndex = -1;
  19. }
  20. private void GameShop_FormClosed(object sender, FormClosedEventArgs e)
  21. {
  22. Envir.SaveDB();
  23. }
  24. public class ListBoxItem
  25. {
  26. public string DisplayMember { get; set; }
  27. public object ValueMember { get; set; }
  28. public override string ToString()
  29. {
  30. return DisplayMember;
  31. }
  32. }
  33. private void LoadGameShopItems()
  34. {
  35. ClassFilter_lb.Items.Clear();
  36. CategoryFilter_lb.Items.Clear();
  37. GameShopListBox.Items.Clear();
  38. ClassFilter_lb.Items.Add("All Classes");
  39. CategoryFilter_lb.Items.Add("All Categories");
  40. for (int i = 0; i < SMain.EditEnvir.GameShopList.Count; i++)
  41. {
  42. if (!ClassFilter_lb.Items.Contains(SMain.EditEnvir.GameShopList[i].Class)) ClassFilter_lb.Items.Add(SMain.EditEnvir.GameShopList[i].Class);
  43. if (!CategoryFilter_lb.Items.Contains(SMain.EditEnvir.GameShopList[i].Category)) CategoryFilter_lb.Items.Add(SMain.EditEnvir.GameShopList[i].Category);
  44. GameShopListBox.Items.Add(SMain.EditEnvir.GameShopList[i]);
  45. }
  46. ClassFilter_lb.Text = "All Classes";
  47. CategoryFilter_lb.Text = "All Categories";
  48. SectionFilter_lb.Text = "All Items";
  49. }
  50. private void UpdateGameShopList()
  51. {
  52. GameShopListBox.Items.Clear();
  53. for (int i = 0; i < SMain.EditEnvir.GameShopList.Count; i++)
  54. {
  55. if (ClassFilter_lb.Text == "All Classes" || SMain.EditEnvir.GameShopList[i].Class == ClassFilter_lb.Text)
  56. if (SectionFilter_lb.Text == "All Items" || SMain.EditEnvir.GameShopList[i].TopItem && SectionFilter_lb.Text == "Top Items" || SMain.EditEnvir.GameShopList[i].Deal && SectionFilter_lb.Text == "Sale Items" || SMain.EditEnvir.GameShopList[i].Date > Envir.Now.AddDays(-7) && SectionFilter_lb.Text == "New Items")
  57. if (CategoryFilter_lb.Text == "All Categories" || SMain.EditEnvir.GameShopList[i].Category == CategoryFilter_lb.Text)
  58. GameShopListBox.Items.Add(SMain.EditEnvir.GameShopList[i]);
  59. }
  60. }
  61. private void GameShopListBox_SelectedIndexChanged(object sender, EventArgs e)
  62. {
  63. UpdateInterface();
  64. }
  65. public void UpdateInterface(bool refreshList = false)
  66. {
  67. SelectedItems = GameShopListBox.SelectedItems.Cast<GameShopItem>().ToList();
  68. if (SelectedItems.Count == 0)
  69. {
  70. GoldPrice_textbox.Text = String.Empty;
  71. GPPrice_textbox.Text = String.Empty;
  72. Stock_textbox.Text = String.Empty;
  73. Individual_checkbox.Checked = false;
  74. Class_combo.Text = "All";
  75. Category_textbox.Text = "";
  76. TopItem_checkbox.Checked = false;
  77. DealofDay_checkbox.Checked = false;
  78. CredxGold_textbox.Text = Settings.CredxGold.ToString();
  79. ItemDetails_gb.Visible = false;
  80. TotalSold_label.Text = "0";
  81. LeftinStock_label.Text = "";
  82. Count_textbox.Text = String.Empty;
  83. CreditOnlyBox.Checked = false;
  84. GoldOnlyBox.Checked = false;
  85. // Reset ComboBox
  86. ItemComboBox.SelectedIndex = -1;
  87. return;
  88. }
  89. ItemDetails_gb.Visible = true;
  90. GoldPrice_textbox.Text = SelectedItems[0].GoldPrice.ToString();
  91. GPPrice_textbox.Text = SelectedItems[0].CreditPrice.ToString();
  92. Stock_textbox.Text = SelectedItems[0].Stock.ToString();
  93. Individual_checkbox.Checked = SelectedItems[0].iStock;
  94. Class_combo.Text = SelectedItems[0].Class;
  95. Category_textbox.Text = SelectedItems[0].Category;
  96. TopItem_checkbox.Checked = SelectedItems[0].TopItem;
  97. DealofDay_checkbox.Checked = SelectedItems[0].Deal;
  98. Count_textbox.Text = SelectedItems[0].Count.ToString();
  99. CreditOnlyBox.Checked = SelectedItems[0].CanBuyCredit;
  100. GoldOnlyBox.Checked = SelectedItems[0].CanBuyGold;
  101. // Set the ItemComboBox selection to match the ItemIndex
  102. if (SelectedItems[0].Info != null && !string.IsNullOrEmpty(SelectedItems[0].Info.Name))
  103. {
  104. var itemName = SelectedItems[0].Info.Name;
  105. // Select the corresponding item in the ComboBox
  106. if (ItemComboBox.Items.Contains(itemName))
  107. {
  108. ItemComboBox.SelectedItem = itemName;
  109. }
  110. else
  111. {
  112. ItemComboBox.SelectedIndex = -1; // Reset if no match found
  113. }
  114. }
  115. else
  116. {
  117. ItemComboBox.SelectedIndex = -1; // Reset if no valid Info or Name
  118. }
  119. GetStats();
  120. }
  121. private void GetStats()
  122. {
  123. int purchased;
  124. SMain.Envir.GameshopLog.TryGetValue(SelectedItems[0].GIndex, out purchased);
  125. TotalSold_label.Text = purchased.ToString();
  126. if (!Individual_checkbox.Checked && SelectedItems[0].Stock != 0)
  127. {
  128. if (SelectedItems[0].Stock - purchased >= 0)
  129. LeftinStock_label.Text = (SelectedItems[0].Stock - purchased).ToString();
  130. else
  131. LeftinStock_label.Text = "";
  132. }
  133. else if (SelectedItems[0].Stock == 0)
  134. {
  135. LeftinStock_label.Text = "Infinite";
  136. }
  137. else if (Individual_checkbox.Checked)
  138. {
  139. LeftinStock_label.Text = "Can't calc individual levels";
  140. }
  141. }
  142. private void GoldPrice_textbox_TextChanged(object sender, EventArgs e)
  143. {
  144. uint temp;
  145. if (!uint.TryParse(GoldPrice_textbox.Text, out temp))
  146. {
  147. GoldPrice_textbox.BackColor = Color.Red;
  148. return;
  149. }
  150. GoldPrice_textbox.BackColor = SystemColors.Window;
  151. for (int i = 0; i < SelectedItems.Count; i++)
  152. SelectedItems[i].GoldPrice = temp;
  153. }
  154. private void GPPrice_textbox_TextChanged(object sender, EventArgs e)
  155. {
  156. if (ActiveControl != sender) return;
  157. uint temp;
  158. if (!uint.TryParse(ActiveControl.Text, out temp))
  159. {
  160. ActiveControl.BackColor = Color.Red;
  161. return;
  162. }
  163. ActiveControl.BackColor = SystemColors.Window;
  164. for (int i = 0; i < SelectedItems.Count; i++)
  165. SelectedItems[i].CreditPrice = temp;
  166. if (ActiveControl.Text != "") GoldPrice_textbox.Text = (temp * Settings.CredxGold).ToString();
  167. }
  168. private void Class_combo_SelectedIndexChanged(object sender, EventArgs e)
  169. {
  170. if (ActiveControl != sender) return;
  171. string temp = ActiveControl.Text;
  172. for (int i = 0; i < SelectedItems.Count; i++)
  173. SelectedItems[i].Class = temp;
  174. }
  175. private void TopItem_checkbox_CheckedChanged(object sender, EventArgs e)
  176. {
  177. if (ActiveControl != sender) return;
  178. for (int i = 0; i < SelectedItems.Count; i++)
  179. SelectedItems[i].TopItem = TopItem_checkbox.Checked;
  180. }
  181. private void Remove_button_Click(object sender, EventArgs e)
  182. {
  183. if (SelectedItems.Count == 0) return;
  184. if (MessageBox.Show("Are you sure you want to remove the selected Items?", "Remove Items?", MessageBoxButtons.YesNo) != DialogResult.Yes) return;
  185. for (int i = 0; i < SelectedItems.Count; i++) Envir.Remove(SelectedItems[i]);
  186. LoadGameShopItems();
  187. UpdateInterface();
  188. }
  189. private void DealofDay_checkbox_CheckedChanged(object sender, EventArgs e)
  190. {
  191. if (ActiveControl != sender) return;
  192. for (int i = 0; i < SelectedItems.Count; i++)
  193. SelectedItems[i].Deal = DealofDay_checkbox.Checked;
  194. }
  195. private void Category_textbox_TextChanged(object sender, EventArgs e)
  196. {
  197. if (ActiveControl != sender) return;
  198. string temp = ActiveControl.Text;
  199. for (int i = 0; i < SelectedItems.Count; i++)
  200. SelectedItems[i].Category = temp;
  201. }
  202. private void Stock_textbox_TextChanged(object sender, EventArgs e)
  203. {
  204. if (ActiveControl != sender) return;
  205. int temp;
  206. if (!int.TryParse(ActiveControl.Text, out temp))
  207. {
  208. ActiveControl.BackColor = Color.Red;
  209. return;
  210. }
  211. ActiveControl.BackColor = SystemColors.Window;
  212. for (int i = 0; i < SelectedItems.Count; i++)
  213. SelectedItems[i].Stock = temp;
  214. GetStats();
  215. }
  216. private void Individual_checkbox_CheckedChanged(object sender, EventArgs e)
  217. {
  218. if (ActiveControl != sender) return;
  219. for (int i = 0; i < SelectedItems.Count; i++)
  220. SelectedItems[i].iStock = Individual_checkbox.Checked;
  221. }
  222. private void CredxGold_textbox_TextChanged(object sender, EventArgs e)
  223. {
  224. if (ActiveControl != sender) return;
  225. short temp;
  226. if (!short.TryParse(ActiveControl.Text, out temp))
  227. {
  228. ActiveControl.BackColor = Color.Red;
  229. return;
  230. }
  231. ActiveControl.BackColor = SystemColors.Window;
  232. Settings.CredxGold = temp;
  233. }
  234. private void Count_textbox_TextChanged(object sender, EventArgs e)
  235. {
  236. if (ActiveControl != sender) return;
  237. ushort temp;
  238. if (!ushort.TryParse(ActiveControl.Text, out temp) || temp > 999)
  239. {
  240. ActiveControl.BackColor = Color.Red;
  241. return;
  242. }
  243. if (temp < 1)
  244. {
  245. temp = 1;
  246. ActiveControl.Text = "1";
  247. }
  248. else if (temp > SelectedItems[0].Info.StackSize)
  249. {
  250. temp = SelectedItems[0].Info.StackSize;
  251. ActiveControl.Text = SelectedItems[0].Info.StackSize.ToString();
  252. }
  253. ActiveControl.BackColor = SystemColors.Window;
  254. SelectedItems[0].Count = temp;
  255. }
  256. private void ClassFilter_lb_SelectedIndexChanged(object sender, EventArgs e)
  257. {
  258. UpdateGameShopList();
  259. }
  260. private void SectionFilter_lb_SelectedIndexChanged(object sender, EventArgs e)
  261. {
  262. UpdateGameShopList();
  263. }
  264. private void CategoryFilter_lb_SelectedIndexChanged(object sender, EventArgs e)
  265. {
  266. UpdateGameShopList();
  267. }
  268. private void ResetFilter_button_Click(object sender, EventArgs e)
  269. {
  270. ClassFilter_lb.Text = "All Classes";
  271. CategoryFilter_lb.Text = "All Categories";
  272. SectionFilter_lb.Text = "All Items";
  273. UpdateGameShopList();
  274. }
  275. private void ServerLog_button_Click(object sender, EventArgs e)
  276. {
  277. if (SMain.Envir.Running)
  278. {
  279. if (MessageBox.Show("Reseting purchase logs cannot be reverted and will set stock levels back to defaults, This will take effect instantly.", "Remove Logs?", MessageBoxButtons.YesNo) != DialogResult.Yes) return;
  280. SMain.Envir.ClearGameshopLog();
  281. }
  282. else
  283. {
  284. if (MessageBox.Show("Reseting purchase logs cannot be reverted and will set stock levels back to defaults, This will take effect when you start the server", "Remove Logs?", MessageBoxButtons.YesNo) != DialogResult.Yes) return;
  285. SMain.Envir.ResetGS = true;
  286. }
  287. }
  288. private void GoldOnlyBox_CheckedChanged(object sender, EventArgs e)
  289. {
  290. if (ActiveControl != sender)
  291. return;
  292. for (int i = 0; i < SelectedItems.Count; i++)
  293. SelectedItems[i].CanBuyGold = GoldOnlyBox.Checked;
  294. }
  295. private void CreditOnly_CheckedChanged(object sender, EventArgs e)
  296. {
  297. if (ActiveControl != sender)
  298. return;
  299. for (int i = 0; i < SelectedItems.Count; i++)
  300. SelectedItems[i].CanBuyCredit = CreditOnlyBox.Checked;
  301. }
  302. #region Load Items
  303. private void LoadItemsIntoComboBox()
  304. {
  305. ItemComboBox.Items.Clear();
  306. // Add "None" as a default option
  307. ItemComboBox.Items.Add("None");
  308. // Add all items from ItemInfoList
  309. foreach (var item in SMain.EditEnvir.ItemInfoList)
  310. {
  311. if (!string.IsNullOrEmpty(item.Name))
  312. {
  313. ItemComboBox.Items.Add($"{item.Name}");
  314. }
  315. }
  316. ItemComboBox.SelectedIndex = 0; // Default to "None"
  317. }
  318. #endregion
  319. private void Add_Button_Click(object sender, EventArgs e)
  320. {
  321. if (SMain.EditEnvir.ItemInfoList == null || SMain.EditEnvir.ItemInfoList.Count == 0)
  322. {
  323. MessageBox.Show("No items available to add.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  324. return;
  325. }
  326. // Get the first item's index as default
  327. var defaultItem = SMain.EditEnvir.ItemInfoList.First();
  328. int firstItemIndex = defaultItem.Index;
  329. // Find the next available GIndex
  330. int nextGIndex = SMain.EditEnvir.GameShopList.Count > 0
  331. ? SMain.EditEnvir.GameShopList.Max(item => item.GIndex) + 1
  332. : 1;
  333. // Create the new GameShopItem
  334. var newItem = new GameShopItem
  335. {
  336. GIndex = nextGIndex,
  337. GoldPrice = 0,
  338. CreditPrice = 0,
  339. ItemIndex = firstItemIndex,
  340. Info = defaultItem,
  341. Date = DateTime.Now,
  342. Class = "None",
  343. Category = "None"
  344. };
  345. // Add to GameShopList (main data source)
  346. SMain.EditEnvir.GameShopList.Add(newItem);
  347. // Add to GameShopListBox for UI display
  348. GameShopListBox.Items.Add(newItem);
  349. // Set ComboBox to the first item's name
  350. ItemComboBox.SelectedItem = $"{defaultItem.Name}";
  351. // Save the database
  352. Envir.SaveDB();
  353. }
  354. private void ItemComboBox_SelectedIndexChanged(object sender, EventArgs e)
  355. {
  356. // Ensure we have a selected GameShopItem
  357. if (SelectedItems == null || SelectedItems.Count == 0)
  358. return;
  359. // Get the selected item name
  360. var selectedName = ItemComboBox.SelectedItem as string;
  361. if (string.IsNullOrEmpty(selectedName) || selectedName == "None")
  362. return;
  363. // Find the corresponding ItemInfo object by name
  364. var newItemInfo = SMain.EditEnvir.ItemInfoList
  365. .FirstOrDefault(x => x.Name == selectedName);
  366. if (newItemInfo == null)
  367. return;
  368. // Update the selected GameShopItem
  369. var selectedGameShopItem = SelectedItems[0];
  370. selectedGameShopItem.ItemIndex = newItemInfo.Index;
  371. selectedGameShopItem.Info = newItemInfo;
  372. // Refresh the GameShopListBox to reflect changes
  373. int selectedIndex = GameShopListBox.SelectedIndex;
  374. GameShopListBox.Items[selectedIndex] = selectedGameShopItem;
  375. }
  376. #region Search Box
  377. private void GameShopSearchBox_TextChanged(object sender, EventArgs e)
  378. {
  379. string searchText = GameShopSearchBox.Text.Trim().ToLower();
  380. GameShopListBox.Items.Clear();
  381. foreach (var item in SMain.EditEnvir.GameShopList)
  382. {
  383. // Add to list if search text is empty or the item matches the search criteria
  384. if (string.IsNullOrEmpty(searchText) ||
  385. (!string.IsNullOrEmpty(item.Info?.Name) && item.Info.Name.ToLower().Contains(searchText)))
  386. {
  387. GameShopListBox.Items.Add(item);
  388. }
  389. }
  390. }
  391. #endregion
  392. private void ExportButton_Click(object sender, EventArgs e)
  393. {
  394. if (GameShopListBox.Items.Count == 0)
  395. {
  396. MessageBox.Show("No items to export.", "Export Failed", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  397. return;
  398. }
  399. string exportDir = Path.Combine(Application.StartupPath, "Exports");
  400. if (!Directory.Exists(exportDir))
  401. Directory.CreateDirectory(exportDir);
  402. SaveFileDialog saveDialog = new SaveFileDialog
  403. {
  404. Title = "GameShop Info",
  405. Filter = "Text Files (*.txt)|*.txt",
  406. FileName = "GameShop_Export.txt",
  407. InitialDirectory = exportDir
  408. };
  409. if (saveDialog.ShowDialog() != DialogResult.OK)
  410. return;
  411. List<string> lines = new List<string>
  412. {
  413. "GameShop Info",
  414. ""
  415. };
  416. foreach (var obj in GameShopListBox.Items)
  417. {
  418. if (obj is GameShopItem item && item.Info != null)
  419. {
  420. string name = item.Info.Name;
  421. uint gp = item.CreditPrice;
  422. uint gold = item.GoldPrice;
  423. lines.Add($"{name}: GameGold: {gp:n0} Gold: {gold:n0}");
  424. }
  425. }
  426. File.WriteAllLines(saveDialog.FileName, lines);
  427. MessageBox.Show("Export complete.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
  428. }
  429. }
  430. }