public override void OnGroundIdle(EntityItem entityItem) { base.OnGroundIdle(entityItem); IWorldAccessor world = entityItem.World; if (world.Side != EnumAppSide.Server) { return; } if (entityItem.Swimming && world.Rand.NextDouble() < 0.03) { TryFillFromBlock(entityItem, entityItem.SidedPos.AsBlockPos); } if (entityItem.Swimming && world.Rand.NextDouble() < 0.01) { ItemStack[] stacks = GetContents(world, entityItem.Itemstack); if (MealMeshCache.ContentsRotten(stacks)) { for (int i = 0; i < stacks.Length; i++) { if (stacks[i] != null && stacks[i].StackSize > 0 && stacks[i].Collectible.Code.Path == "rot") { world.SpawnItemEntity(stacks[i], entityItem.ServerPos.XYZ); } } SetContent(entityItem.Itemstack, null); } } }
protected override MeshData genMesh(ItemStack stack, int index) { BlockCrock crockblock = stack.Collectible as BlockCrock; BlockMeal mealblock = stack.Collectible as BlockMeal; MeshData mesh; if (crockblock != null) { Vec3f rot = new Vec3f(0, block.Shape.rotateY, 0); mesh = BlockEntityCrock.GetMesh(capi.Tesselator, Api, crockblock, crockblock.GetContents(Api.World, stack), crockblock.GetRecipeCode(Api.World, stack), rot).Clone(); } else if (mealblock != null) { ICoreClientAPI capi = Api as ICoreClientAPI; MealMeshCache meshCache = capi.ModLoader.GetModSystem <MealMeshCache>(); mesh = meshCache.GenMealInContainerMesh(mealblock, mealblock.GetCookingRecipe(capi.World, stack), mealblock.GetNonEmptyContents(capi.World, stack)); } else { ICoreClientAPI capi = Api as ICoreClientAPI; if (stack.Class == EnumItemClass.Block) { mesh = capi.TesselatorManager.GetDefaultBlockMesh(stack.Block).Clone(); } else { nowTesselatingItem = stack.Item; nowTesselatingShape = capi.TesselatorManager.GetCachedShape(stack.Item.Shape.Base); capi.Tesselator.TesselateItem(stack.Item, out mesh, this); mesh.RenderPasses.Fill((short)EnumChunkRenderPass.BlendNoCull); } } if (stack.Collectible.Attributes?["onDisplayTransform"].Exists == true) { ModelTransform transform = stack.Collectible.Attributes?["onDisplayTransform"].AsObject <ModelTransform>(); transform.EnsureDefaultValues(); mesh.ModelTransform(transform); } if (stack.Class == EnumItemClass.Item && (stack.Item.Shape == null || stack.Item.Shape.VoxelizeTexture)) { mesh.Rotate(new Vec3f(0.5f, 0.5f, 0.5f), GameMath.PIHALF, 0, 0); mesh.Scale(new Vec3f(0.5f, 0.5f, 0.5f), 0.33f, 0.5f, 0.33f); mesh.Translate(0, -7.5f / 16f, 0f); } float x = ((index % 4) >= 2) ? 12 / 16f : 4 / 16f; float y = index >= 4 ? 10 / 16f : 2 / 16f; float z = (index % 2 == 0) ? 4 / 16f : 10 / 16f; Vec4f offset = mat.TransformVector(new Vec4f(x - 0.5f, y, z - 0.5f, 0)); mesh.Translate(offset.XYZ); return(mesh); }
public override void OnGroundIdle(EntityItem entityItem) { base.OnGroundIdle(entityItem); IWorldAccessor world = entityItem.World; if (world.Side != EnumAppSide.Server) { return; } if (entityItem.Swimming && world.Rand.NextDouble() < 0.01) { ItemStack[] stacks = GetContents(world, entityItem.Itemstack); if (MealMeshCache.ContentsRotten(stacks)) { for (int i = 0; i < stacks.Length; i++) { if (stacks[i] != null && stacks[i].StackSize > 0 && stacks[i].Collectible.Code.Path == "rot") { world.SpawnItemEntity(stacks[i], entityItem.ServerPos.XYZ); } } Block block = world.GetBlock(new AssetLocation(Attributes["eatenBlock"].AsString())); entityItem.Itemstack = new ItemStack(block); entityItem.WatchedAttributes.MarkPathDirty("itemstack"); } } }
public PotInFirepitRenderer(ICoreClientAPI capi, ItemStack stack, BlockPos pos, bool isInOutputSlot) { this.capi = capi; this.stack = stack; this.pos = pos; this.isInOutputSlot = isInOutputSlot; BlockCookedContainer potBlock = capi.World.GetBlock(stack.Collectible.CodeWithVariant("type", "cooked")) as BlockCookedContainer; if (isInOutputSlot) { MealMeshCache meshcache = capi.ModLoader.GetModSystem <MealMeshCache>(); MeshData potMesh = meshcache.CreateMealMesh(potBlock.Shape, potBlock.GetCookingRecipe(capi.World, stack), potBlock.GetContents(capi.World, stack), new Vec3f(0, 2.5f / 16f, 0)); potRef = capi.Render.UploadMesh(potMesh); } else { MeshData potMesh; capi.Tesselator.TesselateShape(potBlock, capi.Assets.TryGet("shapes/block/clay/pot-opened-empty.json").ToObject <Shape>(), out potMesh); potRef = capi.Render.UploadMesh(potMesh); MeshData lidMesh; capi.Tesselator.TesselateShape(potBlock, capi.Assets.TryGet("shapes/block/clay/pot-part-lid.json").ToObject <Shape>(), out lidMesh); lidRef = capi.Render.UploadMesh(lidMesh); } }
public override TransitionState[] UpdateAndGetTransitionStates(IWorldAccessor world, ItemSlot inslot) { TransitionState[] states = base.UpdateAndGetTransitionStates(world, inslot); ItemStack[] stacks = GetNonEmptyContents(world, inslot.Itemstack); if (MealMeshCache.ContentsRotten(stacks)) { inslot.Itemstack.Attributes?.RemoveAttribute("recipeCode"); inslot.Itemstack.Attributes?.RemoveAttribute("quantityServings"); } if (stacks == null || stacks.Length == 0) { inslot.Itemstack.Attributes?.RemoveAttribute("recipeCode"); inslot.Itemstack.Attributes?.RemoveAttribute("quantityServings"); } string eaten = Attributes["eatenBlock"].AsString(); if ((stacks == null || stacks.Length == 0) && eaten != null) { Block block = world.GetBlock(new AssetLocation(eaten)); if (block != null) { inslot.Itemstack = new ItemStack(block); inslot.MarkDirty(); } } return(states); }
public override void OnGroundIdle(EntityItem entityItem) { base.OnGroundIdle(entityItem); IWorldAccessor world = entityItem.World; if (world.Side != EnumAppSide.Server) { return; } if (entityItem.Swimming && world.Rand.NextDouble() < 0.01) { ItemStack[] stacks = GetContents(world, entityItem.Itemstack); if (MealMeshCache.ContentsRotten(stacks)) { for (int i = 0; i < stacks.Length; i++) { if (stacks[i] != null && stacks[i].StackSize > 0 && stacks[i].Collectible.Code.Path == "rot") { world.SpawnItemEntity(stacks[i], entityItem.ServerPos.XYZ); } } entityItem.Itemstack.Attributes.RemoveAttribute("recipeCode"); entityItem.Itemstack.Attributes.RemoveAttribute("quantityServings"); entityItem.Itemstack.Attributes.RemoveAttribute("contents"); } } }
public override void Initialize(ICoreAPI api) { base.Initialize(api); ms = api.ModLoader.GetModSystem <MealMeshCache>(); capi = api as ICoreClientAPI; loadMesh(); }
public override string GetHeldItemName(ItemStack itemStack) { ItemStack[] contentStacks = GetContents(api.World, itemStack); if (MealMeshCache.ContentsRotten(contentStacks)) { return(Lang.Get("Bowl of rotten food")); } return(base.GetHeldItemName(itemStack)); }
public override void GetHeldItemInfo(ItemSlot inSlot, StringBuilder dsc, IWorldAccessor world, bool withDebugInfo) { float temp = GetTemperature(world, inSlot.Itemstack); if (temp > 20) { dsc.AppendLine(Lang.Get("Temperature: {0}°C", (int)temp)); } CookingRecipe recipe = GetCookingRecipe(world, inSlot.Itemstack); ItemStack[] stacks = GetNonEmptyContents(world, inSlot.Itemstack); ItemSlot slot = BlockCrock.GetDummySlotForFirstPerishableStack(world, stacks, null, inSlot.Inventory); slot.Itemstack?.Collectible.AppendPerishableInfoText(slot, dsc, world); float servings = GetQuantityServings(world, inSlot.Itemstack); if (recipe != null) { if (Math.Round(servings, 1) < 0.05) { dsc.AppendLine(Lang.Get("{1}% serving of {0}", recipe.GetOutputName(world, stacks).UcFirst(), Math.Round(servings * 100, 0))); } else { dsc.AppendLine(Lang.Get("{0} serving of {1}", Math.Round(servings, 1), recipe.GetOutputName(world, stacks).UcFirst())); } } else { if (inSlot.Itemstack.Attributes.HasAttribute("quantityServings")) { dsc.AppendLine(Lang.Get("{0} servings left", Math.Round(servings, 1))); } else if (displayContentsInfo) { dsc.AppendLine(Lang.Get("Contents:")); if (stacks != null && stacks.Length > 0) { dsc.AppendLine(stacks[0].StackSize + "x " + stacks[0].GetName()); } } } if (!MealMeshCache.ContentsRotten(stacks)) { string facts = GetContentNutritionFacts(world, inSlot, null, recipe == null); if (facts != null) { dsc.Append(facts); } } }
public override void Initialize(ICoreAPI api) { base.Initialize(api); this.ms = api.ModLoader.GetModSystem <MealMeshCache>(); capi = api as ICoreClientAPI; if (capi != null) { updateMeshes(); } }
public override void GetBlockInfo(IPlayer forPlayer, StringBuilder dsc) { bool isRotten = MealMeshCache.ContentsRotten(inv); if (isRotten) { dsc.Append(Lang.Get("Rotten")); } else { dsc.Append(BlockEntityShelf.PerishableInfoCompact(Api, inv[0], 0, false)); } }
public override void OnBeforeRender(ICoreClientAPI capi, ItemStack itemstack, EnumItemRenderTarget target, ref ItemRenderInfo renderinfo) { if (meshCache == null) { meshCache = capi.ModLoader.GetModSystem <MealMeshCache>(); } MeshRef meshref = meshCache.GetOrCreateMealInContainerMeshRef(this, GetCookingRecipe(capi.World, itemstack), GetNonEmptyContents(capi.World, itemstack)); if (meshref != null) { renderinfo.ModelRef = meshref; } }
public override string GetHeldItemName(ItemStack itemStack) { ItemStack[] cStacks = GetContents(api.World, itemStack); if (cStacks.Length <= 1) { return(Lang.Get("pie-empty")); } ItemStack cstack = cStacks[1]; if (cstack == null) { return(Lang.Get("pie-empty")); } bool equal = true; for (int i = 2; equal && i < cStacks.Length - 1; i++) { if (cStacks[i] == null) { continue; } equal &= cstack.Equals(api.World, cStacks[i], GlobalConstants.IgnoredStackAttributes); cstack = cStacks[i]; } string state = Variant["state"]; if (MealMeshCache.ContentsRotten(cStacks)) { return(Lang.Get("pie-single-rotten")); } if (equal) { return(Lang.Get("pie-single-" + cstack.Collectible.Code.ToShortString() + "-" + state)); } else { EnumFoodCategory fillingFoodCat = cStacks[1].Collectible.NutritionProps?.FoodCategory ?? cStacks[1].ItemAttributes?["nutritionPropsWhenInMeal"]?.AsObject <FoodNutritionProperties>()?.FoodCategory ?? EnumFoodCategory.Vegetable ; return(Lang.Get("pie-mixed-" + fillingFoodCat.ToString().ToLowerInvariant() + "-" + state)); } }
public override TransitionState[] UpdateAndGetTransitionStates(IWorldAccessor world, ItemSlot inslot) { TransitionState[] states = base.UpdateAndGetTransitionStates(world, inslot); ItemStack[] stacks = GetNonEmptyContents(world, inslot.Itemstack); if (MealMeshCache.ContentsRotten(stacks)) { inslot.Itemstack.Attributes.RemoveAttribute("recipeCode"); inslot.Itemstack.Attributes?.RemoveAttribute("quantityServings"); } if (stacks == null || stacks.Length == 0) { inslot.Itemstack.Attributes.RemoveAttribute("recipeCode"); inslot.Itemstack.Attributes?.RemoveAttribute("quantityServings"); } return(states); }
public override void OnBeforeRender(ICoreClientAPI capi, ItemStack itemstack, EnumItemRenderTarget target, ref ItemRenderInfo renderinfo) { if (meshCache == null) { meshCache = capi.ModLoader.GetModSystem <MealMeshCache>(); } CookingRecipe recipe = GetCookingRecipe(capi.World, itemstack); ItemStack[] contents = GetContents(capi.World, itemstack); float yoff = 2.5f; // itemstack.Attributes.GetInt("servings"); MeshRef meshref = meshCache.GetOrCreateMealMeshRef(this.Shape, recipe, contents, new Vec3f(0, yoff / 16f, 0)); if (meshref != null) { renderinfo.ModelRef = meshref; } }
public override void OnLoaded(ICoreAPI api) { base.OnLoaded(api); InteractionHelpYOffset = 0.375f; interactions = ObjectCacheUtil.GetOrCreate(api, "pieInteractions-", () => { List <ItemStack> knifeStacks = new List <ItemStack>(); List <ItemStack> fillStacks = new List <ItemStack>(); List <ItemStack> doughStacks = new List <ItemStack>(); foreach (CollectibleObject obj in api.World.Collectibles) { if (obj.Tool == EnumTool.Knife || obj.Tool == EnumTool.Sword) { knifeStacks.Add(new ItemStack(obj)); } if (obj is ItemDough) { doughStacks.Add(new ItemStack(obj, 2)); } var pieProps = obj.Attributes?["inPieProperties"]?.AsObject <InPieProperties>(null, obj.Code.Domain); if (pieProps != null && !(obj is ItemDough)) { fillStacks.Add(new ItemStack(obj, 2)); } } return(new WorldInteraction[] { new WorldInteraction() { ActionLangCode = "blockhelp-pie-cut", MouseButton = EnumMouseButton.Right, Itemstacks = knifeStacks.ToArray(), GetMatchingStacks = (wi, bs, es) => { BlockEntityPie bec = api.World.BlockAccessor.GetBlockEntity(bs.Position) as BlockEntityPie; if (bec?.Inventory[0]?.Itemstack != null && (bec.Inventory[0].Itemstack.Collectible as BlockPie).State != "raw" && bec.SlicesLeft > 1) { return wi.Itemstacks; } return null; } }, new WorldInteraction() { ActionLangCode = "blockhelp-pie-addfilling", MouseButton = EnumMouseButton.Right, Itemstacks = fillStacks.ToArray(), GetMatchingStacks = (wi, bs, es) => { BlockEntityPie bec = api.World.BlockAccessor.GetBlockEntity(bs.Position) as BlockEntityPie; if (bec?.Inventory[0]?.Itemstack != null && (bec.Inventory[0].Itemstack.Collectible as BlockPie).State == "raw" && !bec.HasAllFilling) { return wi.Itemstacks; } return null; } }, new WorldInteraction() { ActionLangCode = "blockhelp-pie-addcrust", MouseButton = EnumMouseButton.Right, Itemstacks = doughStacks.ToArray(), GetMatchingStacks = (wi, bs, es) => { BlockEntityPie bec = api.World.BlockAccessor.GetBlockEntity(bs.Position) as BlockEntityPie; if (bec?.Inventory[0]?.Itemstack != null && (bec.Inventory[0].Itemstack.Collectible as BlockPie).State == "raw" && bec.HasAllFilling && !bec.HasCrust) { return wi.Itemstacks; } return null; } }, new WorldInteraction() { ActionLangCode = "blockhelp-pie-changecruststyle", MouseButton = EnumMouseButton.Right, Itemstacks = knifeStacks.ToArray(), GetMatchingStacks = (wi, bs, es) => { BlockEntityPie bec = api.World.BlockAccessor.GetBlockEntity(bs.Position) as BlockEntityPie; if (bec?.Inventory[0]?.Itemstack != null && (bec.Inventory[0].Itemstack.Collectible as BlockPie).State == "raw" && bec.HasCrust) { return wi.Itemstacks; } return null; } } }); }); ms = api.ModLoader.GetModSystem <MealMeshCache>(); displayContentsInfo = false; /*foreach (var val in api.World.Collectibles) * { * if (val.Attributes?["inPieProperties"].Exists == true) * { * var pieprops = val.Attributes["inPieProperties"]?.AsObject<InPieProperties>(); * if (pieprops.PartType == EnumPiePartType.Filling) * { * Console.WriteLine(string.Format("\"pie-single-{0}\": \"{1} pie\",", val.Code.Path, new ItemStack(val).GetName())); * } * } * }*/ }
public override void OnLoaded(ICoreAPI api) { base.OnLoaded(api); meshCache = api.ModLoader.GetModSystem <MealMeshCache>(); }