private bool InventoryEmpty(SaveComponent inventoryComponent) { for (int i = 0; i < inventoryComponent.DataFields.Count; i++) { if (inventoryComponent.DataFields[i].PropertyName == "mInventoryStacks") { ArrayProperty inventoryArray = (ArrayProperty)inventoryComponent.DataFields[i]; for (int j = 0; j < ((ArrayProperty)inventoryComponent.DataFields[i]).Elements.Count; j++) { StructProperty inventoryStruct = (StructProperty)inventoryArray.Elements[j]; DynamicStructData inventoryItem = (DynamicStructData)inventoryStruct.Data; for (int k = 0; k < inventoryItem.Fields.Count; k++) { if (inventoryItem.Fields[k].PropertyName == "NumItems") { IntProperty itemCount = (IntProperty)inventoryItem.Fields[k]; if (itemCount.Value != 0) { return(false); } } } } return(true); } } return(true); }
private int MassDismantle(List <SaveObjectModel> objects, ArrayProperty inventory, SaveObjectModel rootItem) { int count = 0; foreach (SaveObjectModel item in objects) { if (item is SaveEntityModel) { if (IsPointInPolygon(((SaveEntityModel)item).Position, polygon) && minZ <= ((SaveEntityModel)item).Position.Z && ((SaveEntityModel)item).Position.Z <= maxZ) { ArrayPropertyViewModel dismantleRefund = ((SaveEntityModel)item).FindField <ArrayPropertyViewModel>("mDismantleRefund"); if (dismantleRefund != null) { foreach (SerializedPropertyViewModel property in dismantleRefund.Elements) { DynamicStructData itemAmountStruct = (DynamicStructData)((StructProperty)property.Model).Data; string itemPath = ((ObjectProperty)itemAmountStruct.Fields[0]).PathName; int itemAmount = ((IntProperty)itemAmountStruct.Fields[1]).Value; byte[] bytes = PrepareForParse(itemPath, itemAmount); using (MemoryStream ms = new MemoryStream(bytes)) using (BinaryReader reader = new BinaryReader(ms)) { SerializedProperty prop = SerializedProperty.Parse(reader); inventory.Elements.Add(prop); } } } if (item.FindField <ObjectPropertyViewModel>("mInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } if (item.FindField <ObjectPropertyViewModel>("mStorageInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mStorageInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } if (item.FindField <ObjectPropertyViewModel>("mInputInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mInputInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } if (item.FindField <ObjectPropertyViewModel>("mOutputInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mOutputInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } rootItem.Remove(item); count++; } } } return(count); }
private ArrayProperty ArrangeInventory(ArrayProperty inventory) { SortedDictionary <string, int> stacks = new SortedDictionary <string, int>(); foreach (StructProperty inventoryStruct in inventory.Elements.Cast <StructProperty>()) { DynamicStructData inventoryStack = (DynamicStructData)inventoryStruct.Data; InventoryItem inventoryItem = (InventoryItem)((StructProperty)inventoryStack.Fields[0]).Data; IntProperty itemCount = (IntProperty)inventoryStack.Fields[1]; if (!stacks.ContainsKey(inventoryItem.ItemType)) { stacks[inventoryItem.ItemType] = 0; } stacks[inventoryItem.ItemType] += itemCount.Value; } ArrayProperty newInventory = new ArrayProperty("mInventoryStacks") { Type = "StructProperty" }; foreach (KeyValuePair <string, int> itemStack in stacks) { string itemPath = itemStack.Key; if (string.IsNullOrWhiteSpace(itemPath)) { continue; } int itemAmount = itemStack.Value; byte[] bytes = PrepareForParse(itemPath, itemAmount); using (MemoryStream ms = new MemoryStream(bytes)) using (BinaryReader reader = new BinaryReader(ms)) { SerializedProperty prop = SerializedProperty.Parse(reader); newInventory.Elements.Add(prop); } } return(newInventory); }
private int MassDismantle(List <SaveObjectModel> objects, ArrayProperty inventory, SaveObjectModel rootItem) { int count = 0; foreach (SaveObjectModel item in objects) { if (item is SaveEntityModel) { if (IsPointInPolygon(((SaveEntityModel)item).Position, polygon) && minZ <= ((SaveEntityModel)item).Position.Z && ((SaveEntityModel)item).Position.Z <= maxZ) { ArrayPropertyViewModel dismantleRefund = ((SaveEntityModel)item).FindField <ArrayPropertyViewModel>("mDismantleRefund"); if (dismantleRefund != null) { foreach (SerializedPropertyViewModel property in dismantleRefund.Elements) { DynamicStructData itemAmountStruct = (DynamicStructData)((StructProperty)property.Model).Data; string itemPath = ((ObjectProperty)itemAmountStruct.Fields[0]).PathName; int itemAmount = ((IntProperty)itemAmountStruct.Fields[1]).Value; byte[] bytes = PrepareForParse(itemPath, itemAmount); using (MemoryStream ms = new MemoryStream(bytes)) using (BinaryReader reader = new BinaryReader(ms)) { SerializedProperty prop = SerializedProperty.Parse(reader); inventory.Elements.Add(prop); } } } if (item.FindField <ObjectPropertyViewModel>("mInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } if (item.FindField <ObjectPropertyViewModel>("mStorageInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mStorageInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } if (item.FindField <ObjectPropertyViewModel>("mInputInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mInputInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } if (item.FindField <ObjectPropertyViewModel>("mOutputInventory") != null) { inventory.Elements.AddRange(((ArrayProperty)rootItem.FindChild(item.FindField <ObjectPropertyViewModel>("mOutputInventory").Str2, false).FindField <ArrayPropertyViewModel>("mInventoryStacks").Model).Elements); } // Unlink miners & geysers if (item.Model.TypePath.StartsWith("/Game/FactoryGame/Buildable/Factory/Miner") || item.Model.TypePath.StartsWith("/Game/FactoryGame/Buildable/Factory/GeneratorGeoThermal") || item.Model.TypePath.StartsWith("/Game/FactoryGame/Buildable/Factory/OilPump")) { string resourceNode = item.FindField <ObjectPropertyViewModel>("mExtractResourceNode").Str2; rootItem.FindChild(resourceNode, false).FindField <BoolPropertyViewModel>("mIsOccupied", property => property.Value = false); } var gameState = rootItem.FindChild("Persistent_Level:PersistentLevel.BP_GameState_C_0", false); if (item.Model.TypePath.StartsWith("/Game/FactoryGame/Buildable/Factory/TradingPost/Build_TradingPost.Build_TradingPost_C")) { gameState.FindField <BoolPropertyViewModel>("mIsTradingPostBuilt", property => property.Value = false); } if (item.Model.TypePath.StartsWith("/Game/FactoryGame/Buildable/Factory/SpaceElevator/Build_SpaceElevator.Build_SpaceElevator_C")) { gameState.FindField <BoolPropertyViewModel>("mIsSpaceElevatorBuilt", property => property.Value = false); } rootItem.Remove(item); count++; } } } return(count); }
public DynamicStructDataViewModel(DynamicStructData dynamicStruct) { model = dynamicStruct; Fields = new ObservableCollection <SerializedPropertyViewModel>(dynamicStruct.Fields.Select(PropertyViewModelMapper.Convert)); }