Esempio n. 1
0
        public static void Impound(Guid playerID, NWItem item)
        {
            PCImpoundedItem structureImpoundedItem;

            // Processing a container, impound it's contents first.
            if (item.HasInventory)
            {
                foreach (NWItem inventoryItem in item.InventoryItems)
                {
                    structureImpoundedItem = new PCImpoundedItem
                    {
                        DateImpounded = DateTime.UtcNow,
                        PlayerID      = playerID,
                        ItemObject    = SerializationService.Serialize(inventoryItem),
                        ItemTag       = inventoryItem.Tag,
                        ItemResref    = inventoryItem.Resref,
                        ItemName      = inventoryItem.Name
                    };
                    DataService.SubmitDataChange(structureImpoundedItem, DatabaseActionType.Insert);
                }
            }

            // Impound parameter item.
            structureImpoundedItem = new PCImpoundedItem
            {
                DateImpounded = DateTime.UtcNow,
                PlayerID      = playerID,
                ItemObject    = SerializationService.Serialize(item),
                ItemTag       = item.Tag,
                ItemResref    = item.Resref,
                ItemName      = item.Name
            };
            DataService.SubmitDataChange(structureImpoundedItem, DatabaseActionType.Insert);
        }
Esempio n. 2
0
        public static void Impound(Guid playerID, NWItem item)
        {
            PCImpoundedItem structureImpoundedItem = new PCImpoundedItem
            {
                DateImpounded = DateTime.UtcNow,
                PlayerID      = playerID,
                ItemObject    = SerializationService.Serialize(item),
                ItemTag       = item.Tag,
                ItemResref    = item.Resref,
                ItemName      = item.Name
            };

            DataService.SubmitDataChange(structureImpoundedItem, DatabaseActionType.Insert);
        }
Esempio n. 3
0
        public void GetByID_OneItem_ReturnsPCImpoundedItem()
        {
            // Arrange
            var             id     = Guid.NewGuid();
            PCImpoundedItem entity = new PCImpoundedItem {
                ID = id
            };

            // Act
            MessageHub.Instance.Publish(new OnCacheObjectSet <PCImpoundedItem>(entity));

            // Assert
            Assert.AreNotSame(entity, _cache.GetByID(id));
        }
Esempio n. 4
0
        public static void Impound(PCBaseStructureItem pcBaseStructureItem)
        {
            var pcBaseStructure = DataService.PCBaseStructure.GetByID(pcBaseStructureItem.PCBaseStructureID);
            var pcBase          = DataService.PCBase.GetByID(pcBaseStructure.PCBaseID);

            var impoundItem = new PCImpoundedItem
            {
                DateImpounded = DateTime.UtcNow,
                ItemName      = pcBaseStructureItem.ItemName,
                ItemResref    = pcBaseStructureItem.ItemResref,
                ItemObject    = pcBaseStructureItem.ItemObject,
                ItemTag       = pcBaseStructureItem.ItemTag,
                PlayerID      = pcBase.PlayerID
            };

            DataService.SubmitDataChange(impoundItem, DatabaseActionType.Insert);
        }
Esempio n. 5
0
        public void GetByID_TwoItems_ReturnsCorrectObject()
        {
            // Arrange
            var             id1     = Guid.NewGuid();
            var             id2     = Guid.NewGuid();
            PCImpoundedItem entity1 = new PCImpoundedItem {
                ID = id1
            };
            PCImpoundedItem entity2 = new PCImpoundedItem {
                ID = id2
            };

            // Act
            MessageHub.Instance.Publish(new OnCacheObjectSet <PCImpoundedItem>(entity1));
            MessageHub.Instance.Publish(new OnCacheObjectSet <PCImpoundedItem>(entity2));

            // Assert
            Assert.AreNotSame(entity1, _cache.GetByID(id1));
            Assert.AreNotSame(entity2, _cache.GetByID(id2));
        }
Esempio n. 6
0
        public void GetByID_RemovedItem_ReturnsCorrectObject()
        {
            // Arrange
            var             id1     = Guid.NewGuid();
            var             id2     = Guid.NewGuid();
            PCImpoundedItem entity1 = new PCImpoundedItem {
                ID = id1
            };
            PCImpoundedItem entity2 = new PCImpoundedItem {
                ID = id2
            };

            // Act
            MessageHub.Instance.Publish(new OnCacheObjectSet <PCImpoundedItem>(entity1));
            MessageHub.Instance.Publish(new OnCacheObjectSet <PCImpoundedItem>(entity2));
            MessageHub.Instance.Publish(new OnCacheObjectDeleted <PCImpoundedItem>(entity1));

            // Assert
            Assert.Throws <KeyNotFoundException>(() => { _cache.GetByID(id1); });
            Assert.AreNotSame(entity2, _cache.GetByID(id2));
        }
Esempio n. 7
0
        private void DoRetrieveStructure()
        {
            var               data           = _base.GetPlayerTempData(GetPC());
            PCBaseStructure   structure      = _data.Get <PCBaseStructure>(data.ManipulatingStructure.PCBaseStructureID);
            BaseStructure     baseStructure  = _data.Get <BaseStructure>(structure.BaseStructureID);
            PCBase            pcBase         = _data.Get <PCBase>(structure.PCBaseID);
            BaseStructureType structureType  = (BaseStructureType)baseStructure.BaseStructureTypeID;
            var               tempStorage    = _.GetObjectByTag("TEMP_ITEM_STORAGE");
            var               pcStructureID  = structure.ID;
            int               impoundedCount = 0;

            var controlTower = _base.GetBaseControlTower(pcBase.ID);
            int maxShields   = _base.CalculateMaxShieldHP(controlTower);

            if (pcBase.ShieldHP < maxShields && structureType != BaseStructureType.ControlTower)
            {
                GetPC().FloatingText("You cannot retrieve any structures because the control tower has less than 100% shields.");
                return;
            }

            bool canRetrieveStructures;

            if (data.BuildingType == Enumeration.BuildingType.Exterior ||
                data.BuildingType == Enumeration.BuildingType.Apartment)
            {
                canRetrieveStructures = _perm.HasBasePermission(GetPC(), data.ManipulatingStructure.PCBaseID, BasePermission.CanRetrieveStructures);
            }
            else if (data.BuildingType == Enumeration.BuildingType.Interior)
            {
                var structureID = new Guid(data.ManipulatingStructure.Structure.Area.GetLocalString("PC_BASE_STRUCTURE_ID"));
                canRetrieveStructures = _perm.HasStructurePermission(GetPC(), structureID, StructurePermission.CanRetrieveStructures);
            }
            else
            {
                throw new Exception("BaseManagementTool -> DoRetrieveStructure: Cannot handle building type " + data.BuildingType);
            }

            if (!canRetrieveStructures)
            {
                GetPC().FloatingText("You don't have permission to retrieve structures.");
                return;
            }


            if (structureType == BaseStructureType.ControlTower)
            {
                var structureCount = _data.GetAll <PCBaseStructure>().Count(x => x.PCBaseID == structure.PCBaseID);

                if (structureCount > 1)
                {
                    GetPC().FloatingText("You must remove all structures in this sector before picking up the control tower.");
                    return;
                }
            }
            else if (structureType == BaseStructureType.Building)
            {
                var childStructures = _data.Where <PCBaseStructure>(x => x.ParentPCBaseStructureID == structure.ID).ToList();
                for (int x = childStructures.Count - 1; x >= 0; x--)
                {
                    var    furniture     = childStructures.ElementAt(x);
                    NWItem furnitureItem = _base.ConvertStructureToItem(furniture, tempStorage);
                    _impound.Impound(GetPC().GlobalID, furnitureItem);
                    furnitureItem.Destroy();

                    _data.SubmitDataChange(furniture, DatabaseActionType.Delete);
                    impoundedCount++;
                }
            }

            _base.ConvertStructureToItem(structure, GetPC());
            _data.SubmitDataChange(structure, DatabaseActionType.Delete);
            data.ManipulatingStructure.Structure.Destroy();

            // Impound any fuel that's over the limit.
            if (structureType == BaseStructureType.StronidiumSilo || structureType == BaseStructureType.FuelSilo)
            {
                int maxFuel           = _base.CalculateMaxFuel(pcBase.ID);
                int maxReinforcedFuel = _base.CalculateMaxReinforcedFuel(pcBase.ID);

                if (pcBase.Fuel > maxFuel)
                {
                    int    returnAmount = pcBase.Fuel - maxFuel;
                    NWItem refund       = _.CreateItemOnObject("fuel_cell", tempStorage, returnAmount);
                    pcBase.Fuel = maxFuel;
                    _impound.Impound(pcBase.PlayerID, refund);
                    GetPC().SendMessage("Excess fuel cells have been impounded by the planetary government. The owner of the base will need to retrieve it.");
                    refund.Destroy();
                }

                if (pcBase.ReinforcedFuel > maxReinforcedFuel)
                {
                    int    returnAmount = pcBase.ReinforcedFuel - maxReinforcedFuel;
                    NWItem refund       = _.CreateItemOnObject("stronidium", tempStorage, returnAmount);
                    pcBase.ReinforcedFuel = maxReinforcedFuel;
                    _impound.Impound(pcBase.PlayerID, refund);
                    GetPC().SendMessage("Excess stronidium units have been impounded by the planetary government. The owner of the base will need to retrieve it.");
                    refund.Destroy();
                }
            }
            else if (structureType == BaseStructureType.ResourceSilo)
            {
                int maxResources = _base.CalculateResourceCapacity(pcBase.ID);
                var items        = _data.Where <PCBaseStructureItem>(x => x.PCBaseStructureID == controlTower.ID).ToList();

                while (items.Count > maxResources)
                {
                    var item = items.ElementAt(0);

                    var impoundItem = new PCImpoundedItem
                    {
                        PlayerID      = pcBase.PlayerID,
                        ItemResref    = item.ItemResref,
                        ItemObject    = item.ItemObject,
                        DateImpounded = DateTime.UtcNow,
                        ItemName      = item.ItemName,
                        ItemTag       = item.ItemTag
                    };

                    _data.SubmitDataChange(impoundItem, DatabaseActionType.Insert);
                    GetPC().SendMessage(item.ItemName + " has been impounded by the planetary government because your base ran out of space to store resources. The owner of the base will need to retrieve it.");
                    _data.SubmitDataChange(item, DatabaseActionType.Delete);
                }
            }

            // Update the cache
            List <AreaStructure> areaStructures = data.TargetArea.Data["BASE_SERVICE_STRUCTURES"];
            var records = areaStructures.Where(x => x.PCBaseStructureID == pcStructureID).ToList();

            for (int x = records.Count() - 1; x >= 0; x--)
            {
                var record = records[x];
                record.ChildStructure?.Destroy();
                areaStructures.Remove(record);
            }

            EndConversation();

            if (impoundedCount > 0)
            {
                GetPC().FloatingText(impoundedCount + " item(s) were sent to the planetary impound.");
            }
        }