public string CrockInfoCompact(ItemSlot inSlot) { BlockMeal mealblock = Api.World.GetBlock(new AssetLocation("bowl-meal")) as BlockMeal; BlockCrock crock = inSlot.Itemstack.Collectible as BlockCrock; IWorldAccessor world = Api.World; CookingRecipe recipe = crock.GetCookingRecipe(world, inSlot.Itemstack); ItemStack[] stacks = crock.GetNonEmptyContents(world, inSlot.Itemstack); if (stacks == null || stacks.Length == 0) { return(Lang.Get("Empty Crock") + "\n"); } StringBuilder dsc = new StringBuilder(); if (recipe != null) { double servings = inSlot.Itemstack.Attributes.GetDecimal("quantityServings"); if (recipe != null) { if (servings == 1) { dsc.Append(Lang.Get("{0}x {1}.", servings, recipe.GetOutputName(world, stacks))); } else { dsc.Append(Lang.Get("{0}x {1}.", servings, recipe.GetOutputName(world, stacks))); } } } else { int i = 0; foreach (var stack in stacks) { if (stack == null) { continue; } if (i++ > 0) { dsc.Append(", "); } dsc.Append(stack.StackSize + "x " + stack.GetName()); } dsc.Append("."); } DummyInventory dummyInv = new DummyInventory(Api); ItemSlot contentSlot = BlockCrock.GetDummySlotForFirstPerishableStack(Api.World, stacks, null, dummyInv); dummyInv.OnAcquireTransitionSpeed = (transType, stack, mul) => { return(mul * crock.GetContainingTransitionModifierContained(world, inSlot, transType) * inv.GetTransitionSpeedMul(transType, stack)); }; TransitionState[] transitionStates = contentSlot.Itemstack?.Collectible.UpdateAndGetTransitionStates(Api.World, contentSlot); bool addNewLine = true; if (transitionStates != null) { for (int i = 0; i < transitionStates.Length; i++) { TransitionState state = transitionStates[i]; TransitionableProperties prop = state.Props; float perishRate = contentSlot.Itemstack.Collectible.GetTransitionRateMul(world, contentSlot, prop.Type); if (perishRate <= 0) { continue; } addNewLine = false; float transitionLevel = state.TransitionLevel; float freshHoursLeft = state.FreshHoursLeft / perishRate; switch (prop.Type) { case EnumTransitionType.Perish: if (transitionLevel > 0) { dsc.AppendLine(" " + Lang.Get("{0}% spoiled", (int)Math.Round(transitionLevel * 100))); } else { double hoursPerday = Api.World.Calendar.HoursPerDay; if (freshHoursLeft / hoursPerday >= Api.World.Calendar.DaysPerYear) { dsc.AppendLine(" " + Lang.Get("Fresh for {0} years", Math.Round(freshHoursLeft / hoursPerday / Api.World.Calendar.DaysPerYear, 1))); } /*else if (freshHoursLeft / hoursPerday >= Api.World.Calendar.DaysPerMonth) - confusing. 12 days per months and stuff.. * { * dsc.AppendLine(Lang.Get("<font color=\"orange\">Perishable.</font> Fresh for {0} months", Math.Round(freshHoursLeft / hoursPerday / Api.World.Calendar.DaysPerMonth, 1))); * }*/ else if (freshHoursLeft > hoursPerday) { dsc.AppendLine(" " + Lang.Get("Fresh for {0} days", Math.Round(freshHoursLeft / hoursPerday, 1))); } else { dsc.AppendLine(" " + Lang.Get("Fresh for {0} hours", Math.Round(freshHoursLeft, 1))); } } break; } } } if (addNewLine) { dsc.AppendLine(""); } return(dsc.ToString()); }