SkinManager.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Xml;
  5. using LitJson;
  6. public class SkinManager {
  7. private Dictionary<int, SkinData> dataDict;
  8. private Dictionary<int, List<SkinData>> dataListByCraftId;
  9. public SkinData defaultData;
  10. private bool isPriceGot;
  11. private int startEquipedId;
  12. private int currentEquipedId;
  13. public SkinManager()
  14. {
  15. dataDict = new Dictionary<int, SkinData>();
  16. dataListByCraftId = new Dictionary<int, List<SkinData>>();
  17. InitByXML("XML/Config/"+Language.GetCurrentLanguage()+"/skin_config");
  18. }
  19. public void InitByXML(string path)
  20. {
  21. TextAsset textAsset = (TextAsset)Resources.Load(path);
  22. XmlDocument xml = new XmlDocument();
  23. xml.LoadXml(textAsset.text);
  24. XmlNode mapNode = xml.SelectSingleNode("data");
  25. XmlNodeList nodeList = mapNode.SelectNodes("item");
  26. for(int i=0; i<nodeList.Count; i++)
  27. {
  28. SkinData data = new SkinData(nodeList[i]);
  29. if(data.id == 0)
  30. {
  31. defaultData = data;
  32. defaultData.bought = true;
  33. continue;
  34. }
  35. if(!dataDict.ContainsKey(data.id))
  36. {
  37. dataDict.Add(data.id, data);
  38. FillDataListByCraftId(data);
  39. }
  40. else
  41. Debuger.LogError("skin " + data.id + " has duplicate");
  42. }
  43. }
  44. private void FillDataListByCraftId(SkinData data)
  45. {
  46. int craftId = data.craftId;
  47. if(!dataListByCraftId.ContainsKey(craftId))
  48. {
  49. dataListByCraftId.Add(craftId, new List<SkinData>());
  50. }
  51. dataListByCraftId[craftId].Add(data);
  52. }
  53. private static SkinManager instance;
  54. public static SkinManager GetInstance()
  55. {
  56. if(instance == null)
  57. {
  58. instance = new SkinManager();
  59. }
  60. return instance;
  61. }
  62. public SkinData GetData(int id)
  63. {
  64. if(dataDict.ContainsKey(id))
  65. return dataDict[id];
  66. return null;
  67. }
  68. public int GetSkinId(int craftId)
  69. {
  70. if(dataListByCraftId.ContainsKey(craftId))
  71. {
  72. List<SkinData> list = dataListByCraftId[craftId];
  73. for(int i=0; i<list.Count; i++)
  74. {
  75. SkinData data = list[i];
  76. if(data.equiped > 0)
  77. {
  78. return data.id;
  79. }
  80. }
  81. }
  82. return 0;
  83. }
  84. public Texture GetSkinTexture(int craftId, int id)
  85. {
  86. SkinData data = GetData(id);
  87. if(data != null)
  88. {
  89. return Resources.Load<Texture>("Textures/CraftSkin/"+data.model+"/"+craftId);
  90. }
  91. return Resources.Load<Texture>("Textures/CraftSkin/"+craftId);
  92. }
  93. public void InitDataState(JsonData json)
  94. {
  95. for(int i=0; i<json.Count; i++)
  96. {
  97. JsonData o = json[i];
  98. int itemId = JsonUtil.ToInt(o["itemid"]);
  99. int equiped = JsonUtil.ToInt(o["equiped"]);
  100. if(equiped > 0)
  101. Equip(itemId, equiped, equiped);
  102. Bought(itemId);
  103. }
  104. }
  105. public void RequestDataList(CallBackUtil.SimpleCallBack callBack)
  106. {
  107. if(!isPriceGot)
  108. Session.GetInstance().GetNetworkManager().ShopList(BuyUtil.ItemType.Skin, callBack);
  109. else
  110. callBack();
  111. }
  112. public List<SkinData> GetDataList(int craftId)
  113. {
  114. if(dataListByCraftId.ContainsKey(craftId))
  115. return dataListByCraftId[craftId];
  116. return new List<SkinData>();
  117. }
  118. public void SetDataList(JsonData json)
  119. {
  120. isPriceGot = true;
  121. for(int i=0; i<json.Count; i++)
  122. {
  123. JsonData o = json[i];
  124. int itemId = JsonUtil.ToInt(o["itemid"]);
  125. int currency = JsonUtil.ToInt(o["currency"]);
  126. int price = JsonUtil.ToInt(o["price"]);
  127. SkinData data = GetData(itemId);
  128. data.currency = currency;
  129. data.price = price;
  130. }
  131. }
  132. public void Bought(int id)
  133. {
  134. SkinData data = GetData(id);
  135. if(data != null)
  136. data.bought = true;
  137. }
  138. public void RecordStartEquipId(int craftId)
  139. {
  140. startEquipedId = currentEquipedId = GetSkinId(craftId);
  141. }
  142. public void SyncEquipId(int craftId)
  143. {
  144. if(startEquipedId != currentEquipedId)
  145. {
  146. SkinData data = GetData(currentEquipedId);
  147. if(data != null)
  148. Session.GetInstance().GetNetworkManager().Equip(BuyUtil.ItemType.Skin, data.id, data.equiped);
  149. else
  150. Session.GetInstance().GetNetworkManager().Equip(BuyUtil.ItemType.Skin, startEquipedId, 0);
  151. }
  152. }
  153. public void Equip(int id, int value, int craftId)
  154. {
  155. SkinData data = GetData(id);
  156. if (data != null) {
  157. if (value != 0) {
  158. data.equiped = data.craftId;
  159. currentEquipedId = data.id;
  160. } else {
  161. data.equiped = 0;
  162. currentEquipedId = 0;
  163. }
  164. } else {
  165. currentEquipedId = 0;
  166. }
  167. if(dataListByCraftId.ContainsKey(craftId))
  168. {
  169. List<SkinData> dataList = dataListByCraftId[craftId];
  170. for(int i=0; i<dataList.Count; i++)
  171. {
  172. data = dataList[i];
  173. if(data.id != id)
  174. {
  175. data.equiped = 0;
  176. }
  177. }
  178. }
  179. }
  180. }