此脚本用于将库存物品分类整理,目前支持[矿]、[锭]、[组件]、[工具]、[弹药]这几种分类。
整理过程中会排除“氢氧制造机”、“反应堆”、“炮塔”、精炼机与组装机的输入容器。
使用方法:
1.要整理库存的容器需要管道连接;
2.所有物品会根据箱子名称的"[分类名称]“进行转移;
3.如果LCD面板名称带有”[汇总]“标记,则显示矿和锭的汇总信息;
4.如果某个容器名称带有”[禁]“,则不参与库存整理;
5.如果某个发电设备名称带有”[发电]",则会纳入发电管理,当检测到某电池的电量低于50%时启动发电。
public Program()
{
// Run Main() every 100 ticks, or about 1.3s
Runtime.UpdateFrequency = UpdateFrequency.Update100;
}
//排除需要抽取的容器
string[] filterBlockNames={"MyObjectBuilder_OxygenGenerator","MyObjectBuilder_Reactor","MyObjectBuilder_LargeMissileTurret","MyObjectBuilder_LargeGatlingTurret","MyObjectBuilder_InteriorTurret","MyObjectBuilder_TurretControlBlock","MyObjectBuilder_OxygenTank"};
//工具类型名称
string[] typeids_tool={"MyObjectBuilder_PhysicalGunObject","MyObjectBuilder_GasContainerObject","MyObjectBuilder_OxygenContainerObject"};
Dictionary<string,string> nameMap=new Dictionary<string,string>{
{"Uranium","铀"},
{"Stone","石头"},
{"Gold","黄金"},
{"Iron","铁"},
{"Magnesium","镁"},
{"Silver","银"},
{"Nickel","镍"},
{"Platinum","铂"},
{"Silicon","硅"},
{"Cobalt","钴"},
{"Ice","冰"},
{"Scrap","废金属"}
};
public void Main(string argument, UpdateType updateSource){
var blocks=new List<IMyTerminalBlock>();
//找出有库存的方块
GridTerminalSystem.GetBlocksOfType<IMyTerminalBlock>(blocks,block=>block.HasInventory&&!filterBlockNames.Contains(block.BlockDefinition.TypeIdString)&&!block.DisplayNameText.Contains("[禁]"));
Echo($"block count:{blocks.Count}");
var DictOre=new Dictionary<string,double>();
if(blocks.Count==0){
return;
}
var lcds=new List<IMyTextPanel>();
GridTerminalSystem.GetBlocksOfType<IMyTextPanel>(lcds,d=>d.DisplayNameText.Contains("[汇总]"));
//矿箱子
var block_ores=blocks.Where(d=>d.DisplayNameText.Contains("[矿]")).ToList();
//锭箱子
var block_ingots=blocks.Where(d=>d.DisplayNameText.Contains("[锭]")).ToList();
//组件箱子
var block_components=blocks.Where(d=>d.DisplayNameText.Contains("[组件]")).ToList();
//工具箱子
var block_tools=blocks.Where(d=>d.DisplayNameText.Contains("[工具]")).ToList();
//弹药箱子
var block_ammos=blocks.Where(d=>d.DisplayNameText.Contains("[弹药]")).ToList();
if(block_ores.Count==0&&block_ingots.Count==0&&block_components.Count==0&&block_tools.Count==0&&block_ammos.Count==0){
return;
}
var names_block_ores=block_ores.Select(d=>d.Name);
var names_block_ingots=block_ingots.Select(d=>d.Name);
var names_block_components=block_components.Select(d=>d.Name);
var names_block_tools=block_tools.Select(d=>d.Name);
var names_block_ammos=block_ammos.Select(d=>d.Name);
//开始整理库存
foreach(var block in blocks){
Echo($"blockName:{block.DisplayNameText}");
IMyInventory current_Inventory=null;
//
if(block.InventoryCount>1){
//精炼机和组装机取输出容器
current_Inventory=block.GetInventory(1);
}else{//普通方块取默认容器
current_Inventory=block.GetInventory();
}
if(!(current_Inventory.CurrentVolume.RawValue>0L)){
continue;
}
var items_ore=new List<MyInventoryItem>();
var items_ingot=new List<MyInventoryItem>();
var items_component=new List<MyInventoryItem>();
var items_tool=new List<MyInventoryItem>();
var items_ammo=new List<MyInventoryItem>();
if(!names_block_ores.Contains(block.Name)){
//取出矿
current_Inventory.GetItems(items_ore,d=>d.Type.TypeId=="MyObjectBuilder_Ore");
}
if(!names_block_ingots.Contains(block.Name)){
//取出锭
current_Inventory.GetItems(items_ingot,d=>d.Type.TypeId=="MyObjectBuilder_Ingot");
}
if(!names_block_components.Contains(block.Name)){
//取出零件
current_Inventory.GetItems(items_component,d=>d.Type.TypeId=="MyObjectBuilder_Component");
}
if(!names_block_tools.Contains(block.Name)){
//取出武器和工具
current_Inventory.GetItems(items_tool,d=>typeids_tool.Contains(d.Type.TypeId));
}
if(!names_block_ammos.Contains(block.Name)){
//取出弹药
current_Inventory.GetItems(items_ammo,d=>d.Type.TypeId=="MyObjectBuilder_AmmoMagazine");
}
//统计矿和锭的数量
if(lcds.Count>0){
for(int i=0;i<block.InventoryCount;i++){
var inventory=block.GetInventory(i);
var items_oreAndIngot=new List<MyInventoryItem>();
inventory.GetItems(items_oreAndIngot,d=>d.Type.TypeId=="MyObjectBuilder_Ore"||d.Type.TypeId=="MyObjectBuilder_Ingot");
foreach(var item in items_oreAndIngot){
var amount=double.Parse(item.Amount.ToString());
if(DictOre.ContainsKey(item.Type.SubtypeId)){
DictOre[item.Type.SubtypeId]+=amount;
}else{
DictOre.Add(item.Type.SubtypeId,amount);
}
}
}
}
TransferItem(items_ore,block,current_Inventory,block_ores);
TransferItem(items_ingot,block,current_Inventory,block_ingots);
TransferItem(items_component,block,current_Inventory,block_components);
TransferItem(items_tool,block,current_Inventory,block_tools);
TransferItem(items_ammo,block,current_Inventory,block_ammos);
}
//矿物库存信息输出到LCD
if(DictOre.Count>0){
//汇总信息输出
var info=new StringBuilder();
foreach(var k in DictOre.Keys){
var msg=$"{nameMap[k]}:{DictOre[k]:N}kg";
info.AppendLine(msg);
}
var info_str=info.ToString();
foreach(var lcd in lcds){
lcd.WritePublicText(info_str);
}
}
//发电管理
var batteries=new List<IMyBatteryBlock>();
var powerBlocks=new List<IMyPowerProducer>();
GridTerminalSystem.GetBlocksOfType<IMyBatteryBlock>(batteries);
GridTerminalSystem.GetBlocksOfType<IMyPowerProducer>(powerBlocks,d=>d.DisplayNameText.Contains("[发电]"));
if(powerBlocks.Count>0){
var needpower=false;
foreach(var bat in batteries){
if((bat.CurrentStoredPower/bat.MaxStoredPower)<0.5){
needpower=true;
break;
}
}
foreach(var power in powerBlocks){
Echo($"发电设备:{power.DisplayNameText} 开关:{needpower}");
power.Enabled=needpower;
}
}
}
//转移物品
void TransferItem(List<MyInventoryItem> items,IMyTerminalBlock fromBlock,IMyInventory current_Inventory,List<IMyTerminalBlock> toBlocks){
if(items.Count==0){
return;
}
foreach(var block_c in toBlocks){
if(block_c.Name==fromBlock.Name){
continue;
}
var inventory=block_c.GetInventory();
foreach(var item in items){
if(inventory.IsFull){
break;
}
current_Inventory.TransferItemTo(inventory,item);
}
}
}