Advertisement
Whiplash141

Cargo Refill Code v13

Jan 15th, 2017
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.99 KB | None | 0 0
  1. /*
  2. Whip's Cargo Refill Script - version 13 - 11/12/16
  3.  
  4. Based off Utilibot code by Dainw: http://steamcommunity.com/sharedfiles/filedetails/?id=437345638
  5. ____________________________________________________________________________________________
  6.  
  7. /// NAMING ///
  8.     <Block Name> [Restock]; <item1> - <amountOfItem>; <item2> - <amountOfItem>
  9.    
  10.     Example:
  11.         Cargo Container [Restock];Steel Plate - 500;uranium - 24
  12.             * this will restock the container with 500 steel plates and 24 ingots of uranium
  13. ____________________________________________________________________________________________
  14.  
  15. /// LIST OF RECOGNISED COMPONENT NAMES ///
  16.     Items listed like: "Banana(s)" means that both "Banana" and "Bananas"
  17.     would be valid names
  18.  
  19.     Ores/Ingots
  20.         * Uranium or Fuel or UraniumIngot(s) or Uranium Ingot(s)
  21.         * Stone
  22.         * Ice
  23.  
  24.     Components
  25.         * Steel or SteelPlate(s) or Steel Plate(s)
  26.         * InteriorPlate(s) or Interior Plate(s)
  27.         * Construction  or Construction Component(s)
  28.         * Motor(s)
  29.         * MetalGrid(s) or Metal Grid(s)
  30.         * LargeTube(s) or Large Steel Tube(s) or LST
  31.         * SmallTube(s) or Small Steel Tube(s) or SST
  32.         * Display(s)
  33.         * Computer(s) or CPU(s)
  34.         * Medical or Medical Component(s)
  35.         * SolarCell(s) or Solar Cell(s)
  36.         * PowerCell(s) or Power Cell(s)
  37.         * Detector(s) or Detector Component(s)
  38.         * Girder(s)
  39.         * Thrust or Thruster(s) or Thruster Component(s)
  40.         * Reactor or Reactor Component(s)
  41.         * BulletproofGlass or Bullerproof Glass or Glass
  42.         * RadioCommunication or Radio(s) or Radio Component(s)
  43.             or Radio Communication Component(s)
  44.         * Gravity Generator Component(s) or Gravity or Grav
  45.             or Gravity Generator or Gravity Component(s)
  46.         * OxygenBottle(s) or Oxygen Bottle(s) or Oxygen or O2
  47.             or O2 Bottle(s)
  48.         * Superconductor(s) or Super Conductor(s)
  49.         * Hydrogen or HydrogenBottle(s) or Hyrdogen Bottle(s)
  50.  
  51.     Ammo
  52.         * Missile200mm  or Missile(s) or Rocket(s)
  53.         * NATO_25x184mm or 25mm or 25mm NATO
  54.         * NATO_5p56x45mm or 5.56mm or 5.56mm NATO
  55.  
  56. Todo:
  57. * make idiot proof
  58. * add comments
  59. * possibly add reactor support?
  60.  
  61. - Whiplash141  
  62. */  
  63.    
  64.     string transferName = "[Transfer]";
  65.     string restockName = "[Restock]";
  66.     string blockName;
  67.     string itemDesired;
  68.     int amountDesired;
  69.     IMyTerminalBlock target;
  70.     IMyInventory targetInventory;
  71.     Dictionary<string, int> ItemsToTransfer = new Dictionary<string, int>();
  72.  
  73. void Main()  
  74. {
  75.     List<IMyTerminalBlock> cargoCapable = new List<IMyTerminalBlock>();
  76.     List<IMyTerminalBlock> transfer = new List<IMyTerminalBlock>();
  77.     List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
  78.  
  79.     GridTerminalSystem.GetBlocksOfType<IMyTerminalBlock>(blocks);
  80.     for(int i = 0 ; i < blocks.Count ; i++)
  81.     {
  82.         if(blocks[i] is IMyCargoContainer || blocks[i] is IMyShipWelder || blocks[i] is IMyShipConnector || blocks[i] is IMyUserControllableGun)
  83.             cargoCapable.Add(blocks[i]);
  84.     }
  85.  
  86.     Echo("Cargo Capable Blocks on Grid: " + cargoCapable.Count.ToString());
  87.     for(int i = 0 ; i < cargoCapable.Count ; i++)
  88.     {
  89.         if(cargoCapable[i].CustomName.Contains(restockName))
  90.         {
  91.             Echo(cargoCapable[i].CustomName);
  92.             target = cargoCapable[i];
  93.             targetInventory = target.GetInventory(0);
  94.            
  95.             GetCargoQuota();
  96.             UpdateCargoQuota();
  97.             FillCargoQuota();
  98.         }
  99.     }
  100. }
  101.  
  102. void GetCargoQuota()
  103. {
  104.     blockName = target.CustomName.Replace(" ", ""); //get name of cargo block
  105.     string[] blockName_split = blockName.Split(';'); //split at semicolons
  106.    
  107.     for (int j = 1 ; j < blockName_split.Length ; j++)
  108.     {
  109.         string[] item_split = blockName_split[j].Split('-'); //seperate item from amount
  110.         itemDesired = item_split[0].ToLower(); //convert to lowercase
  111.         amountDesired = Convert.ToInt32(item_split[1]); //convert to a number
  112.         bool isValidItem = true;
  113.        
  114.         switch(itemDesired) //compare block names to valid components
  115.         {
  116.         //ore and ingots
  117.             case "uraniumingot":
  118.             case "uraniumingots":
  119.             case "uranium":
  120.             case "fuel":
  121.                 itemDesired = "Uranium";
  122.                 break;
  123.  
  124.             case "stone":
  125.             case "rock":
  126.                 itemDesired = "Stone";
  127.                 break;
  128.  
  129.             case "ice":
  130.             case "frozenwater"
  131.                 itemDesired = "Ice";
  132.                 break;
  133.  
  134.         //Components
  135.             case "steel":
  136.             case "steelplate":
  137.             case "steelplates":
  138.                 itemDesired = "SteelPlate";
  139.                 break;
  140.  
  141.             case "interiorplate":
  142.             case "interiorplates":
  143.                 itemDesired = "InteriorPlate";
  144.                 break;
  145.  
  146.             case "construction":
  147.             case "constructioncomponent":
  148.             case "constructioncomponents":
  149.             case "cc":
  150.                 itemDesired = "Construction";
  151.                 break;
  152.  
  153.             case "motor":
  154.             case "motors":
  155.                 itemDesired = "Motor";
  156.                 break;
  157.  
  158.             case "metalgrid":
  159.             case "metalgrids":
  160.                 itemDesired = "MetalGrid";
  161.                 break;
  162.  
  163.             case "largetube":
  164.             case "largetubes":
  165.             case "largesteeltube":
  166.             case "largesteeltubes":
  167.             case "lst":
  168.                 itemDesired = "LargeTube";
  169.                 break;
  170.  
  171.             case "smalltube":
  172.             case "smalltubes":
  173.             case "smallsteeltube":
  174.             case "smallsteeltubes":
  175.             case "sst":
  176.                 itemDesired = "SmallTube";
  177.                 break;
  178.  
  179.             case "display":
  180.             case "displays":
  181.                 itemDesired = "Display";
  182.                 break;
  183.  
  184.             case "computer":
  185.             case "computers":
  186.             case "cpu":
  187.             case "cpus":
  188.                 itemDesired = "Computer";
  189.                 break;  
  190.  
  191.             case "medical":
  192.             case "medicalcomponent":
  193.             case "medicalcomponents":
  194.                 itemDesired = "Medical";
  195.                 break;
  196.  
  197.             case "solarcell":
  198.             case "solarcells":
  199.             case "solarcell":
  200.             case "solarcells":
  201.             case "solar":
  202.                 itemDesired = "SolarCell";
  203.                 break;
  204.  
  205.             case "powercell":
  206.             case "powercells":
  207.             case "powercell":
  208.             case "powercells":
  209.             case "power":
  210.                 itemDesired = "PowerCell";
  211.                 break;
  212.  
  213.             case "detector":
  214.             case "detectors":
  215.             case "detectorcomponent":
  216.             case "detectorcomponents":
  217.                 itemDesired = "Detector";
  218.                 break;
  219.  
  220.             case "girder":
  221.             case "girders":
  222.                 itemDesired = "Girder";
  223.                 break;
  224.  
  225.             case "thrust":
  226.             case "thruster":
  227.             case "thrusters":
  228.             case "thrustercomponent":
  229.             case "thrustercomponents":
  230.                 itemDesired = "Thrust";
  231.                 break;
  232.  
  233.             case "reactor":
  234.             case "reactorcomponent":
  235.             case "reactorcomponents":
  236.                 itemDesired = "Reactor";
  237.                 break;
  238.  
  239.             case "bulletproofglass":
  240.             case "glass":
  241.                 itemDesired = "BulletproofGlass";
  242.                 break;
  243.  
  244.             case "radiocommunication":
  245.             case "radio":
  246.             case "radiocomponent":
  247.             case "radiocomponents":
  248.             case "radiocommunicationcomponent":
  249.             case "radiocommunicationcomponents":
  250.                 itemDesired = "RadioCommunication";
  251.                 break;
  252.                
  253.             case "grav":
  254.             case "gravity":
  255.             case "gravitygenerator":
  256.             case "gravitygeneratorcomponent":
  257.             case "gravitygeneratorcomponents":
  258.             case "gravitycomponent":
  259.             case "gravitycomponents":
  260.                 itemDesired = "GravityGenerator";
  261.                 break;
  262.                
  263.             case "oxygenbottle":
  264.             case "oxygenbottles":
  265.             case "oxygen":
  266.             case "o2bottle":
  267.             case "o2bottles":
  268.             case "o2":
  269.                 itemDesired = "OxygenBottle";
  270.                 break;
  271.                
  272.             case "superconductor":
  273.             case "superconductors":
  274.                 itemDesired = "Superconductor";
  275.                 break;
  276.            
  277.             case "hydrogenbottle":
  278.             case "hydrogenbottles":
  279.             case "hydrogen":
  280.                 itemDesired = "HydrogenBottle";
  281.                 break;
  282.  
  283.         //ammo
  284.             case "missile200mm":
  285.             case "missile":
  286.             case "missiles":
  287.             case "rocket":
  288.             case "rockets":
  289.                 itemDesired = "Missile200mm";
  290.                 break;
  291.  
  292.             case "nato_25x184mm":
  293.             case "25mm":
  294.             case "25mm NATO":
  295.                 itemDesired = "NATO_25x184mm";
  296.                 break;
  297.  
  298.             case "nato_5p56x45mm":
  299.             case "5.56mm":
  300.             case "5.56mm NATO":
  301.                 itemDesired = "NATO_5p56x45mm";
  302.                 break;
  303.  
  304.             default: //this means it is none of the above
  305.                 isValidItem = false;
  306.                 break;
  307.         }
  308.        
  309.         if(isValidItem)
  310.         {
  311.             ItemsToTransfer.Add(itemDesired, amountDesired);
  312.         }else{
  313.             Echo("'" + itemDesired + "'" + " is not a valid component name");
  314.         }
  315.  
  316.     }
  317. }
  318.  
  319. void UpdateCargoQuota()
  320. {
  321.     var itemsAlreadyPresent = targetInventory.GetItems();
  322.  
  323.     for (int k = 0 ; k < itemsAlreadyPresent.Count ; k++)
  324.     {
  325.         var itemName = itemsAlreadyPresent[k].Content.SubtypeName;
  326.         var itemAmount = (int)itemsAlreadyPresent[k].Amount;
  327.         if (ItemsToTransfer.ContainsKey(itemName)) //if there is stuff already in there
  328.         {
  329.             if (ItemsToTransfer[itemName] > itemAmount) //if we dont have what we need
  330.             {
  331.                 ItemsToTransfer[itemName] = ItemsToTransfer[itemName] - itemAmount; //take difference
  332.                 Echo(itemName + ":" + ItemsToTransfer[itemName]);
  333.             }else{ //if we have what we need
  334.                 ItemsToTransfer.Remove(itemName);
  335.             }
  336.         }
  337.     }
  338. }
  339.  
  340. void FillCargoQuota()
  341. {
  342.     List<IMyTerminalBlock> transfer = new List<IMyTerminalBlock>();
  343.     GridTerminalSystem.SearchBlocksOfName(transferName, transfer);
  344.     for (int n = 0 ; n < transfer.Count ; n++)
  345.     {
  346.         if (!(transfer[n] is IMyCargoContainer) && !(transfer[n] is IMyShipConnector))
  347.         {
  348.             transfer.Remove(transfer[n]); //remove if not cargo capable
  349.             continue;
  350.         }
  351.         var items = transfer[n].GetInventory(0).GetItems(); //see what we have in the container
  352.         for (int j = 0 ; j < items.Count ; j++)
  353.         {
  354.             var itemName = items[j].Content.SubtypeName;
  355.             Echo("Checking Item:" + itemName);
  356.             if (ItemsToTransfer.ContainsKey(itemName) && ItemsToTransfer[itemName] > 0)
  357.             {
  358.                 int itemAmount = Math.Min((int)ItemsToTransfer[itemName],(int)items[j].Amount);
  359.                 //if want > have then we take all we can from what we have currently and try the next container
  360.                 Echo("I need " + itemAmount);
  361.                 bool isTransferrable = transfer[n].GetInventory(0).TransferItemTo(targetInventory,j,null,true,itemAmount);
  362.                 Echo("Items can transfer: " + isTransferrable.ToString());
  363.                 if (isTransferrable == true) ItemsToTransfer[itemName]-=itemAmount;
  364.             }
  365.         }
  366.     }
  367.     ItemsToTransfer.Clear();
  368.     Echo("Done");
  369. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement