AC的Inventory 系统作为其v1.72.0更新的一部分进行了全面重构。本页既概述了它如何从API级别工作,也为希望将自定义脚本移植到新系统的开发人员提供了指南。

输入Inventory Manager的Inventory Item数据存储在InvItem类中。

在v1.72.0之前,每当玩家处理一个物品时,都会在运行时生成这个类的副本——无论是在他们自己的Inventory 中,还是在Crafting中,或是放在Container中。这意味着,在脚本中处理这个类时,对InvItem的实际来源存在歧义。此类InvItem类存储在Lists中,并通过外部函数进行修改。

新的Inventory 系统对此做了两个根本性的改变:

  1. 在运行时处理Inventory 时,原始InvItem类将被单独保留。而是创建一个引用InvItem的InvInstance类。这个新类有额外的属性来记录它所代表的Item的数量、选择模式(Use vs Give)等等。虽然原始的InvItem类仍然可以访问,但这意味着它的来源不再模棱两可。
  2. 每当记录物品列表时,无论是用于玩家的Inventory 、Crafting还是Container,它们都会被放置在专用的InvCollection类中。InvCollection类具有内部函数来处理Item的添加和删除,以及Item从一个集合转移到另一个集合。这就不需要根据访问的Item设置多组修改功能。

与以前的版本一样,可以通过以下方式获取当前选定的Item:

1
AC.KickStarter.runtimeInventory.SelectedItem;

但是,这不再表示该item的运行时实例。为此,我们可以使用:

1
AC.KickStarter.runtimeInventory.SelectedInstance;

需要注意的是,由于项目实例可能无效,例如“计数”为零,因此在访问之前检查其有效性很重要。这可以通过以下方式实现:

1
2
3
4
5
InvInstance myInvInstance;
if (InvInstance.IsValid (myInvInstance))
{
// OK to access myInvInstance
}

要获取InvInstance类的关联InvItem,请执行以下操作:

1
myInvInstance.InvItem;

InvInstance也是Inventory 交互功能的新家:

1
2
3
4
5
myInvInstance.Select ();
myInvInstance.Use ();
myInvInstance.Use (int iconID);
myInvInstance.Examine ();
myInvInstance.Combine (InvInstance otherInvInstance);

要获取玩家的Inventory项目集合:

1
KickStarter.runtimeInventory.PlayerInvCollection;

或者

1
KickStarter.player.Inventory;

要获取Container的集合,请执行如下操作:

1
myContainer.InvCollection;

使用InvCollection类,我们可以通过引用其索引来访问各个实例,例如:

1
InvInstance myInvInstance = KickStarter.player.Inventory.GetInstanceAtIndex (indexValue);

InvCollection类具有许多函数和属性,可以访问和修改其内容。有关更多信息,请参阅Scripting guide中的条目。

在选择和修改Inventory项时触发的自定义事件仍然与以前的版本保持一致,但是:InvItem参数现在引用Inventory Manager中的原始项目。如果我们想访问受影响的运行时InvInstance,可以使用以下替代方法:

1
2
3
4
5
6
OnInventoryAdd_Alt (InvCollection invCollection, InvInstance invInstance, int amount)
OnInventoryRemove_Alt (InvCollection invCollection, InvInstance invInstance, int amount)
OnInventoryCombine_Alt (InvInstance invInstanceA, InvInstance invInstanceB)
OnInventoryInteract_Alt (InvInstance invInstanceA, int iconID)
OnInventorySelect_Alt (InvCollection invCollection, InvInstance invInstance)
OnInventoryDeselect_Alt (InvCollection invCollection, InvInstance invInstance)