Welcome to Keen Software House Forums! Log in or Sign up to interact with the KSH community.
  1. You are currently browsing our forum as a guest. Create your own forum account to access all forum functionality.

error script IMyInventory.getItems

Discussion in 'Programming (In-game)' started by Darkklegend, Mar 22, 2019.

Thread Status:
This last post in this thread was made more than 31 days old.
  1. Darkklegend Trainee Engineer

    Messages:
    2
    Hi,

    I have the error of "IMyInventory.getItems" in my script for sorting Container.
    I have tried many things but I can not solve this problem.
    I put the codes below for those who want to look at it.

    Code:
    List<string> GetItemsList(IMyInventory inventaire)
    		{
    			List<string> ItemsList = new List<string>();
    			List<IMyInventoryItem> items = inventaire.GetItems();
    
    			for (int i = 0; i < items.Count; i++) ItemsList.Add(items[i].GetDefinitionId().SubtypeId.ToString());
    			return ItemsList;
    		}
    Code:
    void SortInventories()
    		{
    			string CustomName;
    			Sandbox.ModAPI.Ingame.IMyTerminalBlock block;
    			IMyInventory inventory;
    			float ItemVolume;
    			float ContainerVolume;
    			VRage.MyFixedPoint AmountToTransfer;
    			VRage.MyFixedPoint Amount;
    
    			List<IMyInventoryItem> items = new List<IMyInventoryItem>();
    			List<IMyCargoContainer> TargetContainers = new List<IMyCargoContainer>();
    
    			// Parcours de tous les blocks source 
    			for (int b = 0; b < SourceBlocks.Count; b++)
    			{
    				block = SourceBlocks[b];
    				CustomName = block.CustomName;
    
    				// Parcours des inventaires du block 
    				for (int i = 0; i < block.InventoryCount; i++)
    				{
    					// Récupération de l'inventaire et de la liste des objets 
    					inventory = block.GetInventory(i);
    					items = inventory.GetItems();
    
    					// Si il n'y a aucun objet ou si il s'agit de l'inventaire de ressource sur un block avec Exemption de l'inventaire des ressources 
    					// On passe directement à l'inventaire suivant 
    					if (items.Count == 0) continue;
    					if (i == 0 && block.InventoryCount > 1 && this.ContainerIsTagged(CustomName) == true && this.GetContainerTAG(CustomName).Contains(exemptProd)) continue;
    
    					// Parcours de chacun des objets 
    					for (int t = items.Count - 1; t > -1; t--)
    					{
    						// Vérification si l'objet est connu, sinon on passe directement au suivant sans le déplacer 
    						if (!this.IsKnownItem(items[t])) continue;
    
    						// Si l'objet est déjà dans un conteneur convenable on passe directement au suivant 
    						if (this.IsItemSorted(block, items[t]) == true) continue;
    
    						// On vide l'ancienne liste des conteneurs cible 
    						TargetContainers.Clear();
    
    						// On récupère la liste des conteneurs cible potentiel pour cet objet 
    						TargetContainers = this.GetTargetContainers(items[t]);
    
    						// Si il n'y a aucun conteneur cible désigné, on passe directement à l'objet suivant 
    						if (TargetContainers.Count == 0) continue;
    
    						// Détermination de la quantité de cette objet et du volume d'1 seul 
    						Amount = (VRage.MyFixedPoint)items[t].Amount;
    						ItemVolume = this.GetItemVolume(items[t]);
    
    						// Parcours des conteneurs cible 
    						for (int c = 0; c < TargetContainers.Count; c++)
    						{
    							// Si le conteneur cible n'est pas connecté au conteneur de l'objet on passe directement au conteneur suivant 
    							if (!inventory.IsConnectedTo(TargetContainers[c].GetInventory(0))) continue;
    
    							// Détermination du volume disponible dans le conteneur et de la quantité pouvant être transféré 
    							ContainerVolume = this.GetContainerVolume(TargetContainers[c]);
    							AmountToTransfer = (VRage.MyFixedPoint)(ContainerVolume / ItemVolume);
    
    							// Si la quantité pouvant être transféré est supérieur à la quantité disponible 
    							// On utilisera la quantité disponible 
    							if (AmountToTransfer > Amount) AmountToTransfer = Amount;
    
    							// Si il ne reste plus d'objet à transférer on passe directement à l'objet suivant 
    							if (Amount == 0) break;
    
    							// Transfère de l'objet vers l'inventaire cible 
    							inventory.TransferItemTo(TargetContainers[c].GetInventory(0), t, stackIfPossible: true, amount: AmountToTransfer);
    
    							// Mise à jour de la quantité restante à transférer 
    							Amount = Amount - AmountToTransfer;
    						}
    					}
    				}
    			}
    		}
     
  2. Malware Master Engineer

    Messages:
    9,861
  3. Darkklegend Trainee Engineer

    Messages:
    2
    I saw that it has been modified but I do not know how to fix this error because this script comes from a player who had not made any updates on this script since 2016. I just had to fix the errors and it works but recently with the new update, I can not correct the error. it's better that I recreate a script in my opinion but I've never done script on SE
     
Thread Status:
This last post in this thread was made more than 31 days old.