void LoadGoodsMessage(int id) { RookiesGoods_Composite good = (RookiesGoods_Composite)RookiesGoods_OverallManage.GoodsManage.GetGoods(id); maxNum = good.MaxNum; intro = good.Intro; effect = good.Effect; sprite = RookiesGoods_OverallManage.GoodsManage.Try2GetSprite(id); }
private void OnEnable() { IdList = RookiesGoods_OverallManage.GoodsManage.GetAllId(); if (IdList.Count == 0) { Debug.Log("正在为你创建物品配置文件"); data = new RookiesGoods_SuitBase(1, "", "empty", "", "", 1); data.SetType("RookiesGoods_Composite"); RookiesGoods_OverallManage.GoodsManage.Add2GoodMenu(data); IdList.Add("1"); idIndex = 0; } idOption = IdList.ToArray(); idIndex = 0; minSize = new Vector2(400, 500); data = (RookiesGoods_Composite)RookiesGoods_OverallManage.GoodsManage.GetGoods(int.Parse(IdList[0]), true); InitMessage(); InitComposeMessage(); Load(); label.fontSize = 20; RookiesGoods_OverallManage.GoodsManage.UpdateSaveChange += UpdateSaveType; }
/// <summary> /// 合成失败的回调 /// </summary> /// <param name="composite">合成物的信息</param> /// <param name="reason">失败原因</param> public abstract void OnComposeFailed(RookiesGoods_Composite composite, string reason);
/// <summary> /// 合成物品 /// </summary> /// <param name="targetID"></param> /// <param name="bagNames"></param> /// <returns></returns> public bool AutoTrying2Synthesize(int targetID, params string[] bagNames) { if (!CheckSynthesize(targetID, bagNames)) { return(false); } RookiesGoods_Composite target = (RookiesGoods_Composite)RookiesGoods_OverallManage.GoodsManage.GetGoods(targetID); Dictionary <int, int> tempCounter = new Dictionary <int, int>(target.CompositeTable); int[] keys = new int[tempCounter.Count]; int i = 0; foreach (int id in tempCounter.Keys) { keys[i++] = id; } if (bagNames.Length == 0) { for (i = 0; i < tempCounter.Count; i++) { foreach (RookiesGoods_Bag bag in Bags.Values) { if (!bag.IsThere(keys[i])) { continue; } if (tempCounter[keys[i]] >= bag.FindOwnNumber(keys[i])) { bag.Delete(keys[i], bag.FindOwnNumber(keys[i])); tempCounter[keys[i]] -= bag.FindOwnNumber(keys[i]); if (tempCounter[keys[i]] == 0) { break; } } else { bag.Delete(keys[i], tempCounter[keys[i]]); break; } } } OnComposeSuccessful(target); return(true); } else { RookiesGoods_Bag bag; List <RookiesGoods_Bag> searchList = new List <RookiesGoods_Bag>(); for (i = 0; i < bagNames.Length; i++) { bag = TryGetBag(bagNames[i]); if (bag == null) { throw new ArgumentException("参数" + bagNames[i] + "错误,找不到角色对应背包"); } searchList.Add(bag); } foreach (int id in tempCounter.Keys) { for (i = 0; i < tempCounter.Count; i++) { foreach (RookiesGoods_Bag temp in Bags.Values) { if (tempCounter[keys[i]] >= temp.FindOwnNumber(keys[i])) { temp.Delete(keys[i], temp.FindOwnNumber(keys[i])); tempCounter[keys[i]] -= temp.FindOwnNumber(keys[i]); if (tempCounter[keys[i]] == 0) { break; } } else { temp.Delete(keys[i], temp.FindOwnNumber(keys[i]) - tempCounter[keys[i]]); break; } } } } OnComposeSuccessful(target); return(true); } }
/// <summary> /// 合成成功的回调 /// </summary> ///<param name="composite">合成物的信息</param> public abstract void OnComposeSuccessful(RookiesGoods_Composite composite);
/// <summary> /// 检查时候可以合成某物品 /// </summary> /// <param name="target">物品id</param> /// <param name="player"> 想要合成该物品的玩家的RookiesGoods_PlayerData实体 </param> /// <param name="bagNames">角色要检查的背包名</param> /// <returns></returns> public bool CheckSynthesize(int targetID, params string[] bagNames) { RookiesGoods_Composite target = (RookiesGoods_Composite)RookiesGoods_OverallManage.GoodsManage.GetGoods(targetID); if (target == null) { OnComposeFailed(target, "不存在目标物品"); return(false); } Dictionary <int, int> tempCounter = new Dictionary <int, int>(target.CompositeTable); int[] keys = new int[tempCounter.Count]; int i = 0; foreach (int id in tempCounter.Keys) { keys[i++] = id; } if (bagNames.Length == 0) { for (i = 0; i < tempCounter.Count; i++) { foreach (RookiesGoods_Bag bag in Bags.Values) { tempCounter[keys[i]] -= bag.FindOwnNumber(keys[i]); if (tempCounter[keys[i]] <= 0) { break; } } if (tempCounter[keys[i]] > 0) { OnComposeFailed(target, "材料不足"); return(false); } } return(true); } else { RookiesGoods_Bag bag; List <RookiesGoods_Bag> searchList = new List <RookiesGoods_Bag>(); for (i = 0; i < bagNames.Length; i++) { bag = TryGetBag(bagNames[i]); if (bag == null) { throw new ArgumentException("参数" + bagNames[i] + "错误,找不到角色对应背包"); } searchList.Add(bag); } for (i = 0; i < tempCounter.Count; i++) { foreach (RookiesGoods_Bag temp in Bags.Values) { tempCounter[keys[i]] -= temp.FindOwnNumber(keys[i]); if (tempCounter[keys[i]] <= 0) { break; } } if (tempCounter[keys[i]] > 0) { OnComposeFailed(target, "材料不足"); return(false); } } return(true); } }
private void OnGUI() { canSave = true; scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(position.width), GUILayout.Height(position.height)); GUILayout.BeginVertical(); GUILayout.Label(" 物品基础属性", label); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); idIndex = EditorGUILayout.Popup("物品id", idIndex, idOption); if (updateData || data == null || data.Id != int.Parse(idOption[idIndex])) { data = (RookiesGoods_Composite)RookiesGoods_OverallManage.GoodsManage.GetGoods(int.Parse(idOption[idIndex]), true); if (data == null) { EditorGUILayout.HelpBox("物品不存在", MessageType.Error); } else { InitMessage(); InitComposeMessage(); } updateData = false; } GUILayout.Space(5); GUILayout.EndHorizontal(); maxNum = EditorGUILayout.IntField("最大容纳量", maxNum); if (maxNum < 0) { EditorGUILayout.HelpBox("容纳量不能为负数", MessageType.Error); canSave = false; } _name = EditorGUILayout.TextField("名字", _name); if (_name.Equals("")) { EditorGUILayout.HelpBox("名字不能为空", MessageType.Error); canSave = false; } type = (Type)EditorGUILayout.EnumPopup("框架对象类型", type); if (type == Type.RookiesGoods_SuitBase) { durability = EditorGUILayout.IntField("耐久度,无限耐久置0", durability); } saveTypeIndex = EditorGUILayout.Popup("容器存储种类", Array.IndexOf(saveTypeOption, itemType), saveTypeOption); itemType = saveTypeOption[saveTypeIndex]; if (itemType.Equals("empty")) { EditorGUILayout.HelpBox("存储种类不能为空", MessageType.Error); canSave = false; } GUILayout.EndVertical(); GUILayout.Space(60); sprite = EditorGUI.ObjectField(new Rect(6, 40, position.width - 6, 100), "", sprite, typeof(Sprite), true) as Sprite; GUILayout.Label(new GUIContent("精灵图", "请选择在Resource下的精灵图"), EditorStyles.boldLabel); GUILayout.EndHorizontal(); GUILayout.Space(30); if (sprite == null || mRegular.IsMatch(AssetDatabase.GetAssetPath(sprite))) { spritePath = AssetDatabase.GetAssetPath(sprite); } else { EditorGUILayout.HelpBox("图片必须在Assets/Resources/下", MessageType.Error); canSave = false; spritePath = ""; } GUILayout.Label("介绍", GUILayout.MaxWidth(80)); intro = EditorGUILayout.TextArea(intro, GUILayout.MaxHeight(75)); if (intro.Equals("")) { EditorGUILayout.HelpBox("介绍当前为空", MessageType.Warning); } GUILayout.Label("实际作用", GUILayout.MaxWidth(80)); effect = EditorGUILayout.TextArea(effect, GUILayout.MaxHeight(75)); if (effect.Equals("")) { EditorGUILayout.HelpBox("实际作用当前为空", MessageType.Warning); } GUILayout.Label("合成表", GUILayout.MaxWidth(80)); for (int i = 0; i < ComposeTable.Count; i++) { GUILayout.BeginHorizontal(); GUILayout.Label("合成物id"); if (RookiesGoods_OverallManage.GoodsManage.ContainsGoodsKey(ComposeTable[i].first)) { int index = EditorGUILayout.Popup(Array.IndexOf(idOption, ComposeTable[i].first.ToString()), idOption); EditorGUILayout.TextField(RookiesGoods_OverallManage.GoodsManage.GetGoods(ComposeTable[i].first).Name); int num = EditorGUILayout.IntField("数量 :", ComposeTable[i].second); ComposeTable[i].SetFirst(int.Parse(idOption[index])); ComposeTable[i].SetSecond(num); } else { ComposeTable.Remove(ComposeTable[i--]); continue; } if (ComposeTable[i].second < 0) { EditorGUILayout.HelpBox("数量不能为负数", MessageType.Error); canSave = false; } if (GUILayout.Button("删除")) { ComposeTable.Remove(ComposeTable[i--]); } GUILayout.EndHorizontal(); } if (IdList.Count > 1 && GUILayout.Button("添加一个合成物品")) { ComposeTable.Add(new MyPair <int, int>(1, 0)); } GUILayout.Space(5); GUILayout.Label(" 物品自定义属性", label); GUILayout.Space(5); GUILayout.Label("整形属性", EditorStyles.boldLabel); for (int i = 0; i < IntProperty.Count; i++) { GUILayout.Space(5); GUILayout.BeginHorizontal(); IntProperty[i].SetFirst(EditorGUILayout.TextField("属性名", IntProperty[i].first)); for (int j = 0; j < IntProperty.Count; j++) { if (j == i) { continue; } if (IntProperty[j].first.Equals(IntProperty[i].first)) { EditorGUILayout.HelpBox("属性名不能相同", MessageType.Error); canSave = false; break; } } if (GUILayout.Button("删除整个属性")) { IntProperty.Remove(IntProperty[i--]); } GUILayout.EndHorizontal(); for (int j = 0; i >= 0 && j < IntProperty[i].second.Count; j++) { EditorGUILayout.BeginHorizontal(); IntProperty[i].second[j] = EditorGUILayout.IntField("数值 " + j, IntProperty[i].second[j], GUILayout.MaxWidth(position.width - 60)); if (GUILayout.Button("删除")) { IntProperty[i].second.Remove(IntProperty[i].second[j--]); } EditorGUILayout.EndHorizontal(); } if (GUILayout.Button("添加一个新值")) { IntProperty[i].second.Add(0); } } if (GUILayout.Button("添加一个新整形属性")) { IntProperty.Add(new MyPair <string, List <int> >("", new List <int>(0))); } GUILayout.Space(5); GUILayout.Label("字符属性", EditorStyles.boldLabel); for (int i = 0; i < StrProperty.Count; i++) { GUILayout.Space(5); GUILayout.BeginHorizontal(); StrProperty[i].SetFirst(EditorGUILayout.TextField("属性名", StrProperty[i].first)); for (int j = 0; j < StrProperty.Count; j++) { if (j == i) { continue; } if (StrProperty[j].first.Equals(StrProperty[i].first)) { EditorGUILayout.HelpBox("属性名不能相同", MessageType.Error); canSave = false; break; } } if (GUILayout.Button("删除整个属性")) { StrProperty.Remove(StrProperty[i--]); } GUILayout.EndHorizontal(); for (int j = 0; i >= 0 && j < StrProperty[i].second.Count; j++) { EditorGUILayout.BeginHorizontal(); StrProperty[i].second[j] = EditorGUILayout.TextField("数值 " + j, StrProperty[i].second[j], GUILayout.MaxWidth(position.width - 100)); if (GUILayout.Button("删除")) { StrProperty[i].second.Remove(StrProperty[i].second[j--]); } EditorGUILayout.EndHorizontal(); } if (GUILayout.Button("添加一个新值")) { StrProperty[i].second.Add(""); } } if (GUILayout.Button("添加一个新字符属性")) { StrProperty.Add(new MyPair <string, List <string> >("", new List <string>())); } GUILayout.Space(5); GUILayout.Label("浮点属性", EditorStyles.boldLabel); for (int i = 0; i < DbProperty.Count; i++) { GUILayout.Space(5); GUILayout.BeginHorizontal(); DbProperty[i].SetFirst(EditorGUILayout.TextField("属性名", DbProperty[i].first)); for (int j = 0; j < DbProperty.Count; j++) { if (j == i) { continue; } if (DbProperty[j].first.Equals(DbProperty[i].first)) { EditorGUILayout.HelpBox("属性名不能相同", MessageType.Error); canSave = false; break; } } if (GUILayout.Button("删除整个属性")) { DbProperty.Remove(DbProperty[i--]); } GUILayout.EndHorizontal(); for (int j = 0; i >= 0 && j < DbProperty[i].second.Count; j++) { EditorGUILayout.BeginHorizontal(); DbProperty[i].second[j] = EditorGUILayout.DoubleField("数值 " + j, DbProperty[i].second[j], GUILayout.MaxWidth(position.width - 80)); if (GUILayout.Button("删除")) { DbProperty[i].second.Remove(DbProperty[i].second[j--]); } EditorGUILayout.EndHorizontal(); } if (GUILayout.Button("添加一个新值")) { DbProperty[i].second.Add(0); } } if (GUILayout.Button("添加一个新浮点属性")) { DbProperty.Add(new MyPair <string, List <double> >("", new List <double>())); } GUILayout.Space(30); GUILayout.BeginHorizontal(); if (GUILayout.Button("添加一个新物品")) { idIndex = int.Parse(IdList[IdList.Count - 1]) + 1; IdList.Add(idIndex.ToString()); idOption = IdList.ToArray(); data = new RookiesGoods_SuitBase(idIndex, "", "empty", "", "", 1); idIndex = idOption.Length - 1; RookiesGoods_OverallManage.GoodsManage.Add2GoodMenu(data); data.SetType("RookiesGoods_Composite"); updateData = true; } GUILayout.Space(5); if (GUILayout.Button("重新导入所有物品信息")) { RookiesGoods_OverallManage.GoodsManage.InitData(); updateData = true; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (IdList.Count > 1 && GUILayout.Button("删除该物品")) { RookiesGoods_OverallManage.GoodsManage.RemoveGoods(data.Id); RookiesGoods_OverallManage.GoodsManage.InitData(); IdList = RookiesGoods_OverallManage.GoodsManage.GetAllId(); idOption = IdList.ToArray(); idIndex = (idIndex == idOption.Length)? idIndex - 1: idIndex; updateData = true; } if (!canSave) { EditorGUILayout.HelpBox("信息不正确无法修改", MessageType.Error); } else { if (GUILayout.Button("保存该物品信息")) { Save(); RookiesGoods_OverallManage.GoodsManage.InitData(); updateData = true; } } GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.Label("By ConfuseL"); EditorGUILayout.EndScrollView(); }
/// <summary> /// 初始化数据,读取xml和json,解析所有数据。 /// </summary> public void InitData() { IsSavingAfterQuit = false; PrototypeGoodsMenu = new Dictionary <int, RookiesGoods_GoodsBase>(); DurabilityID = new List <int>(); SpriteDic = new Dictionary <int, Sprite>(); PlayersData = new Dictionary <int, RookiesGoods_PlayerData>(); CompositeID = new List <int>(); XmlDocument xml = new XmlDocument(); xml.Load(Application.dataPath + "/RookiesGoods/Config/RookiesGoods_Config.xml"); XmlNodeList xmlNodeList = xml.SelectSingleNode("RookiesGoods_Config/JsonPath").ChildNodes; string path = xmlNodeList[0].InnerText; if (File.Exists(Application.dataPath + "/Resources/" + path + ".json")) { string classType, itemType, name, intro, effect, sprite; int id, maxNum, durability, length; int[] arrayValue; List <int> intListValue = new List <int>(); List <double> dbListValue = new List <double>(); List <string> strListValue = new List <string>(); TextAsset textAsset = Resources.Load(path) as TextAsset; JsonData jsonData = JsonMapper.ToObject(textAsset.text); foreach (JsonData data in jsonData) { JsonData stringValue = data["classType"]; JsonData intValue; JsonData arrayValues; JsonData propertyValue; classType = stringValue.ToString(); intValue = data["id"]; id = int.Parse(intValue.ToString()); intValue = data["maxNum"]; maxNum = int.Parse(intValue.ToString()); stringValue = data["itemType"]; itemType = stringValue.ToString(); stringValue = data["name"]; name = stringValue.ToString(); stringValue = data["intro"]; intro = stringValue.ToString(); stringValue = data["effect"]; effect = stringValue.ToString(); stringValue = data["spritePath"]; sprite = stringValue.ToString(); intValue = data["durability"]; durability = int.Parse(intValue.ToString()); arrayValues = data["compositeArray"]; if (sprite != "") { SpriteDic.Add(id, Resources.Load <Sprite>(sprite)); } switch (classType) { case "RookiesGoods_SuitBase": RookiesGoods_SuitBase suit; suit = new RookiesGoods_SuitBase(id, name, itemType, intro, effect, maxNum); suit.SetType(classType); length = arrayValues.Count; arrayValue = new int[length]; for (int i = 0; i < length; i++) { arrayValue[i] = int.Parse(arrayValues[i].ToString()); } if (length > 0) { CompositeID.Add(id); suit.UpdateComposite(arrayValue); } suit.Durability = durability; propertyValue = data["specialProperty"]; foreach (string key in propertyValue.Keys) { JsonData temp = propertyValue[key]; switch (temp.GetJsonType()) { case JsonType.None: break; case JsonType.Object: suit.AddProperty(key, temp); break; case JsonType.Array: length = temp.Count; intListValue.Clear(); strListValue.Clear(); dbListValue.Clear(); if (length > 0) { switch (temp[0].GetJsonType()) { case JsonType.Int: for (int i = 0; i < length; i++) { intListValue.Add(int.Parse(temp[i].ToString())); } suit.AddProperty(key, intListValue); break; case JsonType.String: for (int i = 0; i < length; i++) { strListValue.Add(temp[i].ToString()); } suit.AddProperty(key, strListValue); break; case JsonType.Double: for (int i = 0; i < length; i++) { dbListValue.Add(double.Parse(temp[i].ToString())); } suit.AddProperty(key, dbListValue); break; default: break; } } break; case JsonType.String: suit.AddProperty(key, temp.ToString()); break; case JsonType.Int: suit.AddProperty(key, int.Parse(temp.ToString())); break; case JsonType.Long: suit.AddProperty(key, long.Parse(temp.ToString())); break; case JsonType.Double: suit.AddProperty(key, double.Parse(temp.ToString())); break; case JsonType.Boolean: suit.AddProperty(key, bool.Parse(temp.ToString())); break; default: break; } } PrototypeGoodsMenu.Add(id, suit); break; case "RookiesGoods_Composite": RookiesGoods_Composite goods; goods = new RookiesGoods_Composite(id, name, itemType, intro, effect, maxNum); goods.SetType(classType); length = arrayValues.Count; arrayValue = new int[length]; for (int i = 0; i < length; i++) { arrayValue[i] = int.Parse(arrayValues[i].ToString()); } if (length > 0) { CompositeID.Add(id); goods.UpdateComposite(arrayValue); } propertyValue = data["specialProperty"]; foreach (string key in propertyValue.Keys) { JsonData temp = propertyValue[key]; switch (temp.GetJsonType()) { case JsonType.None: break; case JsonType.Object: goods.AddProperty(key, temp); break; case JsonType.Array: length = temp.Count; intListValue.Clear(); strListValue.Clear(); dbListValue.Clear(); if (length > 0) { switch (temp[0].GetJsonType()) { case JsonType.Int: for (int i = 0; i < length; i++) { intListValue.Add(int.Parse(temp[i].ToString())); } goods.AddProperty(key, intListValue); break; case JsonType.String: for (int i = 0; i < length; i++) { strListValue.Add(temp[i].ToString()); } goods.AddProperty(key, strListValue); break; case JsonType.Double: for (int i = 0; i < length; i++) { dbListValue.Add(double.Parse(temp[i].ToString())); } goods.AddProperty(key, dbListValue); break; default: break; } } break; case JsonType.String: goods.AddProperty(key, temp.ToString()); break; case JsonType.Int: goods.AddProperty(key, int.Parse(temp.ToString())); break; case JsonType.Long: goods.AddProperty(key, long.Parse(temp.ToString())); break; case JsonType.Double: goods.AddProperty(key, double.Parse(temp.ToString())); break; case JsonType.Boolean: goods.AddProperty(key, bool.Parse(temp.ToString())); break; default: break; } } PrototypeGoodsMenu.Add(id, goods); break; case "RookiesGoods_Consumable": RookiesGoods_Consumable consumable; consumable = new RookiesGoods_Consumable(id, name, itemType, intro, effect, maxNum); consumable.SetType(classType); length = arrayValues.Count; arrayValue = new int[length]; for (int i = 0; i < length; i++) { arrayValue[i] = int.Parse(arrayValues[i].ToString()); } if (length > 0) { CompositeID.Add(id); consumable.UpdateComposite(arrayValue); } propertyValue = data["specialProperty"]; foreach (string key in propertyValue.Keys) { JsonData temp = propertyValue[key]; switch (temp.GetJsonType()) { case JsonType.None: break; case JsonType.Object: consumable.AddProperty(key, temp); break; case JsonType.Array: length = temp.Count; intListValue.Clear(); strListValue.Clear(); dbListValue.Clear(); if (length > 0) { switch (temp[0].GetJsonType()) { case JsonType.Int: for (int i = 0; i < length; i++) { intListValue.Add(int.Parse(temp[i].ToString())); } consumable.AddProperty(key, intListValue); break; case JsonType.String: //if(IsInt(temp[0].ToString())) //{ // for (int i = 0; i < length; i++) // intListValue.Add(int.Parse(temp[i].ToString())); // consumable.AddProperty(key, intListValue); //} //else //{ for (int i = 0; i < length; i++) { strListValue.Add(temp[i].ToString()); } consumable.AddProperty(key, strListValue); // } break; case JsonType.Double: for (int i = 0; i < length; i++) { dbListValue.Add(double.Parse(temp[i].ToString())); } consumable.AddProperty(key, dbListValue); break; default: break; } } break; case JsonType.String: consumable.AddProperty(key, temp.ToString()); break; case JsonType.Int: consumable.AddProperty(key, int.Parse(temp.ToString())); break; case JsonType.Long: consumable.AddProperty(key, long.Parse(temp.ToString())); break; case JsonType.Double: consumable.AddProperty(key, double.Parse(temp.ToString())); break; case JsonType.Boolean: consumable.AddProperty(key, bool.Parse(temp.ToString())); break; default: break; } } PrototypeGoodsMenu.Add(id, consumable); break; default: throw new ArgumentException(string.Format("id {0}的框架类型错误", id)); } } } else { Debug.LogError("物品配置文件为空,插件将在你第一次存储物品信息时,自动生成配置文件。或者不使用插件直接编写。"); // throw new ArgumentException("丢失物品配置文件"); } }