public override void MeasureOverride(Vector2 parentAvailableSize) { m_blockIconWidget.IsVisible = false; m_labelWidget.IsVisible = false; if (!string.IsNullOrEmpty(m_ingredient)) { CraftingRecipesManager.DecodeIngredient(m_ingredient, out string craftingId, out int?data); Block[] array = BlocksManager.FindBlocksByCraftingId(craftingId); if (array.Length != 0) { Block block = array[(int)(1.0 * Time.RealTime) % array.Length]; if (block != null) { m_blockIconWidget.Value = Terrain.MakeBlockValue(block.BlockIndex, 0, data.HasValue ? data.Value : 4); m_blockIconWidget.Light = 15; m_blockIconWidget.IsVisible = true; } } } else if (m_resultValue != 0) { m_blockIconWidget.Value = m_resultValue; m_blockIconWidget.Light = 15; m_labelWidget.Text = m_resultCount.ToString(); m_blockIconWidget.IsVisible = true; m_labelWidget.IsVisible = true; } base.MeasureOverride(parentAvailableSize); }
public List <List <int> > decodeIngredian(string[] ingredians) {//把配方解析成Block的value List <List <int> > result = new List <List <int> >(); foreach (string needname in ingredians) { List <int> values = new List <int>(); if (string.IsNullOrEmpty(needname)) { result.Add(values); continue; } if (needname.Contains(":")) { string[] split = needname.Split(':'); Block[] array = BlocksManager.FindBlocksByCraftingId(split[0]); if (array != null) { int dd = int.Parse(split[1], CultureInfo.InvariantCulture); int tt = Terrain.MakeBlockValue(array[0].BlockIndex, 0, dd); values.Add(getPosByValue(tt)); } } else { int k = 0; foreach (string element in craftids) { if (element == needname) { values.Add(k); } ++k; } } result.Add(values); } return(result); }
public static void Initialize() { if (Initialize1 != null) { Initialize1(); return; } XElement source1 = ContentManager.Get <XElement>("CraftingRecipes"); ModsManager.CombineXml(source1, ModsManager.GetEntries(".cr"), "Description", "Result", "Recipes"); IEnumerable <XElement> source2 = source1.Descendants("Recipe"); foreach (XElement item in source2) { CraftingRecipe craftingRecipe = new CraftingRecipe(); string attributeValue = XmlUtils.GetAttributeValue <string>(item, "Result"); string desc = LanguageControl.GetBlock(attributeValue, "CRDescription"); if (item.Attribute("Description") != null) { desc = XmlUtils.GetAttributeValue <string>(item, "Description"); } craftingRecipe.ResultValue = DecodeResult(attributeValue); craftingRecipe.ResultCount = XmlUtils.GetAttributeValue <int>(item, "ResultCount"); string attributeValue2 = XmlUtils.GetAttributeValue(item, "Remains", string.Empty); if (!string.IsNullOrEmpty(attributeValue2)) { craftingRecipe.RemainsValue = DecodeResult(attributeValue2); craftingRecipe.RemainsCount = XmlUtils.GetAttributeValue <int>(item, "RemainsCount"); } craftingRecipe.RequiredHeatLevel = XmlUtils.GetAttributeValue <float>(item, "RequiredHeatLevel"); craftingRecipe.RequiredPlayerLevel = XmlUtils.GetAttributeValue(item, "RequiredPlayerLevel", 1f); craftingRecipe.Description = desc; craftingRecipe.Message = XmlUtils.GetAttributeValue <string>(item, "Message", null); if (craftingRecipe.ResultCount > BlocksManager.Blocks[Terrain.ExtractContents(craftingRecipe.ResultValue)].MaxStacking) { throw new InvalidOperationException($"In recipe for \"{attributeValue}\" ResultCount is larger than max stacking of result block."); } if (craftingRecipe.RemainsValue != 0 && craftingRecipe.RemainsCount > BlocksManager.Blocks[Terrain.ExtractContents(craftingRecipe.RemainsValue)].MaxStacking) { throw new InvalidOperationException($"In Recipe for \"{attributeValue2}\" RemainsCount is larger than max stacking of remains block."); } Dictionary <char, string> dictionary = new Dictionary <char, string>(); foreach (XAttribute item2 in from a in item.Attributes() where a.Name.LocalName.Length == 1 && char.IsLower(a.Name.LocalName[0]) select a) { DecodeIngredient(item2.Value, out string craftingId, out int?data); if (BlocksManager.FindBlocksByCraftingId(craftingId).Length == 0) { throw new InvalidOperationException($"Block with craftingId \"{item2.Value}\" not found."); } if (data.HasValue && (data.Value < 0 || data.Value > 262143)) { throw new InvalidOperationException($"Data in recipe ingredient \"{item2.Value}\" must be between 0 and 0x3FFFF."); } dictionary.Add(item2.Name.LocalName[0], item2.Value); } string[] array = item.Value.Trim().Split(new string[] { "\n" }, StringSplitOptions.None); for (int i = 0; i < array.Length; i++) { int num = array[i].IndexOf('"'); int num2 = array[i].LastIndexOf('"'); if (num < 0 || num2 < 0 || num2 <= num) { throw new InvalidOperationException("Invalid recipe line."); } string text = array[i].Substring(num + 1, num2 - num - 1); for (int j = 0; j < text.Length; j++) { char c = text[j]; if (char.IsLower(c)) { string text2 = dictionary[c]; craftingRecipe.Ingredients[j + i * 3] = text2; } } } m_recipes.Add(craftingRecipe); } Block[] blocks = BlocksManager.Blocks; foreach (Block block in blocks) { m_recipes.AddRange(block.GetProceduralCraftingRecipes()); } m_recipes.Sort(delegate(CraftingRecipe r1, CraftingRecipe r2) { int y = r1.Ingredients.Count((string s) => !string.IsNullOrEmpty(s)); int x = r2.Ingredients.Count((string s) => !string.IsNullOrEmpty(s)); return(Comparer <int> .Default.Compare(x, y)); }); }
public static void Initialize() { m_recipes = new List <CraftingRecipe>(); for (var i = ContentManager.CombineXml(ContentManager.Get <XElement>("CraftingRecipes"), ModsManager.GetEntries(".cr"), "Description", "Result", "Recipes").Descendants("Recipe").GetEnumerator(); i.MoveNext();) { var descendant = i.Current; var recipe = new CraftingRecipe(); var attributeValue1 = XmlUtils.GetAttributeValue <string>(descendant, "Result"); recipe.ResultValue = DecodeResult(attributeValue1); recipe.ResultCount = XmlUtils.GetAttributeValue <int>(descendant, "ResultCount"); var attributeValue2 = XmlUtils.GetAttributeValue(descendant, "Remains", string.Empty); if (!string.IsNullOrEmpty(attributeValue2)) { recipe.RemainsValue = DecodeResult(attributeValue2); recipe.RemainsCount = XmlUtils.GetAttributeValue <int>(descendant, "RemainsCount"); } recipe.RequiredHeatLevel = XmlUtils.GetAttributeValue <float>(descendant, "RequiredHeatLevel"); recipe.Description = XmlUtils.GetAttributeValue <string>(descendant, "Description"); if (recipe.ResultCount > BlocksManager.Blocks[Terrain.ExtractContents(recipe.ResultValue)].MaxStacking) { throw new InvalidOperationException(string.Format( "In recipe for \"{0}\" ResultCount is larger than max stacking of result block.", new object[1] { attributeValue1 })); } if (recipe.RemainsValue != 0 && recipe.RemainsCount > BlocksManager.Blocks[Terrain.ExtractContents(recipe.RemainsValue)].MaxStacking) { throw new InvalidOperationException(string.Format( "In Recipe for \"{0}\" RemainsCount is larger than max stacking of remains block.", new object[1] { attributeValue2 })); } var dictionary = new Dictionary <char, string>(); foreach (var xattribute in descendant.Attributes().Where(a => a.Name.LocalName.Length == 1 && char.IsLower(a.Name.LocalName[0]))) { string craftingId; int? data; DecodeIngredient(xattribute.Value, out craftingId, out data); if (BlocksManager.FindBlocksByCraftingId(craftingId).Length == 0) { throw new InvalidOperationException(string.Format("Block with craftingId \"{0}\" not found.", new object[1] { xattribute.Value })); } if (data.HasValue && (data.Value < 0 || data.Value > 262143)) { throw new InvalidOperationException(string.Format( "Data in recipe ingredient \"{0}\" must be between 0 and 0x3FFFF.", new object[1] { xattribute.Value })); } dictionary.Add(xattribute.Name.LocalName[0], xattribute.Value); } var strArray = descendant.Value.Trim().Split('\n'); for (var index1 = 0; index1 < strArray.Length; ++index1) { var num1 = strArray[index1].IndexOf('"'); var num2 = strArray[index1].LastIndexOf('"'); if (num1 < 0 || num2 < 0 || num2 <= num1) { throw new InvalidOperationException("Invalid recipe line."); } var str1 = strArray[index1].Substring(num1 + 1, num2 - num1 - 1); for (var index2 = 0; index2 < str1.Length; ++index2) { var c = str1[index2]; if (char.IsLower(c)) { recipe.Ingredients[index2 + index1 * 3] = dictionary[c]; } } } m_recipes.Add(recipe); } var blocks = BlocksManager.Blocks; for (int i = 0; i < blocks.Length; i++) { m_recipes.AddRange(blocks[i].GetProceduralCraftingRecipes()); } m_recipes.Sort((r1, r2) => { return(Comparer <int> .Default.Compare(r2.Ingredients.Count(s => !string.IsNullOrEmpty(s)), r1.Ingredients.Count(s => !string.IsNullOrEmpty(s)))); }); }
public static void CRInitialize() { CraftingRecipesManager.m_recipes = new List <CraftingRecipe>(); var recipes = new List <CraftingRecipe>(); var enumerator = ContentManager.CombineXml(ContentManager.Get <XElement>("CraftingRecipes"), ModsManager.GetEntries(".cr"), "Description", "Result", "Recipes").Descendants("Recipe").GetEnumerator(); while (enumerator.MoveNext()) { XElement xelement = enumerator.Current; var craftingRecipe = new CraftingRecipe { Ingredients = new string[36] }; string attributeValue = XmlUtils.GetAttributeValue <string>(xelement, "Result"); craftingRecipe.ResultValue = CraftingRecipesManager.DecodeResult(attributeValue); craftingRecipe.ResultCount = XmlUtils.GetAttributeValue <int>(xelement, "ResultCount"); string attributeValue2 = XmlUtils.GetAttributeValue(xelement, "Remains", string.Empty); if (!string.IsNullOrEmpty(attributeValue2)) { craftingRecipe.RemainsValue = CraftingRecipesManager.DecodeResult(attributeValue2); craftingRecipe.RemainsCount = XmlUtils.GetAttributeValue <int>(xelement, "RemainsCount"); } craftingRecipe.RequiredHeatLevel = XmlUtils.GetAttributeValue <float>(xelement, "RequiredHeatLevel"); craftingRecipe.Description = XmlUtils.GetAttributeValue <string>(xelement, "Description"); if (craftingRecipe.ResultCount > BlocksManager.Blocks[Terrain.ExtractContents(craftingRecipe.ResultValue)].MaxStacking) { throw new InvalidOperationException($"In recipe for \"{attributeValue}\" ResultCount is larger than max stacking of result block."); } if (craftingRecipe.RemainsValue != 0 && craftingRecipe.RemainsCount > BlocksManager.Blocks[Terrain.ExtractContents(craftingRecipe.RemainsValue)].MaxStacking) { throw new InvalidOperationException($"In Recipe for \"{attributeValue2}\" RemainsCount is larger than max stacking of remains block."); } var dictionary = new Dictionary <char, string>(); foreach (XAttribute item in xelement.Attributes().Where(CraftingRecipesManager.c._.Initialize_b__3_1)) { CraftingRecipesManager.DecodeIngredient(item.Value, out string craftingId, out int?data); if (BlocksManager.FindBlocksByCraftingId(craftingId).Length == 0) { throw new InvalidOperationException($"Block with craftingId \"{item.Value}\" not found."); } if (data.HasValue && (data.Value < 0 || data.Value > 262143)) { throw new InvalidOperationException($"Data in recipe ingredient \"{item.Value}\" must be between 0 and 0x3FFFF."); } dictionary.Add(item.Name.LocalName[0], item.Value); } string[] array = xelement.Value.Trim().Split('\n'); string[] ingredients = craftingRecipe.Ingredients; for (int i = 0; i < array.Length; i++) { int num2 = array[i].IndexOf('"'); int num3 = array[i].LastIndexOf('"'); if (num2 < 0 || num3 < 0 || num3 <= num2) { throw new InvalidOperationException("Invalid recipe line."); } string text = array[i].Substring(num2 + 1, num3 - num2 - 1); for (int j = 0; j < text.Length; j++) { char c = text[j]; if (char.IsLower(c)) { string text2 = dictionary[c]; if (ItemBlock.IdTable.TryGetValue(text2, out int value)) { text2 = BlocksManager.Blocks[Terrain.ExtractContents(value)].CraftingId + ":" + Terrain.ExtractData(value); } ingredients[j + i * 6] = text2; } } } CraftingRecipesManager.m_recipes.Add(craftingRecipe); if (craftingRecipe.RequiredHeatLevel >= 300f) { CraftingRecipesManager.DecodeIngredient(ingredients[0], out string craftingId, out int?num); if (!num.HasValue) { continue; } recipes.Add(new CraftingRecipe { ResultValue = Terrain.ReplaceData(BlocksManager.FindBlocksByCraftingId(craftingId)[0].BlockIndex, num.Value), ResultCount = GetCount(ingredients), RemainsValue = craftingRecipe.RemainsValue, RemainsCount = craftingRecipe.RemainsCount, RequiredHeatLevel = 1f, Ingredients = (string[])ingredients.Clone(), Description = craftingRecipe.Description + Utils.Get(" (温度过低)") }); } } var blocks = BlocksManager.Blocks; for (int i = 0; i < blocks.Length; i++) { using (var enumerator2 = blocks[i].GetProceduralCraftingRecipes().GetEnumerator()) while (enumerator2.MoveNext()) { var old = enumerator2.Current.Ingredients; if (old.Length == 9) { var ingredients = new string[36]; ingredients[0] = old[0]; ingredients[1] = old[1]; ingredients[2] = old[2]; ingredients[6] = old[3]; ingredients[7] = old[4]; ingredients[8] = old[5]; ingredients[12] = old[6]; ingredients[13] = old[7]; ingredients[14] = old[8]; enumerator2.Current.Ingredients = ingredients; } CraftingRecipesManager.m_recipes.Add(enumerator2.Current); } } CraftingRecipesManager.m_recipes.Sort(CraftingRecipesManager.c._.Initialize_b__3_0); CraftingRecipesManager.m_recipes.AddRange(recipes); }