using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using FeastPlanner.Config; using FeastPlanner.Core; using FeastPlanner.Runtime; using FeastPlanner.UI; using Jotunn.Managers; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("FeastPlanner")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3d86f14e8a42c9e6f2d9b8523fed2e3759fd3cf6")] [assembly: AssemblyProduct("FeastPlanner")] [assembly: AssemblyTitle("FeastPlanner")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace FeastPlanner { [BepInPlugin("com.valheimmodlab.feastplanner", "Feast Planner", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [DefaultExecutionOrder(-900)] public sealed class Plugin : BaseUnityPlugin { public const string PluginGuid = "com.valheimmodlab.feastplanner"; public const string PluginName = "Feast Planner"; public const string PluginVersion = "1.0.0"; private FeastPlannerConfig? _config; private FeastPlannerController? _controller; private FeastPlannerShell? _shell; private ManualLogSource? _log; private void Awake() { //IL_0134: Unknown result type (might be due to invalid IL or missing references) _log = ((BaseUnityPlugin)this).Logger; _config = FeastPlannerConfig.Bind(((BaseUnityPlugin)this).Config); FoodTierTable tierTable = VanillaFoodTierTable.CreateDefault(); JsonSavedMealStore savedMealStore = new JsonSavedMealStore(Path.Combine(Paths.ConfigPath, "FeastPlanner", "custom-meals-v1.json")); _controller = new FeastPlannerController(new ValheimFoodLoader(tierTable), new ValheimInventoryReader(), new ValheimContainerReader(new ContainerInventoryScanner(new ContainerScanRules(_config.ContainerScanRadius.Value, _config.ContainerScanMaxContainers.Value, _config.ContainerScanCooldownSeconds.Value))), new ValheimKnowledgeReader(), new ValheimActiveFoodReader(), new FeastRecommendationEngine(tierTable), tierTable, savedMealStore); _shell = new FeastPlannerShell(((BaseUnityPlugin)this).Logger, (PlannerRole role, TargetBiome biome) => _controller.BuildViewModel(role, biome), delegate(PlannerViewMode mode) { _controller.SetMode(mode); }, delegate(string mealId) { _controller.SelectSavedMeal(mealId); }, delegate { _controller.DeleteSelectedMeal(); }, delegate(string name) { _controller.RenameSelectedMeal(name); }, delegate(int slotIndex, string foodPrefabName, PlannerRole role, TargetBiome biome) { _controller.AssignFoodToSlot(slotIndex, foodPrefabName, role, biome); }, delegate(string? savedMealId, string name, IReadOnlyList foodPrefabNames, PlannerRole role, TargetBiome biome) { _controller.SaveCustomMealDraft(savedMealId, name, foodPrefabNames, role, biome); }); _shell.Register(); ((BaseUnityPlugin)this).Logger.LogInfo((object)string.Format("{0} {1} loaded. Press {2} to open the planner.", "Feast Planner", "1.0.0", _config.TogglePlanner.Value)); } private void OnDestroy() { _shell?.Dispose(); } private void Update() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) if (_config == null) { return; } KeyboardShortcut value = _config.TogglePlanner.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { try { _controller?.RefreshCatalog(); } catch (Exception arg) { ManualLogSource? log = _log; if (log != null) { log.LogError((object)$"Failed to refresh Feast Planner catalog: {arg}"); } } try { _shell?.Toggle(); } catch (Exception arg2) { ManualLogSource? log2 = _log; if (log2 != null) { log2.LogError((object)$"Failed to toggle Feast Planner shell: {arg2}"); } } } FeastPlannerShell? shell = _shell; if (shell != null && shell.IsOpen && Input.GetKeyDown((KeyCode)27)) { _shell.Close(); } _shell?.UpdateInputBlock(); } } } namespace FeastPlanner.UI { public sealed class CustomEditDraft { public string? SavedMealId { get; } public string Name { get; } public IReadOnlyList Slots { get; } public IReadOnlyList FoodPrefabNames => new ReadOnlyCollection(Slots.Where((string slot) => !string.IsNullOrWhiteSpace(slot)).ToList()); public bool HasUnsavedChanges { get; } public bool RequiresDiscardConfirmation => HasUnsavedChanges; public string DiscardText { get { if (!RequiresDiscardConfirmation) { return string.Empty; } return "Discard changes?"; } } private CustomEditDraft(string? savedMealId, string name, IEnumerable slots, bool hasUnsavedChanges) { SavedMealId = savedMealId; Name = SavedMealLibrary.CleanName(name); Slots = new ReadOnlyCollection(NormalizeSlots(slots).ToList()); HasUnsavedChanges = hasUnsavedChanges; } public static CustomEditDraft New(string name) { return new CustomEditDraft(null, name, Array.Empty(), hasUnsavedChanges: false); } public static CustomEditDraft FromSavedMeal(SavedMeal meal) { return new CustomEditDraft(meal.Id, meal.Name, meal.FoodPrefabNames, hasUnsavedChanges: false); } public static CustomEditDraft FromValues(string? savedMealId, string name, IEnumerable foodPrefabNames) { return new CustomEditDraft(savedMealId, name, foodPrefabNames, hasUnsavedChanges: false); } public CustomEditDraft WithName(string name) { return new CustomEditDraft(SavedMealId, name, Slots, hasUnsavedChanges: true); } public CustomEditDraft WithSlot(int slotIndex, string foodPrefabName) { if (slotIndex < 0 || slotIndex >= 3) { return this; } List list = Slots.ToList(); list[slotIndex] = (foodPrefabName ?? string.Empty).Trim(); return new CustomEditDraft(SavedMealId, Name, list, hasUnsavedChanges: true); } public CustomEditDraft ClearDraft() { return new CustomEditDraft(SavedMealId, Name, Array.Empty(), hasUnsavedChanges: true); } public CustomEditDraft MarkSaved(string savedMealId) { return new CustomEditDraft(savedMealId, Name, Slots, hasUnsavedChanges: false); } private static IEnumerable NormalizeSlots(IEnumerable slots) { List list = (from slot in (slots ?? Array.Empty()).Take(3) select slot?.Trim() ?? string.Empty).ToList(); while (list.Count < 3) { list.Add(string.Empty); } return list; } } public sealed class CustomFoodPickerProjection { public IReadOnlyList Rows { get; } public FoodPickerRow? PreviewRow { get; } public int PageIndex { get; } public int PageCount { get; } public bool HasPreviousPage => PageIndex > 0; public bool HasNextPage => PageIndex + 1 < PageCount; public string PageText => $"Page {PageIndex + 1}/{PageCount}"; private CustomFoodPickerProjection(IReadOnlyList rows, FoodPickerRow? previewRow, int pageIndex, int pageCount) { Rows = rows; PreviewRow = previewRow; PageIndex = pageIndex; PageCount = pageCount; } public static CustomFoodPickerProjection From(IEnumerable visibleFoods, string searchText, FoodPickerCategory category, TargetBiome? biomeFilter, int pageIndex, int pageSize, string? previewPrefabName = null) { int num = Math.Max(1, pageSize); List list = SavedMealFoodPicker.Filter(visibleFoods, searchText, biomeFilter, category).ToList(); int num2 = Math.Max(1, (int)Math.Ceiling((double)list.Count / (double)num)); int num3 = Math.Max(0, Math.Min(pageIndex, num2 - 1)); List source = list.Skip(num3 * num).Take(num).ToList(); FoodDefinition previewFood = source.FirstOrDefault((FoodDefinition food) => string.Equals(food.PrefabName, previewPrefabName, StringComparison.OrdinalIgnoreCase)) ?? source.FirstOrDefault(); List list2 = source.Select((FoodDefinition food) => FoodPickerRow.From(food, previewFood != null && string.Equals(food.PrefabName, previewFood.PrefabName, StringComparison.OrdinalIgnoreCase))).ToList(); return new CustomFoodPickerProjection(previewRow: list2.FirstOrDefault((FoodPickerRow row) => row.IsPreviewed), rows: new ReadOnlyCollection(list2), pageIndex: num3, pageCount: num2); } } public sealed class FoodPickerRow { private sealed class PickerIngredientPreviewBuilder { public string PrefabName { get; } public string DisplayName { get; } public Sprite? Icon { get; } public int Amount { get; set; } public PickerIngredientPreviewBuilder(string prefabName, string displayName, Sprite? icon) { PrefabName = prefabName; DisplayName = displayName; Icon = icon; } public PickerIngredientPreview ToPreview() { return new PickerIngredientPreview(PrefabName, DisplayName, Amount, Icon); } } public string PrefabName { get; } public string DisplayName { get; } public string DisplayText { get; } public string StatsText { get; } public string HealingText { get; } public string DurationText { get; } public string InlineStatsText { get; } public IReadOnlyList Ingredients { get; } public IReadOnlyList IngredientTexts => Ingredients.Select((PickerIngredientPreview ingredient) => ingredient.DisplayText).ToList(); public bool IsPreviewed { get; } public Sprite? Icon { get; } private FoodPickerRow(string prefabName, string displayName, string displayText, string statsText, string healingText, string durationText, string inlineStatsText, IReadOnlyList ingredients, bool isPreviewed, Sprite? icon) { PrefabName = prefabName; DisplayName = displayName; DisplayText = displayText; StatsText = statsText; HealingText = healingText; DurationText = durationText; InlineStatsText = inlineStatsText; Ingredients = ingredients; IsPreviewed = isPreviewed; Icon = icon; } public static FoodPickerRow From(FoodDefinition food, bool isPreviewed = false) { return new FoodPickerRow(food.PrefabName, food.DisplayName, TruncateText(food.DisplayName, 30), $"H{food.Stats.Health:0} S{food.Stats.Stamina:0} E{food.Stats.Eitr:0}", $"HP/s {food.Stats.Healing:0.#}", FormatDuration(food.Stats.Duration), $"H{food.Stats.Health:0} S{food.Stats.Stamina:0} E{food.Stats.Eitr:0} HP/s {food.Stats.Healing:0.#} {FormatDuration(food.Stats.Duration)}", FlattenIngredients(food.Ingredients), isPreviewed, food.Icon); } private static IReadOnlyList FlattenIngredients(IReadOnlyList ingredients) { Dictionary flattened = new Dictionary(StringComparer.OrdinalIgnoreCase); List list = new List(); foreach (FoodIngredient ingredient in ingredients) { AddFlattenedIngredient(flattened, list, ingredient, ingredient.Amount); } return list.Select((PickerIngredientPreviewBuilder value) => value.ToPreview()).ToList(); } private static void AddFlattenedIngredient(Dictionary flattened, List ordered, FoodIngredient ingredient, int requiredAmount) { if (ingredient.HasRecipe) { int num = (int)Math.Ceiling((double)requiredAmount / (double)ingredient.OutputAmount); { foreach (FoodIngredient recipeIngredient in ingredient.RecipeIngredients) { AddFlattenedIngredient(flattened, ordered, recipeIngredient, recipeIngredient.Amount * num); } return; } } if (!flattened.TryGetValue(ingredient.PrefabName, out PickerIngredientPreviewBuilder value)) { value = new PickerIngredientPreviewBuilder(ingredient.PrefabName, ingredient.DisplayName, ingredient.Icon); ordered.Add(value); } value.Amount += requiredAmount; flattened[ingredient.PrefabName] = value; } private static string FormatDuration(float durationSeconds) { int num = Math.Max(0, (int)Math.Round(durationSeconds / 60f)); return $"{num}m"; } private static string TruncateText(string value, int maxCharacters) { if (value.Length <= maxCharacters) { return value; } if (maxCharacters > 3) { return value.Substring(0, maxCharacters - 3) + "..."; } return value.Substring(0, maxCharacters); } } public sealed class PickerIngredientPreview { public string PrefabName { get; } public string DisplayName { get; } public int Amount { get; } public Sprite? Icon { get; } public string DisplayText => $"{DisplayName} x{Amount:0}"; public PickerIngredientPreview(string prefabName, string displayName, int amount, Sprite? icon) { PrefabName = prefabName; DisplayName = displayName; Amount = Math.Max(0, amount); Icon = icon; } } public sealed class CustomPlanProjection { private const int MaxRows = 8; public IReadOnlyList Rows { get; } private CustomPlanProjection(IEnumerable rows) { Rows = new ReadOnlyCollection(rows.Take(8).ToList()); } public static CustomPlanProjection From(FeastPlannerViewModel model, string activeTargetName, string? pendingDeleteSavedMealId) { Dictionary visibleByPrefab = model.VisibleFoods.GroupBy((FoodDefinition food) => food.PrefabName, StringComparer.OrdinalIgnoreCase).ToDictionary, string, FoodDefinition>((IGrouping group) => group.Key, (IGrouping group) => group.First(), StringComparer.OrdinalIgnoreCase); return new CustomPlanProjection(model.SavedMeals.Select((SavedMeal meal) => CustomPlanRow.From(meal, visibleByPrefab, string.Equals(meal.Id, model.SelectedSavedMealId, StringComparison.OrdinalIgnoreCase), string.Equals(meal.Name, activeTargetName, StringComparison.OrdinalIgnoreCase), string.Equals(meal.Id, pendingDeleteSavedMealId, StringComparison.OrdinalIgnoreCase)))); } } public sealed class CustomPlanRow { public string Id { get; } public string Name { get; } public IReadOnlyList Foods { get; } public FoodStats Totals { get; } public string FoodsText { get; } public string StatsText { get; } public string DurationText { get; } public string ReadinessText { get; } public bool IsSelected { get; } public bool IsActive { get; } public bool IsDeletePending { get; } private CustomPlanRow(string id, string name, IReadOnlyList foods, FoodStats totals, string foodsText, string statsText, string durationText, string readinessText, bool isSelected, bool isActive, bool isDeletePending) { Id = id; Name = name; Foods = foods; Totals = totals; FoodsText = foodsText; StatsText = statsText; DurationText = durationText; ReadinessText = readinessText; IsSelected = isSelected; IsActive = isActive; IsDeletePending = isDeletePending; } public static CustomPlanRow From(SavedMeal meal, IReadOnlyDictionary visibleByPrefab, bool isSelected, bool isActive, bool isDeletePending) { List list = new List(); List list2 = new List(); int num = 0; foreach (string foodPrefabName in meal.FoodPrefabNames) { if (visibleByPrefab.TryGetValue(foodPrefabName, out FoodDefinition value)) { list.Add(value); list2.Add(value.DisplayName); } else { num++; list2.Add("Hidden saved food"); } } FoodStats foodStats = Total(list); string readinessText = ((list.Count == 0) ? "Unavailable" : ((num > 0) ? "Warnings" : "Saved")); return new CustomPlanRow(meal.Id, meal.Name, new ReadOnlyCollection(list), foodStats, string.Join(", ", list2), FormatStats(foodStats), FormatDuration(foodStats.Duration), readinessText, isSelected, isActive, isDeletePending); } private static FoodStats Total(IEnumerable foods) { List list = foods.ToList(); return new FoodStats(list.Sum((FoodDefinition food) => food.Stats.Health), list.Sum((FoodDefinition food) => food.Stats.Stamina), list.Sum((FoodDefinition food) => food.Stats.Eitr), list.Sum((FoodDefinition food) => food.Stats.Healing), (list.Count == 0) ? 0f : list.Min((FoodDefinition food) => food.Stats.Duration)); } private static string FormatStats(FoodStats stats) { return $"H {stats.Health:0} S {stats.Stamina:0} E {stats.Eitr:0}"; } private static string FormatDuration(float seconds) { if (!(seconds <= 0f)) { return $"{Math.Round(seconds / 60f):0}m"; } return "0m"; } } public sealed class FeastPlannerShell : IDisposable { private const float PanelWidth = 1260f; private const float PanelHeight = 640f; private const float HeaderHeight = 74f; private const float ActiveStripHeight = 64f; private const float FooterHeight = 58f; private const float Gutter = 18f; private const float LeftColumnRatio = 0.48f; private const float BodyPanelHeightBonus = 36f; private const float BodyPanelYOffset = 0f; private const int RecommendedRowCount = 8; private const int CustomRowCount = 8; private const int MaxCustomEditIngredientChips = 3; private readonly ManualLogSource _log; private readonly Func _buildViewModel; private readonly Action _setPlannerMode; private readonly Action _selectSavedMeal; private readonly Action _deleteSavedMeal; private readonly Action _renameSavedMeal; private readonly Action _assignFoodToSlot; private readonly Action, PlannerRole, TargetBiome> _saveCustomMealDraft; private GameObject? _root; private Text? _activeTargetLabelText; private Text? _activeTargetText; private Text? _activeTargetHealthValueText; private Text? _activeTargetStaminaValueText; private Text? _activeTargetEitrValueText; private Text? _activeTargetDurationText; private Text? _activeTargetStatusText; private GameObject? _roleControlRoot; private GameObject? _biomeControlRoot; private GameObject? _recommendedTabButton; private GameObject? _customTabButton; private Text? _roleControlText; private Text? _biomeControlText; private GameObject? _roleDropdownRoot; private GameObject? _biomeDropdownRoot; private GameObject? _cookableToggleRoot; private Text? _cookableToggleText; private Text? _setActiveText; private Text? _clearActiveText; private GameObject? _deleteCustomButton; private Text? _deleteCustomText; private GameObject? _editCustomButton; private GameObject? _newCustomButton; private GameObject? _saveCustomButton; private GameObject? _clearDraftButton; private GameObject? _discardButton; private Text? _discardText; private Text? _detailsTitleText; private Text? _totalStatsText; private Text? _detailsDurationText; private Text? _ingredientSummaryText; private Text? _detailsHealthText; private Text? _detailsStaminaText; private Text? _detailsEitrText; private Text? _detailsHealthValueText; private Text? _detailsStaminaValueText; private Text? _detailsEitrValueText; private readonly Text?[] _foodDetailTexts = (Text?[])(object)new Text[3]; private readonly Text?[] _ingredientDetailTexts = (Text?[])(object)new Text[6]; private readonly Text?[] _rowNameTexts = (Text?[])(object)new Text[8]; private readonly Text?[] _rowStatsTexts = (Text?[])(object)new Text[8]; private readonly Text?[] _rowDurationTexts = (Text?[])(object)new Text[8]; private readonly Text?[] _rowStatusTexts = (Text?[])(object)new Text[8]; private readonly GameObject?[] _rowButtons = (GameObject?[])(object)new GameObject[8]; private readonly Image?[,] _rowFoodIcons = new Image[8, 3]; private readonly Text?[] _customRowNameTexts = (Text?[])(object)new Text[8]; private readonly Text?[] _customRowStatsTexts = (Text?[])(object)new Text[8]; private readonly Text?[] _customRowDurationTexts = (Text?[])(object)new Text[8]; private readonly Text?[] _customRowStatusTexts = (Text?[])(object)new Text[8]; private readonly Image?[,] _customRowFoodIcons = new Image[8, 3]; private readonly Text?[] _slotButtonTexts = (Text?[])(object)new Text[3]; private readonly Text?[] _slotPrimaryTexts = (Text?[])(object)new Text[3]; private readonly Text?[] _slotStatsTexts = (Text?[])(object)new Text[3]; private readonly Image?[] _slotFoodIcons = (Image?[])(object)new Image[3]; private readonly Image?[] _customEditSlotShades = (Image?[])(object)new Image[3]; private readonly Image?[,] _slotIngredientIcons = new Image[3, 3]; private readonly Text?[,] _slotIngredientTexts = new Text[3, 3]; private readonly Text?[] _pickerRowTexts = (Text?[])(object)new Text[5]; private readonly Image?[] _pickerRowIcons = (Image?[])(object)new Image[5]; private readonly GameObject?[] _pickerRowButtons = (GameObject?[])(object)new GameObject[5]; private readonly Image?[] _foodDetailIcons = (Image?[])(object)new Image[3]; private readonly Image?[] _foodDetailCardShades = (Image?[])(object)new Image[3]; private readonly Image?[] _ingredientDetailIcons = (Image?[])(object)new Image[6]; private readonly Image?[] _activeTargetFoodIcons = (Image?[])(object)new Image[3]; private readonly List _detailsControls = new List(); private readonly List _customEditControls = new List(); private readonly List _pickerControls = new List(); private GameObject? _pickerMenuRoot; private InputField? _customNameInput; private InputField? _pickerSearchInput; private Text? _pickerCategoryText; private Text? _pickerBiomeText; private Text? _pickerDetailTitleText; private Text? _pickerDetailStatsText; private Image? _pickerDetailIcon; private GameObject? _addPickerFoodButton; private GameObject? _pickerCategoryDropdownRoot; private GameObject? _pickerBiomeDropdownRoot; private Text? _pickerPageText; private readonly Image?[] _pickerIngredientIcons = (Image?[])(object)new Image[6]; private readonly Text?[] _pickerIngredientTexts = (Text?[])(object)new Text[6]; private RecommendedPlanProjection? _projection; private CustomPlanProjection? _customProjection; private CustomFoodPickerProjection? _pickerProjection; private FeastPlannerViewModel? _latestModel; private CustomEditDraft? _editDraft; private RecommendedPlanRow? _selectedRow; private CustomPlanRow? _selectedCustomRow; private int? _selectedCustomFoodIndex; private MealCraftability _currentCraftability = MealCraftability.Empty; private string _activeTargetName = string.Empty; private string? _pendingDeleteSavedMealId; private int? _editingSlotIndex; private string? _pickerPreviewPrefabName; private int _pickerPageIndex; private int _lastDetailsFoodCount; private PlannerRole _selectedRole = PlannerRole.Balanced; private TargetBiome _selectedBiome; private PlannerViewMode _selectedMode; private FoodPickerCategory _pickerCategory; private TargetBiome? _pickerBiomeFilter; private bool _discardPending; private bool _isCustomEditing; private bool _cookableOnly; private bool _openRequested; private bool _registered; public bool IsOpen { get { if (RootExists()) { return _root.activeSelf; } return false; } } public FeastPlannerShell(ManualLogSource log, Func buildViewModel, Action? setPlannerMode = null, Action? selectSavedMeal = null, Action? deleteSavedMeal = null, Action? renameSavedMeal = null, Action? assignFoodToSlot = null, Action, PlannerRole, TargetBiome>? saveCustomMealDraft = null) { _log = log; _buildViewModel = buildViewModel; _setPlannerMode = setPlannerMode ?? ((Action)delegate { }); _selectSavedMeal = selectSavedMeal ?? ((Action)delegate { }); _deleteSavedMeal = deleteSavedMeal ?? ((Action)delegate { }); _renameSavedMeal = renameSavedMeal ?? ((Action)delegate { }); _assignFoodToSlot = assignFoodToSlot ?? ((Action)delegate { }); _saveCustomMealDraft = saveCustomMealDraft ?? ((Action, PlannerRole, TargetBiome>)delegate { }); } public void Register() { if (!_registered) { GUIManager.OnCustomGUIAvailable += CreateOnGuiAvailable; _registered = true; } } public void Toggle() { SetOpen(!IsOpen); } public void Close() { SetOpen(open: false); } public void SetOpen(bool open) { _openRequested = open; if (!open) { UpdateInputBlock(); if (RootExists()) { _root.SetActive(false); } else { ForgetRoot(); } return; } if (!CanShowPanel()) { _openRequested = false; if (RootExists()) { _root.SetActive(false); } else { ForgetRoot(); } _log.LogDebug((object)"Feast Planner shell open ignored because Valheim HUD/player state is not ready."); return; } if (!RootExists()) { ForgetRoot(); CreateOnGuiAvailable(); } if (RootExists()) { _root.SetActive(true); RefreshRecommendedRows(); } } public void Dispose() { UpdateInputBlock(); if (_registered) { GUIManager.OnCustomGUIAvailable -= CreateOnGuiAvailable; _registered = false; } if (RootExists()) { Object.Destroy((Object)(object)_root); } ForgetRoot(); } private static bool CanShowPanel() { if (GUIManager.CustomGUIFront != null && Player.m_localPlayer != null) { return Hud.instance != null; } return false; } private void CreateOnGuiAvailable() { try { if (_openRequested && !RootExists() && GUIManager.CustomGUIFront != null) { ForgetRoot(); Create(GUIManager.CustomGUIFront.transform); } } catch (Exception arg) { _log.LogError((object)$"Failed to create Feast Planner shell: {arg}"); } } private void Create(Transform parent) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02cf: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Unknown result type (might be due to invalid IL or missing references) //IL_0310: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Unknown result type (might be due to invalid IL or missing references) //IL_0351: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Unknown result type (might be due to invalid IL or missing references) //IL_03d9: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_041f: Unknown result type (might be due to invalid IL or missing references) //IL_0440: Unknown result type (might be due to invalid IL or missing references) //IL_0452: Unknown result type (might be due to invalid IL or missing references) //IL_0473: Unknown result type (might be due to invalid IL or missing references) //IL_0485: Unknown result type (might be due to invalid IL or missing references) //IL_04f3: Unknown result type (might be due to invalid IL or missing references) //IL_050a: Unknown result type (might be due to invalid IL or missing references) //IL_0529: Unknown result type (might be due to invalid IL or missing references) GUIManager instance = GUIManager.Instance; _root = instance.CreateWoodpanel(parent, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, 1260f, 640f, false); ((Object)_root).name = "FeastPlanner_V06Shell"; CreateShade(_root.transform, "FeastPlanner_RootShade", Vector2.zero, 1224f, 604f, new Color(0.08f, 0.05f, 0.03f, 0.26f)); CreateHeader(); CreateRegion("FeastPlanner_ActiveStrip", new Vector2(0f, 218f), 1224f, 64f); CreateShade(_root.transform, "FeastPlanner_ActiveIdentityTray", new Vector2(-480f, 218f), 214f, 44f, ActiveTraySurface()); CreateShade(_root.transform, "FeastPlanner_ActiveFoodTray", new Vector2(-268f, 218f), 132f, 44f, ActiveTraySurface()); CreateShade(_root.transform, "FeastPlanner_ActiveStatsTray", new Vector2(28f, 218f), 350f, 44f, ActiveTraySurface()); for (int i = 0; i < 2; i++) { CreateShade(_root.transform, $"FeastPlanner_ActiveStatDivider_{i + 1}", new Vector2(-24f + (float)i * 118f, 218f), 2f, 32f, SummaryRuleSurface()); } CreateShade(_root.transform, "FeastPlanner_ActiveStatusBadge", new Vector2(474f, 218f), 168f, 44f, ActiveBadgeSurface()); _activeTargetLabelText = CreateLabel("Active", new Vector2(-548f, 229f), 82f, 18f, 12, instance.ValheimBeige, (TextAnchor)3); _activeTargetText = CreateLabel("none", new Vector2(-468f, 210f), 180f, 30f, 18, instance.ValheimYellow, (TextAnchor)3); for (int j = 0; j < _activeTargetFoodIcons.Length; j++) { _activeTargetFoodIcons[j] = CreateIconSlot(_root.transform, new Vector2(-304f + (float)j * 36f, 218f), 28f); } CreateLabel("Health", new Vector2(-122f, 231f), 74f, 16f, 11, new Color(1f, 0.34f, 0.3f, 0.92f), (TextAnchor)4); CreateLabel("Stamina", new Vector2(-4f, 231f), 86f, 16f, 11, new Color(1f, 0.68f, 0.12f, 0.92f), (TextAnchor)4); CreateLabel("Eitr", new Vector2(114f, 231f), 74f, 16f, 11, new Color(0.36f, 0.64f, 1f, 0.92f), (TextAnchor)4); _activeTargetHealthValueText = CreateLabel("", new Vector2(-122f, 210f), 74f, 26f, 20, new Color(1f, 0.34f, 0.3f, 1f), (TextAnchor)4); _activeTargetStaminaValueText = CreateLabel("", new Vector2(-4f, 210f), 86f, 26f, 20, new Color(1f, 0.68f, 0.12f, 1f), (TextAnchor)4); _activeTargetEitrValueText = CreateLabel("", new Vector2(114f, 210f), 74f, 26f, 20, new Color(0.36f, 0.64f, 1f, 1f), (TextAnchor)4); _activeTargetDurationText = CreateLabel("", new Vector2(474f, 225f), 146f, 22f, 20, instance.ValheimBeige, (TextAnchor)4); _activeTargetStatusText = CreateLabel("", new Vector2(474f, 205f), 146f, 20f, 13, instance.ValheimYellow, (TextAnchor)4); float num = 408f; float num2 = 168f - num / 2f + 0f; float num3 = 1206f * 0.48f; float num4 = 1206f - num3; float num5 = -612f + num3 / 2f; float num6 = num5 + num3 / 2f + 18f + num4 / 2f; GameObject val = CreateRegion("FeastPlanner_LeftColumn", new Vector2(num5, num2), num3, num); GameObject val2 = CreateRegion("FeastPlanner_RightDetails", new Vector2(num6, num2), num4, num); GameObject val3 = CreateRegion("FeastPlanner_FooterActions", new Vector2(0f, -273f), 1224f, 58f); CreateRecommendedControls(val.transform, num3, num); CreateRecommendedRows(val.transform, num3, num); CreateCustomRows(val.transform, num3, num); CreateRecommendedDetails(val2.transform, num4, num); CreateCustomEditMode(val2.transform, num4, num); CreateFoodPickerMenu(); CreateFooterActions(val3.transform); _root.SetActive(false); } private void CreateHeader() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) GUIManager instance = GUIManager.Instance; CreateShade(_root.transform, "FeastPlanner_HeaderRule", new Vector2(0f, 256f), 1168f, 2f, new Color(0.46f, 0.3f, 0.13f, 0.45f)); CreateLabel("Feast Planner", new Vector2(-392f, 282f), 360f, 44f, 32, instance.ValheimBeige, (TextAnchor)3); _recommendedTabButton = CreateButton("Recommended", new Vector2(-72f, 282f), 190f, 42f, SelectRecommendedTab); _customTabButton = CreateButton("Custom", new Vector2(140f, 282f), 170f, 42f, SelectCustomTab); CreateLabel("Inv + Nearby", new Vector2(444f, 282f), 210f, 36f, 20, instance.ValheimBeige, (TextAnchor)5); CreateButton("X", new Vector2(588f, 282f), 44f, 44f, Close); } private void CreateRecommendedControls(Transform parent, float width, float height) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) float width2 = width / 2f - 24f; float num = 0f - width / 4f; float num2 = width / 4f; float num3 = height / 2f - 34f; _roleControlRoot = CreateButton("Role: Balanced", parent, new Vector2(num, num3), width2, 34f, ToggleRoleDropdown); _roleControlText = _roleControlRoot.GetComponentInChildren(); _biomeControlRoot = CreateButton("Biome: Meadows", parent, new Vector2(num2, num3), width2, 34f, ToggleBiomeDropdown); _biomeControlText = _biomeControlRoot.GetComponentInChildren(); _roleDropdownRoot = CreateRoleDropdown(parent, new Vector2(num, num3 - 126f), width2); _biomeDropdownRoot = CreateBiomeDropdown(parent, new Vector2(num2, num3 - 126f), width2); } private GameObject CreateRoleDropdown(Transform parent, Vector2 position, float width) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) PlannerRole[] array = new PlannerRole[7] { PlannerRole.Balanced, PlannerRole.BossFight, PlannerRole.ExploreGather, PlannerRole.BuildFarm, PlannerRole.MineHaul, PlannerRole.MagicEitr, PlannerRole.BestAvailable }; GameObject val = CreateDropdownRoot(parent, "FeastPlanner_RoleDropdown", position, width, array.Length); for (int i = 0; i < array.Length; i++) { PlannerRole role = array[i]; CreateButton(Display(role), val.transform, DropdownOptionPosition(i, array.Length), width - 18f, 26f, delegate { SelectPlannerRole(role); }); } val.SetActive(false); return val; } private GameObject CreateBiomeDropdown(Transform parent, Vector2 position, float width) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) TargetBiome[] array = new TargetBiome[7] { TargetBiome.Meadows, TargetBiome.BlackForest, TargetBiome.Swamp, TargetBiome.Mountain, TargetBiome.Plains, TargetBiome.Mistlands, TargetBiome.Ashlands }; GameObject val = CreateDropdownRoot(parent, "FeastPlanner_BiomeDropdown", position, width, array.Length); for (int i = 0; i < array.Length; i++) { TargetBiome biome = array[i]; CreateButton(Display(biome), val.transform, DropdownOptionPosition(i, array.Length), width - 18f, 26f, delegate { SelectTargetBiome(biome); }); } val.SetActive(false); return val; } private GameObject CreatePickerCategoryDropdown(Transform parent, Vector2 position, float width) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) FoodPickerCategory[] array = new FoodPickerCategory[5] { FoodPickerCategory.All, FoodPickerCategory.HealthHeavy, FoodPickerCategory.StaminaHeavy, FoodPickerCategory.Eitr, FoodPickerCategory.BalancedUtility }; GameObject val = CreateDropdownRoot(parent, "FeastPlanner_PickerCategoryDropdown", position, width, array.Length); for (int i = 0; i < array.Length; i++) { FoodPickerCategory category = array[i]; CreateButton(Display(category), val.transform, DropdownOptionPosition(i, array.Length), width - 18f, 26f, delegate { SelectPickerCategory(category); }); } val.SetActive(false); return val; } private GameObject CreatePickerBiomeDropdown(Transform parent, Vector2 position, float width) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) TargetBiome?[] array = new TargetBiome?[8] { null, TargetBiome.Meadows, TargetBiome.BlackForest, TargetBiome.Swamp, TargetBiome.Mountain, TargetBiome.Plains, TargetBiome.Mistlands, TargetBiome.Ashlands }; GameObject val = CreateDropdownRoot(parent, "FeastPlanner_PickerBiomeDropdown", position, width, array.Length); for (int i = 0; i < array.Length; i++) { TargetBiome? biome = array[i]; CreateButton(biome.HasValue ? Display(biome.Value) : "Any Biome", val.transform, DropdownOptionPosition(i, array.Length), width - 18f, 26f, delegate { SelectPickerBiome(biome); }); } val.SetActive(false); return val; } private void CreateRecommendedRows(Transform parent, float width, float height) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) _cookableToggleRoot = CreateButton("Cookable Now: Off", parent, new Vector2(0f, height / 2f - 78f), width - 32f, 36f, ToggleCookableOnly); _cookableToggleText = _cookableToggleRoot.GetComponentInChildren(); float num = 72f; float num2 = 14f; float num3 = width - 32f; float num4 = 96f; float num5 = 58f; float num6 = 128f; float num7 = 46f; float num8 = 10f; float num9 = 14f; float num10 = num3 - num4 - num5 - num6 - num7 - num8 * 4f - num9 * 2f; float num11 = 0f - num3 / 2f + num9 + num7 / 2f; float num12 = num11 + num7 / 2f + num8 + num10 / 2f; float num13 = num12 + num10 / 2f + num8 + num6 / 2f; float num14 = num13 + num6 / 2f + num8 + num5 / 2f; float num15 = num3 / 2f - num9 - num4 / 2f; float num16 = height / 2f - 142f; for (int i = 0; i < 8; i++) { float num17 = num16 - (float)i * (num + num2); int index = i; GameObject val = CreateButton("", parent, new Vector2(0f, num17), num3, num, delegate { SelectVisibleRow(index); }); ((Object)val).name = $"FeastPlanner_RecommendedRow_{i + 1}"; _rowButtons[i] = val; val.GetComponentInChildren().text = string.Empty; for (int num18 = 0; num18 < 1; num18++) { _rowFoodIcons[i, num18] = CreateIconSlot(val.transform, new Vector2(num11, 0f), 38f); } _rowNameTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num12, 0f), num10, num, 15, GUIManager.Instance.ValheimBeige, (TextAnchor)3); _rowStatsTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num13, 0f), num6, num, 13, GUIManager.Instance.ValheimBeige, (TextAnchor)4); _rowDurationTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num14, 0f), num5, num, 13, GUIManager.Instance.ValheimBeige, (TextAnchor)4); _rowStatusTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num15, 0f), num4, num, 13, GUIManager.Instance.ValheimYellow, (TextAnchor)5); } } private void CreateCustomRows(Transform parent, float width, float height) { //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Unknown result type (might be due to invalid IL or missing references) float height2 = 32f; float num = width - 32f; float num2 = 82f; float num3 = 46f; float num4 = 116f; float num5 = 88f; float num6 = 6f; float num7 = 10f; float num8 = num - num2 - num3 - num4 - num5 - num6 * 4f - num7 * 2f; float num9 = 0f - num / 2f + num7 + num5 / 2f; float num10 = num9 + num5 / 2f + num6 + num8 / 2f; float num11 = num10 + num8 / 2f + num6 + num4 / 2f; float num12 = num11 + num4 / 2f + num6 + num3 / 2f; float num13 = num / 2f - num7 - num2 / 2f; for (int i = 0; i < 8; i++) { GameObject val = _rowButtons[i]; if (val != null) { for (int j = 0; j < 3; j++) { _customRowFoodIcons[i, j] = CreateIconSlot(val.transform, new Vector2(num9 - 28f + (float)j * 28f, 0f), 24f); } _customRowNameTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num10, 0f), num8, height2, 14, GUIManager.Instance.ValheimBeige, (TextAnchor)3); _customRowStatsTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num11, 0f), num4, height2, 13, GUIManager.Instance.ValheimBeige, (TextAnchor)4); _customRowDurationTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num12, 0f), num3, height2, 13, GUIManager.Instance.ValheimBeige, (TextAnchor)4); _customRowStatusTexts[i] = CreateChildLabel(val.transform, "", new Vector2(num13, 0f), num2, height2, 13, GUIManager.Instance.ValheimYellow, (TextAnchor)5); } } } private void CreateRecommendedDetails(Transform parent, float width, float height) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_0385: Unknown result type (might be due to invalid IL or missing references) //IL_03ab: Unknown result type (might be due to invalid IL or missing references) //IL_03d0: Unknown result type (might be due to invalid IL or missing references) //IL_03f6: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_0447: Unknown result type (might be due to invalid IL or missing references) //IL_0459: Unknown result type (might be due to invalid IL or missing references) //IL_049d: Unknown result type (might be due to invalid IL or missing references) //IL_04c6: Unknown result type (might be due to invalid IL or missing references) //IL_04db: Unknown result type (might be due to invalid IL or missing references) //IL_0541: Unknown result type (might be due to invalid IL or missing references) //IL_0553: Unknown result type (might be due to invalid IL or missing references) //IL_05da: Unknown result type (might be due to invalid IL or missing references) //IL_05fd: Unknown result type (might be due to invalid IL or missing references) //IL_060c: Unknown result type (might be due to invalid IL or missing references) GUIManager instance = GUIManager.Instance; float num = width - 42f; float num2 = 0f - num / 2f; float num3 = height / 2f - 20f; float num4 = num3 - 42f; float num5 = num3 - 154f; float num6 = num3 - 284f; CreateDetailsRowShade(parent, "FeastPlanner_DetailsSummaryRow", new Vector2(0f, num4), num, 98f); CreateDetailsAccentShade(parent, "FeastPlanner_DetailsSummaryHeaderStrip", new Vector2(num2 + 124f, num4 + 28f), 190f, 28f, SummaryHeaderSurface()); CreateDetailsAccentShade(parent, "FeastPlanner_DetailsSummaryRule", new Vector2(0f, num4 + 6f), num - 44f, 2f, SummaryRuleSurface()); for (int i = 0; i < 2; i++) { CreateDetailsAccentShade(parent, $"FeastPlanner_DetailsSummaryStatDivider_{i + 1}", new Vector2(num2 + 142f + (float)i * 118f, num4 - 23f), 2f, 42f, SummaryRuleSurface()); } CreateDetailsAccentShade(parent, "FeastPlanner_DetailsDurationBadge", new Vector2(num / 2f - 94f, num4 - 22f), 112f, 44f, SummaryBadgeSurface()); float num7 = (num - 30f) / 3f; for (int j = 0; j < _foodDetailTexts.Length; j++) { float num8 = num2 + num7 / 2f + (float)j * (num7 + 15f); _foodDetailCardShades[j] = CreateDetailsRowShade(parent, $"FeastPlanner_DetailsFoodCard_{j + 1}", new Vector2(num8, num5), num7, 112f); AddFoodDetailCardClickHandler(_foodDetailCardShades[j], j); } CreateDetailsRowShade(parent, "FeastPlanner_DetailsIngredientsRow", new Vector2(0f, num6), num, 132f); _detailsTitleText = CreateChildLabel(parent, "Select a plan", new Vector2(num2 + 124f, num4 + 28f), 168f, 24f, 17, instance.ValheimBeige, (TextAnchor)3); _totalStatsText = CreateChildLabel(parent, "H 0 S 0 E 0", new Vector2(num2 + 96f, num4 - 32f), 1f, 1f, 1, new Color(1f, 1f, 1f, 0f), (TextAnchor)3); _detailsHealthText = CreateChildLabel(parent, "Health", new Vector2(num2 + 80f, num4 - 8f), 92f, 20f, 13, new Color(1f, 0.34f, 0.3f, 0.92f), (TextAnchor)4); _detailsStaminaText = CreateChildLabel(parent, "Stamina", new Vector2(num2 + 198f, num4 - 8f), 104f, 20f, 13, new Color(1f, 0.68f, 0.12f, 0.92f), (TextAnchor)4); _detailsEitrText = CreateChildLabel(parent, "Eitr", new Vector2(num2 + 316f, num4 - 8f), 92f, 20f, 13, new Color(0.36f, 0.64f, 1f, 0.92f), (TextAnchor)4); _detailsHealthValueText = CreateChildLabel(parent, "0", new Vector2(num2 + 80f, num4 - 32f), 92f, 32f, 27, new Color(1f, 0.34f, 0.3f, 1f), (TextAnchor)4); _detailsStaminaValueText = CreateChildLabel(parent, "0", new Vector2(num2 + 198f, num4 - 32f), 104f, 32f, 27, new Color(1f, 0.68f, 0.12f, 1f), (TextAnchor)4); _detailsEitrValueText = CreateChildLabel(parent, "0", new Vector2(num2 + 316f, num4 - 32f), 92f, 32f, 27, new Color(0.36f, 0.64f, 1f, 1f), (TextAnchor)4); _detailsDurationText = CreateChildLabel(parent, "0m", new Vector2(num / 2f - 94f, num4 - 22f), 96f, 40f, 25, instance.ValheimBeige, (TextAnchor)4); for (int k = 0; k < _foodDetailTexts.Length; k++) { float num9 = num2 + num7 / 2f + (float)k * (num7 + 15f); _foodDetailIcons[k] = CreateIconSlot(parent, new Vector2(num9, num5 + 28f), 34f); _foodDetailTexts[k] = CreateChildLabel(parent, "", new Vector2(num9, num5 - 22f), num7 - 20f, 66f, 13, instance.ValheimBeige, (TextAnchor)1); SetRaycastTarget((Graphic?)(object)_foodDetailIcons[k], raycastTarget: false); SetRaycastTarget((Graphic?)(object)_foodDetailTexts[k], raycastTarget: false); TrackDetailsControl((Component?)(object)_foodDetailIcons[k]); } _ingredientSummaryText = CreateChildLabel(parent, "Ingredients: none selected", new Vector2(num2 + 160f, num6 + 44f), 286f, 26f, 15, instance.ValheimBeige, (TextAnchor)3); float num10 = (num - 44f) / 2f; float num11 = num10 - 68f; for (int l = 0; l < _ingredientDetailTexts.Length; l++) { int num12 = l % 2; int num13 = l / 2; float num14 = num2 + 18f + (float)num12 * num10; float num15 = num6 + 16f - (float)num13 * 31f; float num16 = num14 + 42f + num11 / 2f; _ingredientDetailIcons[l] = CreateIconSlot(parent, new Vector2(num14 + 16f, num15), 22f); _ingredientDetailTexts[l] = CreateChildLabel(parent, "", new Vector2(num16, num15), num11, 26f, 13, instance.ValheimBeige, (TextAnchor)3); TrackDetailsControl((Component?)(object)_ingredientDetailIcons[l]); } TrackDetailsControl((Component?)(object)_detailsTitleText); TrackDetailsControl((Component?)(object)_totalStatsText); TrackDetailsControl((Component?)(object)_detailsDurationText); TrackDetailsControl((Component?)(object)_detailsHealthText); TrackDetailsControl((Component?)(object)_detailsStaminaText); TrackDetailsControl((Component?)(object)_detailsEitrText); TrackDetailsControl((Component?)(object)_detailsHealthValueText); TrackDetailsControl((Component?)(object)_detailsStaminaValueText); TrackDetailsControl((Component?)(object)_detailsEitrValueText); TrackDetailsControl((Component?)(object)_ingredientSummaryText); Text[] foodDetailTexts = _foodDetailTexts; foreach (Text component in foodDetailTexts) { TrackDetailsControl((Component?)(object)component); } foodDetailTexts = _ingredientDetailTexts; foreach (Text component2 in foodDetailTexts) { TrackDetailsControl((Component?)(object)component2); } } private void CreateCustomEditMode(Transform parent, float width, float height) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_02c2: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_0390: Unknown result type (might be due to invalid IL or missing references) //IL_03d2: Unknown result type (might be due to invalid IL or missing references) //IL_0414: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) GUIManager instance = GUIManager.Instance; float num = width - 42f; float num2 = height / 2f - 40f; Image val = CreateShade(parent, "FeastPlanner_CustomEditNameHeaderShade", new Vector2(0f, num2), num, 48f, SummaryHeaderSurface()); _customEditControls.Add(((Component)val).gameObject); Text val2 = CreateChildLabel(parent, "Plan Name", new Vector2(0f - num / 2f + 68f, num2), 118f, 28f, 14, instance.ValheimBeige, (TextAnchor)3); _customEditControls.Add(((Component)val2).gameObject); _customNameInput = CreateInputField(parent, "Custom meal", new Vector2(92f, num2), num - 184f, 34f); ((UnityEvent)(object)_customNameInput.onEndEdit).AddListener((UnityAction)delegate(string value) { RenameCustomDraft(value); }); _customEditControls.Add(((Component)_customNameInput).gameObject); for (int num3 = 0; num3 < _slotButtonTexts.Length; num3++) { int slotIndex = num3; float num4 = num2 - 72f - (float)num3 * 86f; _customEditSlotShades[num3] = CreateShade(parent, $"FeastPlanner_CustomEditSlotShade_{num3 + 1}", new Vector2(0f, num4), num, 74f, PanelRowSurface()); _customEditControls.Add(((Component)_customEditSlotShades[num3]).gameObject); GameObject val3 = CreateButton(string.Empty, parent, new Vector2(0f, num4), num - 18f, 66f, delegate { OpenFoodPicker(slotIndex); }); _slotButtonTexts[num3] = val3.GetComponentInChildren(); SetRowText(_slotButtonTexts[num3], string.Empty); _slotFoodIcons[num3] = CreateIconSlot(val3.transform, new Vector2(0f - num / 2f + 30f, 9f), 34f); Text val4 = CreateChildLabel(val3.transform, $"Slot {num3 + 1}", new Vector2(-212f, 14f), 70f, 20f, 12, instance.ValheimYellow, (TextAnchor)3); _customEditControls.Add(((Component)val4).gameObject); _slotPrimaryTexts[num3] = CreateChildLabel(val3.transform, "Choose food", new Vector2(-82f, 14f), 212f, 24f, 17, instance.ValheimOrange, (TextAnchor)3); _slotStatsTexts[num3] = CreateChildLabel(val3.transform, string.Empty, new Vector2(148f, 14f), 260f, 22f, 14, instance.ValheimBeige, (TextAnchor)3); for (int num5 = 0; num5 < 3; num5++) { CreateSlotIngredientChip(val3.transform, slotIndex, num5, new Vector2(0f - num / 2f + 88f + (float)num5 * 126f, -17f)); } _customEditControls.Add(val3); } Image val5 = CreateShade(parent, "FeastPlanner_CustomEditActionBand", new Vector2(0f, num2 - 338f), num, 52f, PanelRegionSurface()); _customEditControls.Add(((Component)val5).gameObject); _saveCustomButton = CreateButton("Save", parent, new Vector2(0f - num / 2f + 86f, num2 - 338f), 138f, 36f, SaveCustomDraft); _clearDraftButton = CreateButton("Clear Draft", parent, new Vector2(0f - num / 2f + 254f, num2 - 338f), 154f, 36f, ClearCustomDraft); _discardButton = CreateButton("Cancel", parent, new Vector2(0f - num / 2f + 424f, num2 - 338f), 128f, 36f, ConfirmDiscard); _discardText = _discardButton.GetComponentInChildren(); _customEditControls.Add(_saveCustomButton); _customEditControls.Add(_clearDraftButton); _customEditControls.Add(_discardButton); SetEditControlsActive(active: false); } private void CreateSlotIngredientChip(Transform parent, int slotIndex, int chipIndex, Vector2 position) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) Image val = CreateShade(parent, $"FeastPlanner_CustomEditIngredientChip_{slotIndex + 1}_{chipIndex + 1}", position, 112f, 28f, ActiveTraySurface()); _customEditControls.Add(((Component)val).gameObject); _slotIngredientIcons[slotIndex, chipIndex] = CreateIconSlot(parent, new Vector2(position.x - 38f, position.y), 22f); _slotIngredientTexts[slotIndex, chipIndex] = CreateChildLabel(parent, string.Empty, new Vector2(position.x + 8f, position.y), 76f, 20f, 11, GUIManager.Instance.ValheimBeige, (TextAnchor)3); } private void CreateFoodPickerMenu() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_02ba: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0395: Unknown result type (might be due to invalid IL or missing references) //IL_03dd: Unknown result type (might be due to invalid IL or missing references) //IL_0423: Unknown result type (might be due to invalid IL or missing references) //IL_0435: Unknown result type (might be due to invalid IL or missing references) //IL_0477: Unknown result type (might be due to invalid IL or missing references) //IL_0489: Unknown result type (might be due to invalid IL or missing references) //IL_04ec: Unknown result type (might be due to invalid IL or missing references) //IL_0524: Unknown result type (might be due to invalid IL or missing references) //IL_0575: Unknown result type (might be due to invalid IL or missing references) //IL_05be: Unknown result type (might be due to invalid IL or missing references) //IL_05d0: Unknown result type (might be due to invalid IL or missing references) //IL_0611: Unknown result type (might be due to invalid IL or missing references) _pickerMenuRoot = GUIManager.Instance.CreateWoodpanel(_root.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, -18f), 760f, 460f, false); ((Object)_pickerMenuRoot).name = "FeastPlanner_FoodPickerMenu"; GUIManager instance = GUIManager.Instance; CreateShade(_pickerMenuRoot.transform, "FeastPlanner_FoodPickerBackdropShade", new Vector2(0f, -8f), 704f, 390f, new Color(0.035f, 0.024f, 0.016f, 0.16f)); CreateChildLabel(_pickerMenuRoot.transform, "Choose Food", new Vector2(-243f, 190f), 220f, 34f, 22, instance.ValheimBeige, (TextAnchor)3); CreateButton("X", _pickerMenuRoot.transform, new Vector2(338f, 190f), 42f, 36f, CloseFoodPicker); Text val = CreateChildLabel(_pickerMenuRoot.transform, "Search", new Vector2(-306f, 145f), 76f, 28f, 15, instance.ValheimBeige, (TextAnchor)3); _pickerControls.Add(((Component)val).gameObject); _pickerSearchInput = CreateInputField(_pickerMenuRoot.transform, "", new Vector2(34f, 145f), 560f, 34f); ((UnityEvent)(object)_pickerSearchInput.onValueChanged).AddListener((UnityAction)delegate { RefreshFoodPicker(); }); _pickerControls.Add(((Component)_pickerSearchInput).gameObject); _pickerCategoryText = CreateButton("All", _pickerMenuRoot.transform, new Vector2(-278f, 98f), 150f, 32f, TogglePickerCategoryDropdown).GetComponentInChildren(); _pickerControls.Add(((Component)((Component)_pickerCategoryText).transform.parent).gameObject); _pickerBiomeText = CreateButton("Any Biome", _pickerMenuRoot.transform, new Vector2(-106f, 98f), 170f, 32f, TogglePickerBiomeDropdown).GetComponentInChildren(); _pickerControls.Add(((Component)((Component)_pickerBiomeText).transform.parent).gameObject); _pickerCategoryDropdownRoot = CreatePickerCategoryDropdown(_pickerMenuRoot.transform, new Vector2(-278f, 2f), 150f); _pickerBiomeDropdownRoot = CreatePickerBiomeDropdown(_pickerMenuRoot.transform, new Vector2(-106f, -42f), 170f); for (int num = 0; num < _pickerRowTexts.Length; num++) { int index = num; GameObject val2 = CreateButton("", _pickerMenuRoot.transform, new Vector2(-207f, 50f - (float)num * 50f), 292f, 40f, delegate { PreviewFood(index); }); _pickerRowButtons[num] = val2; _pickerRowTexts[num] = val2.GetComponentInChildren(); _pickerRowIcons[num] = CreateIconSlot(val2.transform, new Vector2(-122f, 0f), 24f); _pickerControls.Add(val2); } _pickerDetailIcon = CreateIconSlot(_pickerMenuRoot.transform, new Vector2(156f, 78f), 62f); _pickerControls.Add(((Component)_pickerDetailIcon).gameObject); _pickerDetailTitleText = CreateChildLabel(_pickerMenuRoot.transform, "Select a food", new Vector2(156f, 22f), 332f, 34f, 20, instance.ValheimBeige, (TextAnchor)4); _pickerControls.Add(((Component)_pickerDetailTitleText).gameObject); _pickerDetailStatsText = CreateChildLabel(_pickerMenuRoot.transform, "", new Vector2(156f, -20f), 332f, 28f, 15, instance.ValheimYellow, (TextAnchor)4); _pickerControls.Add(((Component)_pickerDetailStatsText).gameObject); for (int num2 = 0; num2 < _pickerIngredientIcons.Length; num2++) { int num3 = num2 % 3; int num4 = num2 / 3; CreatePickerIngredientChip(_pickerMenuRoot.transform, num2, new Vector2(36f + (float)num3 * 120f, -86f - (float)num4 * 30f)); } _addPickerFoodButton = CreateButton("Add Food", _pickerMenuRoot.transform, new Vector2(156f, -140f), 148f, 36f, AddPreviewedFood); _pickerControls.Add(_addPickerFoodButton); GameObject item = CreateButton("Prev", _pickerMenuRoot.transform, new Vector2(-278f, -190f), 104f, 32f, PreviousPickerPage); _pickerControls.Add(item); _pickerPageText = CreateChildLabel(_pickerMenuRoot.transform, "Page 1/1", new Vector2(0f, -190f), 160f, 28f, 14, instance.ValheimBeige, (TextAnchor)4); _pickerControls.Add(((Component)_pickerPageText).gameObject); GameObject item2 = CreateButton("Next", _pickerMenuRoot.transform, new Vector2(278f, -190f), 104f, 32f, NextPickerPage); _pickerControls.Add(item2); SetPickerControlsActive(active: false); } private void CreatePickerIngredientChip(Transform parent, int chipIndex, Vector2 position) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) _pickerIngredientIcons[chipIndex] = CreateIconSlot(parent, new Vector2(position.x - 36f, position.y), 24f); _pickerIngredientTexts[chipIndex] = CreateChildLabel(parent, string.Empty, new Vector2(position.x + 24f, position.y), 86f, 24f, 12, GUIManager.Instance.ValheimBeige, (TextAnchor)3); _pickerControls.Add(((Component)_pickerIngredientIcons[chipIndex]).gameObject); _pickerControls.Add(((Component)_pickerIngredientTexts[chipIndex]).gameObject); } private void CreateFooterActions(Transform parent) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) _setActiveText = CreateButton("Set Active", parent, new Vector2(-465f, 0f), 180f, 38f, SetSelectedActive).GetComponentInChildren(); _clearActiveText = CreateButton("Clear", parent, new Vector2(-270f, 0f), 130f, 38f, ClearSelectedActive).GetComponentInChildren(); _deleteCustomButton = CreateButton("Delete", parent, new Vector2(-120f, 0f), 130f, 38f, DeleteSelectedCustomPlan); _deleteCustomText = _deleteCustomButton.GetComponentInChildren(); _editCustomButton = CreateButton("Edit", parent, new Vector2(30f, 0f), 110f, 38f, BeginCustomEdit); _newCustomButton = CreateButton("New", parent, new Vector2(155f, 0f), 100f, 38f, BeginNewCustomDraft); } private GameObject CreateRegion(string name, Vector2 position, float width, float height) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) GameObject obj = GUIManager.Instance.CreateWoodpanel(_root.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), position, width, height, false); ((Object)obj).name = name; CreateShade(obj.transform, name + "_Shade", Vector2.zero, width - 16f, height - 16f, PanelRegionSurface()); return obj; } private GameObject CreateDropdownRoot(Transform parent, string name, Vector2 position, float width, int optionCount) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) float num = 18f + (float)optionCount * 30f; GameObject obj = GUIManager.Instance.CreateWoodpanel(parent, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), position, width, num, false); ((Object)obj).name = name; CreateShade(obj.transform, name + "_Shade", Vector2.zero, width - 12f, num - 12f, new Color(0.03f, 0.02f, 0.01f, 0.58f)); return obj; } private Image CreateDetailsRowShade(Transform parent, string name, Vector2 position, float width, float height) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) Image val = CreateShade(parent, name, position, width - 18f, height, PanelRowSurface()); TrackDetailsControl((Component?)(object)val); return val; } private Image CreateDetailsAccentShade(Transform parent, string name, Vector2 position, float width, float height, Color color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) Image val = CreateShade(parent, name, position, width, height, color); TrackDetailsControl((Component?)(object)val); return val; } private static Vector2 DropdownOptionPosition(int index, int optionCount) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) float num = (float)(optionCount - 1) * 30f / 2f; return new Vector2(0f, num - (float)index * 30f); } private static Image CreateShade(Transform parent, string name, Vector2 position, float width, float height, Color color) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name, new Type[2] { typeof(RectTransform), typeof(Image) }); val.transform.SetParent(parent, false); RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.anchoredPosition = position; component.sizeDelta = new Vector2(width, height); Image component2 = val.GetComponent(); ((Graphic)component2).color = color; ((Graphic)component2).raycastTarget = false; val.transform.SetAsFirstSibling(); return component2; } private static Image CreateIconSlot(Transform parent, Vector2 position, float size) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("FeastPlanner_IconSlot", new Type[2] { typeof(RectTransform), typeof(Image) }); val.transform.SetParent(parent, false); RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.anchoredPosition = position; component.sizeDelta = new Vector2(size, size); Image component2 = val.GetComponent(); component2.type = (Type)1; component2.preserveAspect = true; ((Graphic)component2).raycastTarget = false; SetIconSprite(component2, null); return component2; } private static void SetIconSprite(Image? image, Sprite? sprite) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (image != null) { image.sprite = sprite; ((Graphic)image).color = (Color)((sprite == null) ? new Color(1f, 1f, 1f, 0f) : Color.white); } } private Text CreateLabel(string text, Vector2 position, float width, float height, int fontSize, Color color, TextAnchor alignment) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) Text component = GUIManager.Instance.CreateText(text, _root.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), position, GUIManager.Instance.AveriaSerifBold, fontSize, color, false, Color.black, width, height, false).GetComponent(); component.alignment = alignment; SetLongContentTextOptions(component); return component; } private Text CreateChildLabel(Transform parent, string text, Vector2 position, float width, float height, int fontSize, Color color, TextAnchor alignment) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) Text component = GUIManager.Instance.CreateText(text, parent, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), position, GUIManager.Instance.AveriaSerifBold, fontSize, color, false, Color.black, width, height, false).GetComponent(); component.alignment = alignment; SetLongContentTextOptions(component); return component; } private static void SetLongContentTextOptions(Text label) { label.horizontalOverflow = (HorizontalWrapMode)1; label.verticalOverflow = (VerticalWrapMode)0; } private GameObject CreateButton(string text, Vector2 position, float width, float height, Action onClick) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) return CreateButton(text, _root.transform, position, width, height, onClick); } private GameObject CreateButton(string text, Transform parent, Vector2 position, float width, float height, Action onClick) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) GameObject obj = GUIManager.Instance.CreateButton(text, parent, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), position, width, height); ((Object)obj).name = "FeastPlanner_" + text.Replace(" ", string.Empty) + "Button"; ((UnityEvent)obj.GetComponent