ChestMge.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Xml;
  7. using Sfs2X.Entities.Data;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. using Random = UnityEngine.Random;
  11. public class ChestData
  12. {
  13. #region Config
  14. public int Value;
  15. public int Round;
  16. public int RemainValue;
  17. public int RemainRound;
  18. public int DatabaseRoomID;
  19. public long ID;
  20. public long Owner;
  21. public DateTime ActivatedTime;
  22. public ChestType ChestType;
  23. public Vector3 Position;
  24. public static int SystemRoomDatabaseID = 1;
  25. private static bool Initialized;
  26. //private static float XMin;
  27. //private static float XMax;
  28. //private static float YMin;
  29. //private static float YMax;
  30. private static Vector3 DefaultPosition;
  31. private static Vector3 ChestDepthOffset = new Vector3(0, 0, 0.98f);
  32. #endregion
  33. public ChestData(ISFSObject arg)
  34. {
  35. if (!Initialized)
  36. {
  37. Initialize();
  38. }
  39. ID = arg.GetLong(gd_chest.ID);
  40. Value = arg.GetInt(gd_chest.Value);
  41. Round = arg.GetInt(gd_chest.Round);
  42. RemainValue = arg.GetInt(gd_chest.RemainValue);
  43. RemainRound = arg.GetInt(gd_chest.RemainRound);
  44. DatabaseRoomID = arg.GetInt(gd_chest.DatabaseRoomID);
  45. Owner = arg.GetLong(gd_chest.Owner);
  46. ActivatedTime = DateUtil.GetTimeFromSecends(arg.GetLong(gd_chest.ActivatedTime).ToString());
  47. ChestType = (ChestType) arg.GetInt(gd_chest.Type);
  48. Vector3 defaultPosition = DefaultPosition + ChestDepthOffset;
  49. if (arg.ContainsKey(gd_chest.Position))
  50. {
  51. string vectorStr = arg.GetUtfString(gd_chest.Position);
  52. if (vectorStr == "null")
  53. {
  54. Position = defaultPosition;
  55. }
  56. else
  57. {
  58. Position = arg.GetUtfString(gd_chest.Position).StringToVector() + ChestDepthOffset;
  59. }
  60. }
  61. else
  62. {
  63. Position = defaultPosition;
  64. }
  65. }
  66. private static void Initialize()
  67. {
  68. Initialized = true;
  69. DefaultPosition = ManaReso.Get("PlazaRoomChestPos").position;
  70. //XMin = ManaReso.Get("ChestLowerLeft").position.x;
  71. //YMin = ManaReso.Get("ChestLowerLeft").position.y;
  72. //XMax = ManaReso.Get("ChestUpperRight").position.x;
  73. //YMax = ManaReso.Get("ChestUpperRight").position.y;
  74. }
  75. }
  76. public class ChestMge : Regist
  77. {
  78. #region Config
  79. private static Text Desc;
  80. private static Text BtnLab;
  81. private static Text SliderValueLab;
  82. private static Slider Slider;
  83. private static Button Btn;
  84. private static InputField InputField;
  85. private static string RefundNodeName = "Refund";
  86. private static string ReceivedNodeName = "Received";
  87. public static List<PlazaRoomChest> PlazaRoomChests = new List<PlazaRoomChest>();
  88. private static List<int> RefundRoomIDs = new List<int>();
  89. private static Dictionary<long, int> ChestRoomDictionary = new Dictionary<long, int>();
  90. #endregion
  91. public override void RegistValueA()
  92. {
  93. XmlNodeList RefundNodes = ManaData.PlayerNode.SelectNodes(RefundNodeName);
  94. XmlNodeList ReceivedNodes = ManaData.PlayerNode.SelectNodes(ReceivedNodeName);
  95. for (int i = 0; i < RefundNodes.Count; i++)
  96. {
  97. RefundRoomIDs.Add(int.Parse(RefundNodes[i].InnerText));
  98. }
  99. for (int i = 0; i < ReceivedNodes.Count; i++)
  100. {
  101. string[] strings = ReceivedNodes[i].InnerText.Split('|');
  102. long chestID = long.Parse(strings[0]);
  103. ChestRoomDictionary.Add(chestID, int.Parse(strings[1]));
  104. }
  105. //foreach (var VARIABLE in RefundRoomIDs)
  106. //{
  107. // Debug.LogWarning("refund " + VARIABLE);
  108. //}
  109. //foreach (var VARIABLE in ChestRoomDictionary)
  110. //{
  111. // Debug.LogWarning("received " + VARIABLE.Key);
  112. //}
  113. CheckRefund();
  114. GetChestExpireStatus();
  115. }
  116. public override void RegistReference()
  117. {
  118. Btn = ManaReso.Get<Button>("Yb_Btn");
  119. Desc = ManaReso.Get<Text>("Yb_Desc");
  120. Slider = ManaReso.Get<Slider>("Yb_Slider");
  121. BtnLab = ManaReso.Get<Text>("Yb_BtnLab");
  122. InputField = ManaReso.Get<InputField>("Yb_InputField");
  123. SliderValueLab = ManaReso.Get<Text>("Yb_SliderValueLab");
  124. }
  125. public static void OpenCreatePanel()
  126. {
  127. ManaReso.Get("Y_Chest").TweenForCG();
  128. ManaReso.SetActive("Ya_GetAward", false);
  129. ManaReso.SetActive("Y_Guess", false);
  130. ManaReso.SetActive("Yb_CreateChest", true);
  131. OnSliderValueChange(Slider.value);
  132. OnInputValueChange(InputField.text);
  133. Slider.value = 1;
  134. Slider.maxValue = SFSManager.GardenSmartFox.PlazaRoomManager.CurrentRoomData.MaxPlayer;
  135. }
  136. public static void CloseChestPanel()
  137. {
  138. ManaReso.Get("Y_Chest").TweenBacCG();
  139. }
  140. public static void OnLuckyToggle(bool enable)
  141. {
  142. if (enable)
  143. {
  144. ChestType = ChestType.Lucky;
  145. ManaLan.Add(Desc, new LanStr("UI", "Yb_LuckyDesc"));
  146. }
  147. }
  148. public static void OnColorToggle(bool enable)
  149. {
  150. if (enable)
  151. {
  152. ChestType = ChestType.GuessColor;
  153. ManaLan.Add(Desc, new LanStr("UI", "Yb_GuessColorDesc"));
  154. }
  155. }
  156. public static void OnNumberToggle(bool enable)
  157. {
  158. if (enable)
  159. {
  160. ChestType = ChestType.GuessNumber;
  161. ManaLan.Add(Desc, new LanStr("UI", "Yb_GuessNumberDesc"));
  162. }
  163. }
  164. public static void OnInputValueChange(string value)
  165. {
  166. if (string.IsNullOrEmpty(value) || int.Parse(value) < 20)
  167. {
  168. Btn.interactable = false;
  169. Btn.image.material = Lib.GrayMat;
  170. ManaLan.Add(BtnLab, new LanStr("UI", "Yb_Minimum"));
  171. return;
  172. }
  173. Cost = int.Parse(value);
  174. ManaReso.SetText("Yb_CostLab", Language.GetStr("UI", "AA_Cost") + "<(钻石)>" + Cost);
  175. if (ManaCenter.Diamond < Cost)
  176. {
  177. Btn.interactable = false;
  178. Btn.image.material = Lib.GrayMat;
  179. ManaLan.Add(BtnLab, new LanStr("Common", "ShortDiamond"));
  180. }
  181. else
  182. {
  183. Btn.interactable = true;
  184. Btn.image.material = null;
  185. ManaLan.Add(BtnLab, new LanStr("Common", "Confirm"));
  186. }
  187. }
  188. public static void OnSliderValueChange(float value)
  189. {
  190. Round = (int) value;
  191. SliderValueLab.text = Round + Language.GetStr("UI", "Yb_SliderValueLab");
  192. }
  193. private static int Cost;
  194. private static int Round;
  195. private static float ChestXMinOffset = 1;
  196. private static float ChestXMaxOffset = 2;
  197. private static ChestType ChestType = ChestType.Lucky;
  198. public static void CreateChest()
  199. {
  200. ManaLan.Add(ManaReso.Get<Text>("Y_Tip"), new LanStr("UI", "AA_SendRequest"));
  201. ManaReso.Get("Y_Tip").TweenForCG();
  202. int databaseRoomID = SFSManager.GardenSmartFox.PlazaRoomManager.CurrentRoomData.ID;
  203. long serialNumber = long.Parse(ManaServer.SerialNumber);
  204. Vector3 position = SFSManager.GardenSmartFox.PlazaRoomManager.SelfInstance.Player.transform.position + Mathf.Sign(Random.Range(-1f, 1f))*new Vector3(Random.Range(ChestXMinOffset, ChestXMaxOffset), 0, 0);
  205. SFSManager.GardenSmartFox.EventManager.PlazaRoomEvent.CreateChest(Round, Cost, ChestType, databaseRoomID, serialNumber, position);
  206. ManaReso.Get<CanvasGroup>("Y_Chest").interactable = false;
  207. }
  208. public static void OnCreateChestError()
  209. {
  210. ManaLan.Add(ManaReso.Get<Text>("Y_Tip"), new LanStr("UI", "AA_CreateError"));
  211. ManaReso.Get("Y_Tip").TweenBacCG();
  212. ManaReso.Get<CanvasGroup>("Y_Chest").interactable = true;
  213. }
  214. public static void OnCreateChestSucceed()
  215. {
  216. ManaCenter.CreateChestAmt++;
  217. if (ChestType == ChestType.Lucky)
  218. {
  219. ManaCenter.CreateLuckyChestAmt++;
  220. }
  221. else if (ChestType == ChestType.GuessColor)
  222. {
  223. ManaCenter.CreateGuessColorChestAmt++;
  224. }
  225. else if (ChestType == ChestType.GuessNumber)
  226. {
  227. ManaCenter.CreateGuessNumberChestAmt++;
  228. }
  229. ManaLan.Add(ManaReso.Get<Text>("Y_Tip"), new LanStr("UI", "AA_CreateSucceed"));
  230. ManaReso.Get("Y_Tip").TweenBacCG();
  231. ManaReso.Get<CanvasGroup>("Y_Chest").interactable = true;
  232. ManaCenter.AddDiamond(-Cost, StaticsManager.ItemID.创建宝箱, StaticsManager.ConsumeModule.Charge);
  233. CloseChestPanel();
  234. }
  235. public static void OnReceiveNewChest(ChestData chestData)
  236. {
  237. if (!SFSManager.GardenSmartFox.PlazaRoomManager.JoinedPlazaRoom)
  238. {
  239. return;
  240. }
  241. ManaAudio.PlayClip(Clip.BubbleClip);
  242. InstantiateChest(chestData);
  243. if (chestData.Owner == long.Parse(ManaServer.SerialNumber))
  244. {
  245. if (SFSManager.GardenSmartFox.PlazaRoomManager.CurrentRoomData.ID != ChestData.SystemRoomDatabaseID)
  246. {
  247. RefundRoomIDs.UniqueAdd(SFSManager.GardenSmartFox.PlazaRoomManager.CurrentRoomData.ID);
  248. }
  249. }
  250. }
  251. private static void CheckRefund()
  252. {
  253. if (RefundRoomIDs.Count == 0)
  254. {
  255. return;
  256. }
  257. else
  258. {
  259. SFSManager.GardenSmartFox.EventManager.PlazaRoomEvent.CheckChestRefund(RefundRoomIDs);
  260. }
  261. }
  262. private static void GetChestExpireStatus()
  263. {
  264. SFSManager.GardenSmartFox.EventManager.PlazaRoomEvent.GetChestExpireStatus(ChestRoomDictionary.Keys.ToList());
  265. }
  266. public static void OnReceiveChestExpireStatus(List<long> chestIDs)
  267. {
  268. foreach (var chestID in chestIDs)
  269. {
  270. ChestRoomDictionary.Remove(chestID);
  271. }
  272. }
  273. public static void RetrieveAllChest()
  274. {
  275. foreach (var plazaRoomChest in PlazaRoomChests)
  276. {
  277. ManaReso.Save(plazaRoomChest.transform.parent);
  278. }
  279. PlazaRoomChests = new List<PlazaRoomChest>();
  280. }
  281. private static void InstantiateChest(ChestData chestData)
  282. {
  283. if (chestData.ChestType != ChestType.System)
  284. {
  285. if (ChestRoomDictionary.Keys.Contains(chestData.ID))
  286. {
  287. return;
  288. }
  289. if (chestData.RemainRound <= 0 || chestData.RemainValue <= 0)
  290. {
  291. return;
  292. }
  293. PlazaRoomChest chest = ManaReso.GetPlazaRoomChest(chestData.Position);
  294. chest.Init(chestData);
  295. PlazaRoomChests.Add(chest);
  296. }
  297. else
  298. {
  299. PlazaRoomChest chest = ManaReso.GetPlazaRoomChest(chestData.Position);
  300. chest.SystemChestInit(chestData);
  301. PlazaRoomChests.Add(chest);
  302. }
  303. }
  304. public static void ReceiveAllChestData(List<ChestData> chestDatas)
  305. {
  306. ManaAudio.PlayClip(Clip.BubbleClip);
  307. foreach (var chestData in chestDatas)
  308. {
  309. InstantiateChest(chestData);
  310. }
  311. }
  312. public static void ActivateSystemChest()
  313. {
  314. if (!SFSManager.GardenSmartFox.PlazaRoomManager.JoinedPlazaRoom)
  315. {
  316. return;
  317. }
  318. if (PlazaRoomChest.SystemChest == null)
  319. {
  320. return;
  321. }
  322. if (ChestRoomDictionary.Keys.Contains(PlazaRoomChest.SystemChest.ChestData.ID))
  323. {
  324. return;
  325. }
  326. PlazaRoomChest.SystemChest.Active();
  327. }
  328. public static void ReactivateSystemChest()
  329. {
  330. if (!SFSManager.GardenSmartFox.PlazaRoomManager.JoinedPlazaRoom)
  331. {
  332. return;
  333. }
  334. if (PlazaRoomChest.SystemChest == null)
  335. {
  336. return;
  337. }
  338. ChestRoomDictionary.Remove(PlazaRoomChest.SystemChest.ChestData.ID);
  339. PlazaRoomChest.SystemChest.Active();
  340. }
  341. public static void DeactivateSystemChest()
  342. {
  343. if (!SFSManager.GardenSmartFox.PlazaRoomManager.JoinedPlazaRoom)
  344. {
  345. return;
  346. }
  347. if (PlazaRoomChest.SystemChest == null)
  348. {
  349. return;
  350. }
  351. //PlazaRoomChest.SystemChest.SetColliders(false);
  352. PlazaRoomChest.SystemChest.Deactive();
  353. }
  354. public static void ReceiveChestAward(int award, long chestID)
  355. {
  356. ChestRoomDictionary.Add(PlazaRoomChest.CurrentChest.ChestData.ID, PlazaRoomChest.CurrentChest.ChestData.DatabaseRoomID);
  357. ManaReso.Get<CanvasGroup>("Y_Chest").interactable = true;
  358. if (award <= 0)
  359. {
  360. ManaReso.Get("Y_Chest").TweenBacCG();
  361. Bubble.Show(null, Language.GetStr("UI", "Y_SoldOut"));
  362. }
  363. else
  364. {
  365. ManaAudio.PlayClip(Clip.CurrentClip);
  366. ManaReso.Get("Y_Chest").TweenForCG();
  367. ManaReso.SetActive("Ya_GetAward", true);
  368. ManaReso.SetActive("Y_Guess", false);
  369. ManaReso.SetActive("Yb_CreateChest", false);
  370. ManaReso.SetText("Ya_Desc", $"x{award}");
  371. ManaCenter.AddDiamond(award, StaticsManager.ItemID.获得钻石, StaticsManager.ConsumeModule.RoomChestAward);
  372. ManaCenter.GetChestAwardAmt++;
  373. }
  374. for (int i = 0; i < PlazaRoomChests.Count; i++)
  375. {
  376. if (PlazaRoomChests[i].ChestData.ID == chestID && PlazaRoomChests[i].ChestData.ChestType != ChestType.System)
  377. {
  378. PlazaRoomChests[i].RetriveChest();
  379. PlazaRoomChests.RemoveAt(i--);
  380. }
  381. }
  382. }
  383. public static void ReceiveChestRefund(int refund, List<int> databaseRoomIDs)
  384. {
  385. foreach (var databaseRoomID in databaseRoomIDs)
  386. {
  387. RefundRoomIDs.Remove(databaseRoomID);
  388. }
  389. if (refund > 0)
  390. {
  391. ManaCenter.AddDiamond(refund, StaticsManager.ItemID.获得钻石, StaticsManager.ConsumeModule.RoomChestRefund);
  392. ManaInfoBox.Show(InfoCategory.Garden, Language.GetStr("UI", "Y_Refund")+refund, 10, Color.white);
  393. }
  394. }
  395. public static void Save()
  396. {
  397. XmlNode node = ManaData.PlayerNode.SelectSingleNode(RefundNodeName);
  398. while (node != null)
  399. {
  400. ManaData.PlayerNode.RemoveChild(node);
  401. node = ManaData.PlayerNode.SelectSingleNode(RefundNodeName);
  402. }
  403. node = ManaData.PlayerNode.SelectSingleNode(ReceivedNodeName);
  404. while (node != null)
  405. {
  406. ManaData.PlayerNode.RemoveChild(node);
  407. node = ManaData.PlayerNode.SelectSingleNode(ReceivedNodeName);
  408. }
  409. foreach (var id in RefundRoomIDs)
  410. {
  411. node = ManaData.PlayerDoc.CreateNode(XmlNodeType.Element, RefundNodeName, null);
  412. node.InnerText = id.ToString();
  413. ManaData.PlayerNode.AppendChild(node);
  414. }
  415. foreach (var kv in ChestRoomDictionary)
  416. {
  417. node = ManaData.PlayerDoc.CreateNode(XmlNodeType.Element, ReceivedNodeName, null);
  418. node.InnerText = $"{kv.Key}|{kv.Value}";
  419. ManaData.PlayerNode.AppendChild(node);
  420. }
  421. }
  422. }