Backpacks are no longer allowed in backpacks.
不允许背包内放置背包了。
This commit is contained in:
parent
31a1d292d8
commit
2d92a92faf
|
@ -17,6 +17,7 @@ public partial class HotBar : HBoxContainer
|
|||
base._Ready();
|
||||
var universalItemContainer = new UniversalItemContainer(Config.HotBarSize);
|
||||
_itemContainer = universalItemContainer;
|
||||
_itemContainer.CanContainContainer = true;
|
||||
_itemContainer.SupportSelect = true;
|
||||
_itemContainerDisplay = new ItemSlotContainerDisplay(this);
|
||||
_itemContainerDisplay.BindItemContainer(_itemContainer);
|
||||
|
|
|
@ -51,6 +51,16 @@ public interface IItem
|
|||
/// </summary>
|
||||
bool IsSelect { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>Whether this item can also hold other items</para>
|
||||
/// <para>此物品是否还能容纳其他物品</para>
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
///<para>For example, a backpack is an object that can hold other objects.</para>
|
||||
///<para>例如,背包是一个物品,他可以容纳其他物品。</para>
|
||||
/// </remarks>
|
||||
bool CanContainItems { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>The container in which the item is located</para>
|
||||
/// <para>物品所在的物品容器</para>
|
||||
|
|
|
@ -44,7 +44,13 @@ public interface IItemContainer
|
|||
/// <para>Whether this item container supports checking</para>
|
||||
/// <para>此物品容器是否支持选中</para>
|
||||
/// </summary>
|
||||
public bool SupportSelect { get; set; }
|
||||
bool SupportSelect { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>Whether this item container supports items that CanContainItems=true, such as backpacks</para>
|
||||
/// <para>此物品容器是否支持容纳CanContainItems=true的物品,例如背包</para>
|
||||
/// </summary>
|
||||
bool CanContainContainer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>Gets a placeholder object</para>
|
||||
|
@ -91,6 +97,15 @@ public interface IItemContainer
|
|||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
bool ReplaceItem(int index, IItem item);
|
||||
|
||||
/// <summary>
|
||||
/// <para>Whether items are replaceable</para>
|
||||
/// <para>是否可替换物品</para>
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
bool CanReplaceItem(int index, IItem item);
|
||||
|
||||
/// <summary>
|
||||
/// <para>ClearItem</para>
|
||||
|
@ -99,7 +114,7 @@ public interface IItemContainer
|
|||
/// <param name="index"></param>
|
||||
/// <returns></returns>
|
||||
bool ClearItem(int index);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Gets the item in the specified location, equivalent to <see cref="GetItem"/></para>
|
||||
/// <para>获取指定位置的物品,等同于<see cref="GetItem"/></para>
|
||||
|
|
|
@ -60,18 +60,24 @@ public partial class ItemSlotNode : MarginContainer, IItemDisplay
|
|||
{
|
||||
return false;
|
||||
}
|
||||
var itemSlotNode = data.As<ItemSlotNode>();
|
||||
var sourceItem = itemSlotNode.Item;
|
||||
if (sourceItem == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
switch (Item)
|
||||
{
|
||||
case null:
|
||||
case PlaceholderItem:
|
||||
return true;
|
||||
default:
|
||||
var itemSlotNode = data.As<ItemSlotNode>();
|
||||
var sourceItem = itemSlotNode.Item;
|
||||
if (sourceItem == null)
|
||||
case PlaceholderItem placeholderItem:
|
||||
var placeholderItemContainer = placeholderItem.ItemContainer;
|
||||
if (placeholderItemContainer == null)
|
||||
{
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
return placeholderItemContainer.CanReplaceItem(placeholderItem.Index, sourceItem);
|
||||
default:
|
||||
return Item.MergeableItemCount(sourceItem, sourceItem.Quantity) > 0;
|
||||
}
|
||||
}
|
||||
|
@ -101,11 +107,12 @@ public partial class ItemSlotNode : MarginContainer, IItemDisplay
|
|||
var placeholderItemContainer = placeholderItem.ItemContainer;
|
||||
var sourceItemContainer = sourceItem.ItemContainer;
|
||||
var sourceItemIndex = sourceItem.Index;
|
||||
var replaceResult = false;
|
||||
if (placeholderItemContainer != null)
|
||||
{
|
||||
placeholderItemContainer.ReplaceItem(placeholderItem.Index, sourceItem);
|
||||
replaceResult = placeholderItemContainer.ReplaceItem(placeholderItem.Index, sourceItem);
|
||||
}
|
||||
if (sourceItemContainer != null)
|
||||
if (replaceResult && sourceItemContainer != null)
|
||||
{
|
||||
sourceItemContainer.ClearItem(sourceItemIndex);
|
||||
}
|
||||
|
|
|
@ -13,21 +13,7 @@ public partial class Packsack : PickAbleTemplate
|
|||
{
|
||||
private const string Path = "res://prefab/ui/packsackUI.tscn";
|
||||
[Export] public int NumberSlots { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>Whether to allow backpacks</para>
|
||||
/// <para>是否允许放置背包</para>
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
///<para>Can a new backpack be placed in the slot of the backpack?</para>
|
||||
///<para>即此背包的槽位内是否可以再放置新的背包?</para>
|
||||
/// </remarks>
|
||||
[Export]
|
||||
public bool BackpackAllowed { get; set; }
|
||||
|
||||
public override bool CanPutInPack => false;
|
||||
|
||||
|
||||
public override bool CanContainItems { get; set; } = true;
|
||||
public override void Use(Node2D? owner, Vector2 targetGlobalPosition)
|
||||
{
|
||||
GameSceneDepend.DynamicUiGroup?.ShowControl(Path, control =>
|
||||
|
|
|
@ -16,6 +16,7 @@ public class PlaceholderItem : IItem
|
|||
public int Quantity { get; set; } = 1;
|
||||
public int MaxQuantity { get; } = 1;
|
||||
public bool IsSelect { get; set; }
|
||||
public bool CanContainItems { get; set; } = false;
|
||||
public IItemContainer? ItemContainer { get; set; }
|
||||
|
||||
public int MergeableItemCount(IItem other, int unallocatedQuantity)
|
||||
|
|
|
@ -37,6 +37,12 @@ public class UniversalItemContainer(int totalCapacity) : IItemContainer
|
|||
|
||||
public bool CanAddItem(IItem item)
|
||||
{
|
||||
if (item.CanContainItems && !CanContainContainer)
|
||||
{
|
||||
//The item to be added can hold other items, and this item container does not allow item containers.
|
||||
//要添加的物品能够容纳其他物品,且此物品容器不允许放置物品容器。
|
||||
return false;
|
||||
}
|
||||
//If the capacity is not full, directly return to add items
|
||||
//如果未占满容量,直接返回可添加物品
|
||||
if (GetUsedCapacity() < totalCapacity)
|
||||
|
@ -184,6 +190,7 @@ public class UniversalItemContainer(int totalCapacity) : IItemContainer
|
|||
}
|
||||
|
||||
public bool SupportSelect { get; set; }
|
||||
public bool CanContainContainer { get; set; }
|
||||
|
||||
|
||||
public IItem GetPlaceHolderItem(int index)
|
||||
|
@ -228,6 +235,15 @@ public class UniversalItemContainer(int totalCapacity) : IItemContainer
|
|||
return true;
|
||||
}
|
||||
|
||||
public bool CanReplaceItem(int index, IItem item)
|
||||
{
|
||||
if (item.CanContainItems && !CanContainContainer)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public bool ClearItem(int index)
|
||||
{
|
||||
|
|
|
@ -30,9 +30,7 @@ public partial class PickAbleTemplate : RigidBody2D, IItem
|
|||
return TranslationServerUtils.Translate(key) ?? key;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool CanPutInPack => true;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Owner</para>
|
||||
/// <para>主人</para>
|
||||
|
@ -79,6 +77,7 @@ public partial class PickAbleTemplate : RigidBody2D, IItem
|
|||
|
||||
public int MaxQuantity { get; set; } = 1;
|
||||
public bool IsSelect { get; set; }
|
||||
public virtual bool CanContainItems { get; set; }
|
||||
public IItemContainer? ItemContainer { get; set; }
|
||||
|
||||
private Label? _tipLabel;
|
||||
|
|
Loading…
Reference in New Issue
Block a user