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 override CraftingRecipe GetAdHocCraftingRecipe(SubsystemTerrain terrain, string[] ingredients, float heatLevel, float playerLevel) { if (heatLevel < 1f) { return(null); } List <string> list = ingredients.Where((string i) => !string.IsNullOrEmpty(i)).ToList(); if (list.Count == 2) { int num = 0; int num2 = 0; int num3 = 0; foreach (string item in list) { CraftingRecipesManager.DecodeIngredient(item, out string craftingId, out int?data); if (craftingId == BlocksManager.Blocks[203].CraftingId) { num3 = Terrain.MakeBlockValue(203, 0, data.HasValue ? data.Value : 0); } else if (craftingId == BlocksManager.Blocks[129].CraftingId) { num = Terrain.MakeBlockValue(129, 0, data.HasValue ? data.Value : 0); } else if (craftingId == BlocksManager.Blocks[128].CraftingId) { num2 = Terrain.MakeBlockValue(128, 0, data.HasValue ? data.Value : 0); } } if (num != 0 && num3 != 0) { int data2 = Terrain.ExtractData(num3); int clothingColor = GetClothingColor(data2); int clothingIndex = GetClothingIndex(data2); bool canBeDyed = GetClothingData(data2).CanBeDyed; int damage = BlocksManager.Blocks[203].GetDamage(num3); int color = PaintBucketBlock.GetColor(Terrain.ExtractData(num)); int damage2 = BlocksManager.Blocks[129].GetDamage(num); Block block = BlocksManager.Blocks[129]; Block block2 = BlocksManager.Blocks[203]; if (!canBeDyed) { return(null); } int num4 = PaintBucketBlock.CombineColors(clothingColor, color); if (num4 != clothingColor) { return(new CraftingRecipe { ResultCount = 1, ResultValue = block2.SetDamage(Terrain.MakeBlockValue(203, 0, SetClothingIndex(SetClothingColor(0, num4), clothingIndex)), damage), RemainsCount = 1, RemainsValue = BlocksManager.DamageItem(Terrain.MakeBlockValue(129, 0, color), damage2 + MathUtils.Max(block.Durability / 4, 1)), RequiredHeatLevel = 1f, Description = $"{LanguageControl.Get("BlocksManager", "Dyed")} {SubsystemPalette.GetName(terrain, color, null)}", Ingredients = (string[])ingredients.Clone() }); } } if (num2 != 0 && num3 != 0) { int data3 = Terrain.ExtractData(num3); int clothingColor2 = GetClothingColor(data3); int clothingIndex2 = GetClothingIndex(data3); bool canBeDyed2 = GetClothingData(data3).CanBeDyed; int damage3 = BlocksManager.Blocks[203].GetDamage(num3); int damage4 = BlocksManager.Blocks[128].GetDamage(num2); Block block3 = BlocksManager.Blocks[128]; Block block4 = BlocksManager.Blocks[203]; if (!canBeDyed2) { return(null); } if (clothingColor2 != 0) { return(new CraftingRecipe { ResultCount = 1, ResultValue = block4.SetDamage(Terrain.MakeBlockValue(203, 0, SetClothingIndex(SetClothingColor(0, 0), clothingIndex2)), damage3), RemainsCount = 1, RemainsValue = BlocksManager.DamageItem(Terrain.MakeBlockValue(128, 0, 0), damage4 + MathUtils.Max(block3.Durability / 4, 1)), RequiredHeatLevel = 1f, Description = LanguageControl.Get("BlocksManager", "Not Dyed") + " " + LanguageControl.Get("BlocksManager", "Clothes"), Ingredients = (string[])ingredients.Clone() }); } } } return(null); }
public override CraftingRecipe GetAdHocCraftingRecipe(SubsystemTerrain subsystemTerrain, string[] ingredients, float heatLevel, float playerLevel) { if (heatLevel < 1f) { return(null); } List <string> list = ingredients.Where((string i) => !string.IsNullOrEmpty(i)).ToList(); if (list.Count == 2) { int num = 0; int num2 = 0; int num3 = 0; foreach (string item in list) { CraftingRecipesManager.DecodeIngredient(item, out string craftingId, out int?data); if (craftingId == BlocksManager.Blocks[208].CraftingId) { num3 = Terrain.MakeBlockValue(208, 0, data.HasValue ? data.Value : 0); } else if (craftingId == BlocksManager.Blocks[129].CraftingId) { num = Terrain.MakeBlockValue(129, 0, data.HasValue ? data.Value : 0); } else if (craftingId == BlocksManager.Blocks[128].CraftingId) { num2 = Terrain.MakeBlockValue(128, 0, data.HasValue ? data.Value : 0); } } if (num != 0 && num3 != 0) { int num4 = Terrain.ExtractData(num3); int color = PaintBucketBlock.GetColor(Terrain.ExtractData(num)); int damage = BlocksManager.Blocks[129].GetDamage(num); Block block = BlocksManager.Blocks[129]; int num5 = PaintBucketBlock.CombineColors(num4, color); if (num5 != num4) { return(new CraftingRecipe { ResultCount = 1, ResultValue = Terrain.MakeBlockValue(208, 0, num5), RemainsCount = 1, RemainsValue = BlocksManager.DamageItem(Terrain.MakeBlockValue(129, 0, color), damage + MathUtils.Max(block.Durability / 4, 1)), RequiredHeatLevel = 1f, Description = $"Dye carpet {SubsystemPalette.GetName(subsystemTerrain, color, null)}", Ingredients = (string[])ingredients.Clone() }); } } if (num2 != 0 && num3 != 0) { int num6 = Terrain.ExtractData(num3); int damage2 = BlocksManager.Blocks[128].GetDamage(num2); Block block2 = BlocksManager.Blocks[128]; if (num6 != 0) { return(new CraftingRecipe { ResultCount = 1, ResultValue = Terrain.MakeBlockValue(208, 0, 0), RemainsCount = 1, RemainsValue = BlocksManager.DamageItem(Terrain.MakeBlockValue(128, 0, 0), damage2 + MathUtils.Max(block2.Durability / 4, 1)), RequiredHeatLevel = 1f, Description = "Undye carpet", Ingredients = (string[])ingredients.Clone() }); } } } return(null); }
public static CraftingRecipe GetAdHocCraftingRecipe(int index, SubsystemTerrain subsystemTerrain, string[] ingredients, float heatLevel) { if (heatLevel < 1f) { return(null); } int i = 0, num = 0; var array = new string[2]; for (; i < ingredients.Length; i++) { if (!string.IsNullOrEmpty(ingredients[i])) { if (num > 1) { return(null); } array[num] = ingredients[i]; num++; } } if (num != 2) { return(null); } num = 0; int num2 = 0; int num3 = 0; for (i = 0; i < array.Length; i++) { string item = array[i]; CraftingRecipesManager.DecodeIngredient(item, out string craftingId, out int?data); int d = data ?? 0; if (craftingId == BlocksManager.Blocks[index].CraftingId) { num3 = Terrain.MakeBlockValue(index, 0, d); } else if (craftingId == BlocksManager.Blocks[129].CraftingId) { num = Terrain.MakeBlockValue(129, 0, d); } else if (craftingId == BlocksManager.Blocks[128].CraftingId) { num2 = Terrain.MakeBlockValue(128, 0, d); } } if (num != 0 && num3 != 0) { int num4 = GetColor(Terrain.ExtractData(num3)); int color = PaintBucketBlock.GetColor(Terrain.ExtractData(num)); int num5 = PaintBucketBlock.CombineColors(num4, color); if (num5 != num4) { return(new CraftingRecipe { ResultCount = 1, ResultValue = Terrain.MakeBlockValue(index, 0, SetColor(Terrain.ExtractData(num3), num5)), RemainsCount = 1, RemainsValue = BlocksManager.DamageItem(Terrain.MakeBlockValue(129, 0, color), BlocksManager.Blocks[129].GetDamage(num) + 1), RequiredHeatLevel = 1f, Description = "Dye tool " + SubsystemPalette.GetName(subsystemTerrain, color, null), Ingredients = (string[])ingredients.Clone() }); } } if (num2 != 0 && num3 != 0) { if (GetColor(num3) != 0) { return(new CraftingRecipe { ResultCount = 1, ResultValue = Terrain.MakeBlockValue(index, 0, SetColor(Terrain.ExtractData(num3), 0)), RemainsCount = 1, RemainsValue = BlocksManager.DamageItem(128, BlocksManager.Blocks[128].GetDamage(num2) + 1), RequiredHeatLevel = 1f, Description = "Undye tool", Ingredients = (string[])ingredients.Clone() }); } } return(null); }
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); }
public override CraftingRecipe GetAdHocCraftingRecipe(SubsystemTerrain terrain, string[] ingredients, float heatLevel, float playerLevel) { if (heatLevel != 0f) { return(null); } int num = 0; int num2 = 0; int num3 = 0; List <FurnitureDesign> list = new List <FurnitureDesign>(); for (int i = 0; i < ingredients.Length; i++) { if (string.IsNullOrEmpty(ingredients[i])) { continue; } CraftingRecipesManager.DecodeIngredient(ingredients[i], out string craftingId, out int?data); if (craftingId == BlocksManager.Blocks[227].CraftingId) { FurnitureDesign design = terrain.SubsystemFurnitureBlockBehavior.GetDesign(GetDesignIndex(data.GetValueOrDefault())); if (design == null) { return(null); } list.Add(design); } else if (craftingId == BlocksManager.Blocks[142].CraftingId) { num++; } else if (craftingId == BlocksManager.Blocks[141].CraftingId) { num2++; } else { if (!(craftingId == BlocksManager.Blocks[133].CraftingId)) { return(null); } num3++; } } if (list.Count == 1 && num == 1 && num2 == 0 && num3 == 0) { FurnitureDesign furnitureDesign = list[0].Clone(); furnitureDesign.InteractionMode = FurnitureInteractionMode.ElectricButton; FurnitureDesign furnitureDesign2 = terrain.SubsystemFurnitureBlockBehavior.TryAddDesignChain(furnitureDesign, garbageCollectIfNeeded: true); if (furnitureDesign2 == null) { DisplayError(); return(null); } return(new CraftingRecipe { ResultValue = Terrain.MakeBlockValue(227, 0, SetDesignIndex(0, furnitureDesign2.Index, furnitureDesign2.ShadowStrengthFactor, furnitureDesign2.IsLightEmitter)), ResultCount = 1, Description = "Combine furniture into interactive design", Ingredients = (string[])ingredients.Clone() }); } if (list.Count == 2 && num == 0 && num2 == 1 && num3 == 0) { List <FurnitureDesign> list2 = list.Select((FurnitureDesign d) => d.Clone()).ToList(); for (int j = 0; j < list2.Count; j++) { list2[j].InteractionMode = FurnitureInteractionMode.ElectricSwitch; list2[j].LinkedDesign = list2[(j + 1) % list2.Count]; } FurnitureDesign furnitureDesign3 = terrain.SubsystemFurnitureBlockBehavior.TryAddDesignChain(list2[0], garbageCollectIfNeeded: true); if (furnitureDesign3 == null) { DisplayError(); return(null); } return(new CraftingRecipe { ResultValue = Terrain.MakeBlockValue(227, 0, SetDesignIndex(0, furnitureDesign3.Index, furnitureDesign3.ShadowStrengthFactor, furnitureDesign3.IsLightEmitter)), ResultCount = 1, Description = "Combine furniture into interactive design", Ingredients = (string[])ingredients.Clone() }); } if (list.Count >= 2 && num == 0 && num2 == 0 && num3 <= 1) { List <FurnitureDesign> list3 = list.Select((FurnitureDesign d) => d.Clone()).ToList(); for (int k = 0; k < list3.Count; k++) { list3[k].InteractionMode = ((num3 == 0) ? FurnitureInteractionMode.Multistate : FurnitureInteractionMode.ConnectedMultistate); list3[k].LinkedDesign = list3[(k + 1) % list3.Count]; } FurnitureDesign furnitureDesign4 = terrain.SubsystemFurnitureBlockBehavior.TryAddDesignChain(list3[0], garbageCollectIfNeeded: true); if (furnitureDesign4 == null) { DisplayError(); return(null); } return(new CraftingRecipe { ResultValue = Terrain.MakeBlockValue(227, 0, SetDesignIndex(0, furnitureDesign4.Index, furnitureDesign4.ShadowStrengthFactor, furnitureDesign4.IsLightEmitter)), ResultCount = 1, Description = "Combine furniture into interactive design", Ingredients = (string[])ingredients.Clone() }); } return(null); }