//precondition: lock is already taken public bool PackItems() { TEStorageUnit unitWithSpace = null; foreach (TEAbstractStorageUnit abstractStorageUnit in GetStorageUnits()) { if (!(abstractStorageUnit is TEStorageUnit)) { continue; } TEStorageUnit storageUnit = (TEStorageUnit)abstractStorageUnit; if (unitWithSpace == null && !storageUnit.IsFull && !storageUnit.Inactive) { unitWithSpace = storageUnit; } else if (unitWithSpace != null && !storageUnit.IsEmpty) { NetHelper.StartUpdateQueue(); while (!unitWithSpace.IsFull && !storageUnit.IsEmpty) { Item item = storageUnit.WithdrawStack(); unitWithSpace.DepositItem(item, true); if (!item.IsAir) { storageUnit.DepositItem(item, true); } } NetHelper.ProcessUpdateQueue(); NetHelper.SendRefreshNetworkItems(ID); return(true); } } compactStage++; return(false); }
//precondition: lock is already taken public bool EmptyInactive() { TEStorageUnit inactiveUnit = null; foreach (TEAbstractStorageUnit abstractStorageUnit in GetStorageUnits()) { if (!(abstractStorageUnit is TEStorageUnit)) { continue; } TEStorageUnit storageUnit = (TEStorageUnit)abstractStorageUnit; if (storageUnit.Inactive && !storageUnit.IsEmpty) { inactiveUnit = storageUnit; } } if (inactiveUnit == null) { compactStage++; return(false); } foreach (TEAbstractStorageUnit abstractStorageUnit in GetStorageUnits()) { if (!(abstractStorageUnit is TEStorageUnit) || abstractStorageUnit.Inactive) { continue; } TEStorageUnit storageUnit = (TEStorageUnit)abstractStorageUnit; if (storageUnit.IsEmpty && inactiveUnit.NumItems <= storageUnit.Capacity) { TEStorageUnit.SwapItems(inactiveUnit, storageUnit); NetHelper.SendRefreshNetworkItems(ID); return(true); } } bool hasChange = false; NetHelper.StartUpdateQueue(); Item tryMove = inactiveUnit.WithdrawStack(); foreach (TEAbstractStorageUnit abstractStorageUnit in GetStorageUnits()) { if (!(abstractStorageUnit is TEStorageUnit) || abstractStorageUnit.Inactive) { continue; } TEStorageUnit storageUnit = (TEStorageUnit)abstractStorageUnit; while (storageUnit.HasSpaceFor(tryMove, true) && !tryMove.IsAir) { storageUnit.DepositItem(tryMove, true); if (tryMove.IsAir && !inactiveUnit.IsEmpty) { tryMove = inactiveUnit.WithdrawStack(); } hasChange = true; } } if (!tryMove.IsAir) { inactiveUnit.DepositItem(tryMove, true); } NetHelper.ProcessUpdateQueue(); if (hasChange) { NetHelper.SendRefreshNetworkItems(ID); } else { compactStage++; } return(hasChange); }
protected override bool ReceiveData(BinaryReader reader, TEStorageUnit unit) { unit.WithdrawStack(); return(true); }