Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const bool REMOVE_STONE = false;
- VRage.Game.ModAPI.Ingame.IMyInventory getStoneStorage() {
- List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
- GridTerminalSystem.SearchBlocksOfName("Stone", blocks);
- for ( int i = 0; i < blocks.Count; i++ ) {
- if ( blocks[i] is IMyCargoContainer ) {
- VRage.Game.ModAPI.Ingame.IMyInventory inventory = blocks[i].GetInventory(0);
- if ( !inventory.IsFull ) {
- return inventory;
- }
- }
- }
- return null;
- }
- class myRefine
- {
- public IMyRefinery refinery;
- public myRefine(IMyRefinery r)
- {
- refinery = r;
- }
- public double getVolume()
- {
- VRage.Game.ModAPI.Ingame.IMyInventory inventory;
- inventory = refinery.GetInventory(0);
- double total = 0.0;
- List<VRage.Game.ModAPI.Ingame.IMyInventoryItem> items = new List<VRage.Game.ModAPI.Ingame.IMyInventoryItem>();
- items = inventory.GetItems();
- for ( int i = 0; i < items.Count; i++ ) {
- VRage.Game.ModAPI.Ingame.IMyInventoryItem item = items[i];
- //parts.increaseCount(item.Content.SubtypeName, (int)item.Amount);
- total += (double)item.Amount;
- }
- return total;
- }
- public void GrabFromNeighbor(myRefine neighbor, double amount)
- {
- if ( amount == 0 ) { return; }
- VRage.Game.ModAPI.Ingame.IMyInventory sourceInv;
- VRage.Game.ModAPI.Ingame.IMyInventory targetInv;
- if ( amount > 0 ) {
- sourceInv = neighbor.refinery.GetInventory(0);
- targetInv = refinery.GetInventory(0);
- } else {
- targetInv = neighbor.refinery.GetInventory(0);
- sourceInv = refinery.GetInventory(0);
- }
- int index;
- amount = Math.Abs(amount);
- if ( amount > 0 ) {
- index = sourceInv.GetItems().Count-1;
- targetInv.TransferItemFrom(sourceInv,index,null,null,(VRage.MyFixedPoint)amount);
- }
- }
- public int RemoveStone(VRage.Game.ModAPI.Ingame.IMyInventory storageInv)
- {
- if ( storageInv == null ) { return 0; }
- VRage.Game.ModAPI.Ingame.IMyInventory inventory = refinery.GetInventory(0);
- List<VRage.Game.ModAPI.Ingame.IMyInventoryItem> items = inventory.GetItems();
- int stoneRemoved = 0;
- for ( int i = 0; i < items.Count; i++ ) {
- VRage.Game.ModAPI.Ingame.IMyInventoryItem item = items[i];
- if ( item.Content.SubtypeName == "Stone" )
- {
- //Echo("Attempting to move " + item.Amount);
- stoneRemoved += (int)item.Amount;
- storageInv.TransferItemFrom(inventory,i);
- }
- }
- return stoneRemoved;
- }
- public void Balance(List<myRefine> refines,double average, int i)
- {
- int tRefines = refines.Count;
- double myVol = getVolume();
- double margin = average * 0.05;
- if ( myVol > average - margin && myVol < average + margin ) { return; }
- double neededAmount = average - myVol;
- myRefine neighbor = refines[i+1];
- this.GrabFromNeighbor(neighbor,neededAmount);
- }
- }
- void Main(string argument)
- {
- List<IMyTerminalBlock> refineries = new List<IMyTerminalBlock>();
- GridTerminalSystem.GetBlocksOfType<IMyRefinery>(refineries);
- if ( refineries == null || refineries.Count < 1 )
- {
- Echo("No refineries found.");
- return;
- }
- List<myRefine> myRefines = new List<myRefine>();
- for ( int i = 0; i < refineries.Count; i++ )
- {
- myRefines.Add(new myRefine((IMyRefinery)refineries[i]));
- }
- if ( REMOVE_STONE )
- {
- VRage.Game.ModAPI.Ingame.IMyInventory storage = getStoneStorage();
- Echo("Removing Stone..");
- for ( int i = 0; i < myRefines.Count && (storage != null) ; i++ )
- {
- //Echo(i.ToString());
- // Echo("Attempting to remove " + myRefines[i].RemoveStone(storage));
- myRefines[i].RemoveStone(storage);
- if ( storage.IsFull ) { storage = getStoneStorage(); }
- }
- }
- double total = 0.0;
- for ( int i = 0; i < myRefines.Count; i++ )
- {
- total += myRefines[i].getVolume();
- }
- double average = total / myRefines.Count;
- for ( int i = 0; i < myRefines.Count - 1; i++ )
- {
- myRefines[i].Balance(myRefines,average,i);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement