Modding:Basic Inventory Handling: Difference between revisions

From Vintage Story Wiki
m
Updated navbox to new code navbox.
(Created page with "{{GameVersion112}} == Overview == The most important classes for inventory management are: * InventoryManager: Contains multiple inventories (every player has one with diffe...")
 
m (Updated navbox to new code navbox.)
 
(12 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{GameVersion112}}
{{GameVersion|1.19.3}}
 
<languages/>
== Overview ==
<translate>
== Overview == <!--T:1-->
The most important classes for inventory management are:
The most important classes for inventory management are:
* InventoryManager:  Contains multiple inventories (every player has one with different inventories). Also helps with common tasks like putting items into a valid inventory.
* InventoryManager:  Contains multiple inventories (every player has one with different inventories). Also helps with common tasks like putting items into a valid inventory.
Line 8: Line 9:
* ItemStack: Contains the Item and amount of items (called StackSize), e.g. "block torch-up" and StackSize of 2, for two Torches.
* ItemStack: Contains the Item and amount of items (called StackSize), e.g. "block torch-up" and StackSize of 2, for two Torches.


== Basic Inventory Handling ==
== Basic Inventory Handling == <!--T:2-->
 
To get access to a players inventory, you can use the InventoryManager of the IPlayer. For example, to simply give the player a torch when respawning you could use <code>TryGiveItemStack</code>:


<!--T:3-->
To get access to a players inventory, you can use the InventoryManager of the IPlayer. For example, to simply give the player a torch when joining you could use <code>TryGiveItemStack</code>:
</translate>
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
private ICoreServerAPI _serverApi;
private ICoreServerAPI serverApi;


public override void StartServerSide(ICoreServerAPI api)
public override void StartServerSide(ICoreServerAPI api)
   {
   {
     _serverApi = api;
     serverApi = api;
     _serverApi.Event.PlayerRespawn += EventOnPlayerRespawn;
     serverApi.Event.PlayerJoin += EventOnPlayerJoin;
   }
   }


private void EventOnPlayerRespawn(IServerPlayer player)
private void EventOnPlayerJoin(IServerPlayer player)
   {
   {
     ItemStack torch = new ItemStack(_serverApi.World.GetBlock(new AssetLocation("torch-up")));
     ItemStack torch = new ItemStack(serverApi.World.GetBlock(new AssetLocation("torch-basic-lit-up")));
     player.InventoryManager.TryGiveItemstack(torch);
     player.InventoryManager.TryGiveItemstack(torch);
   }
   }
Line 31: Line 33:


<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
ItemStack torch = new ItemStack(_serverApi.World.GetBlock(new AssetLocation("torch-up")));
ItemStack torch = new ItemStack(serverApi.World.GetBlock(new AssetLocation("torch-basic-lit-up")));
var offhandSlot = player.Entity.LeftHandItemSlot;
ItemSlot offhandSlot = player.Entity.LeftHandItemSlot;
if (offhandSlot?.Empty == true)
if (offhandSlot?.Empty == true)
{
{
Line 40: Line 42:
</syntaxhighlight>
</syntaxhighlight>


If you need access to other inventories like e.g. the backpack inventories, you can use the <code>InventoryManager.Inventories</code> Property. This contains a dictionary with the name of the inventory (for example "hotbar-APlayerUID") and the corresponding inventory. Remember that the backpack inventory contains the bags as well as the slots, so you have to check if it is valid to put the item there. If for example you want to fill every empty slot in the backpack with single torches you could do the following:
If you need access to other inventories like e.g. the backpack inventories, you can use the <code>InventoryManager.Inventories</code> Property. This contains a dictionary with the name of the inventory (for example "hotbar-APlayerUID") and the corresponding inventory. Another cleaner looking way if you only need a single inventory would be the <code>InventoryManager.GetOwnInventory()</code> method, which appends the player uid to the classname and returns the inventory. To avoid errors when typing the classnames, check first if the classname is already in the <code>GlobalConstants</code>.
 
Because backpack inventory contains the bags as well as the slots, you have to check if it is valid to put the item there. For this you can use the <code>ItemSlot.CanHold()</code> method.
 
If for example you want to fill every empty slot in the backpack with single torches you could do the following:


<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
var torchBlock = _serverApi.World.GetBlock(new AssetLocation("torch-up"));
Block torchBlock = serverApi.World.GetBlock(new AssetLocation("torch-basic-lit-up"));
var backpack = player.InventoryManager.Inventories.FirstOrDefault(i => i.Key.StartsWith("backpack")).Value;
IInventory backpack = player.InventoryManager.GetOwnInventory(GlobalConstants.backpackInvClassName);
if (backpack != null)
if (backpack != null)
{
{
   var dummySlot = new ItemSlot(null) { Itemstack = new ItemStack(torchBlock) }; //dummy slot to check if the slot would be a valid one
   var dummySlot = new ItemSlot(null) { Itemstack = new ItemStack(torchBlock) };
   foreach (var bag in backpack.Where(b => b.CanHold(dummySlot) && b.Empty))
   foreach (ItemSlot bag in backpack.Where(b => b.CanHold(dummySlot) && b.Empty))
   {
   {
     bag.Itemstack = new ItemStack(torchBlock);
     bag.Itemstack = new ItemStack(torchBlock);
Line 55: Line 61:
}
}
</syntaxhighlight>
</syntaxhighlight>
{{Navbox/codemodding}}
Confirmedusers
637

edits