/// <summary> /// Adds a reference-based item slot to the ui state /// </summary> /// <param name="item"> the item that should be referenced by the new slot</param> /// <param name="_position">the position of the slot, leave as null to automatically place the slot</param> /// <param name="usePercent">ignored if position is null</param> /// <param name="_ValidItemFunc">passed to RefItemSlot constructor</param> /// <param name="colorContext">passed to RefItemSlot constructor</param> /// <param name="context">passed to RefItemSlot constructor</param> /// <param name="slotScale">passed to RefItemSlot constructor</param> public void AddItemSlot(Ref <Item> item, Vector2?_position = null, bool usePercent = false, Func <Item, bool> _ValidItemFunc = null, int colorContext = ItemSlot.Context.CraftingMaterial, int context = ItemSlot.Context.InventoryItem, float slotScale = 1f) { Vector2 position; if (_position is null) { Main.UIScaleMatrix.Decompose(out Vector3 scale, out Quaternion ignore, out Vector3 ignore2); position.X = (float)((Main.screenWidth * 0.05) + (itemSlots.Count * 40 * scale.X)); position.Y = (float)((Main.screenHeight * 0.4) + (40 * scale.Y)); usePercent = false; } else { position = _position.Value; } RefItemSlot itemSlot = new RefItemSlot(_item: item, colorContext: colorContext, context: context, scale: slotScale) { ValidItemFunc = _ValidItemFunc ?? (i => true), }; if (usePercent) { itemSlot.Left = new StyleDimension { Percent = position.X }; itemSlot.Top = new StyleDimension { Percent = position.Y }; } else { itemSlot.Left = new StyleDimension { Pixels = position.X }; itemSlot.Top = new StyleDimension { Pixels = position.Y }; } itemSlots.Add(itemSlot); Append(itemSlot); }
public override void OnInitialize() { Main.UIScaleMatrix.Decompose(out Vector3 scale, out Quaternion ignore, out Vector3 ignore2); Vector2 basePosition = new Vector2((float)(Main.screenWidth * 0.05), (float)(Main.screenHeight * 0.4)); Vector2 slotOffset = new Vector2(40 * scale.X, 40 * scale.Y); casingSlot = AddCraftingSlot(null, basePosition + slotOffset * new Vector2(1, 2), false, (i) => (i.modItem is CasingItem || i.IsAir) && i.type != casingSlot.item.type, slotScale: 0.75f ); batterySlot = AddCraftingSlot(null, basePosition + slotOffset * new Vector2(0, 2), false, (i) => (Sets.Item.battery[i.type] || i.IsAir) && i.type != batterySlot.item.type, slotScale: 0.75f ); lensSlot = AddCraftingSlot(null, basePosition + slotOffset * new Vector2(2, 2), false, (i) => (Sets.Item.lens[i.type] || i.IsAir) && i.type != lensSlot.item.type, slotScale: 0.75f ); outputItem = new Item(); outputItem.SetDefaults(ModContent.ItemType <CustomCastingTool>()); outputItem.owner = Main.myPlayer; outputSlot = AddCraftingSlot(outputItem, basePosition + slotOffset * new Vector2(1, 0), false, (i) => i.IsAir && CanCraft(), slotScale: 0.75f ); outputSlot.DoDraw = CanCraft; outputSlot.ContentsChangedAction = (newItem, oldItem) => { if (newItem.IsAir) { //oldItem.modItem.SetDefaults(); outputItem = new Item(); outputItem.SetDefaults(ModContent.ItemType <CustomCastingTool>()); outputItem.owner = Main.myPlayer; casingSlot.DecrementStack(); batterySlot.DecrementStack(); lensSlot.DecrementStack(); if (((CustomCastingTool)outputItem.modItem).driveItem is null) { ((CustomCastingTool)outputItem.modItem).driveItem = new Ref <Item>(new Item()); ((CustomCastingTool)outputItem.modItem).driveItem.Value.SetDefaults(0); } driveSlot.item = ((CustomCastingTool)outputItem.modItem).driveItem; } }; CustomCastingTool castingTool = (CustomCastingTool)outputItem.modItem; casingSlot.ContentsChangedAction = (newItem, oldItem) => { castingTool.casingItem = newItem; castingTool.SetDefaults(); }; batterySlot.ContentsChangedAction = (newItem, oldItem) => { castingTool.powerCellItem = newItem; castingTool.SetDefaults(); }; lensSlot.ContentsChangedAction = (newItem, oldItem) => { castingTool.lensItem = newItem; castingTool.SetDefaults(); }; if (castingTool.driveItem is null) { castingTool.driveItem = new Ref <Item>(new Item()); castingTool.driveItem.Value.SetDefaults(0); } driveSlot = new RefItemSlot(_item: castingTool.driveItem, scale: 0.75f) { ValidItemFunc = (i) => (i.modItem is DriveItem || i.IsAir) && i.type != driveSlot.item.Value.type, Left = { Pixels = basePosition.X + slotOffset.X }, Top = { Pixels = basePosition.Y + slotOffset.X * 3 } }; Append(driveSlot); }