public override void VisitGravelLayer(GravelLayer layer)
        {
            var node = layer.GetNode(_location);

            if (node == null)
            {
                return;
            }

            var amounts = Math.Min(node.GetValue(_location), _amount);

            var m = _materialHelper.GetMaterialInfo(node.Type);

            _items.Add(m.ToItem((int)amounts));
        }
        private void DoExtractMinerals(IZone zone)
        {
            var terrainLock = GetLock().ThrowIfNotType <TerrainLock>(ErrorCodes.InvalidLockType);

            var ammo = GetAmmo() as MiningAmmo;

            if (ammo == null)
            {
                return;
            }

            var materialInfo = _materialHelper.GetMaterialInfo(ammo.MaterialType);

            CheckEnablerEffect(materialInfo);

            var mineralLayer   = zone.Terrain.GetMineralLayerOrThrow(materialInfo.Type);
            var materialAmount = materialInfo.Amount * _miningAmountModifier.Value;

            var extractedMaterials = Extract(mineralLayer, terrainLock.Location, (uint)materialAmount);

            extractedMaterials.Count.ThrowIfEqual(0, ErrorCodes.NoMineralOnTile);

            extractedMaterials.AddRange(_rareMaterialHandler.GenerateRareMaterials(materialInfo.EntityDefault.Definition));

            CreateBeam(terrainLock.Location, BeamState.AlignToTerrain);

            using (var scope = Db.CreateTransaction())
            {
                Debug.Assert(ParentRobot != null, "ParentRobot != null");
                var container = ParentRobot.GetContainer();
                Debug.Assert(container != null, "container != null");
                container.EnlistTransaction();

                var player = ParentRobot as Player;
                Debug.Assert(player != null, "player != null");

                foreach (var material in extractedMaterials)
                {
                    var item = (Item)Factory.CreateWithRandomEID(material.Definition);

                    item.Owner    = Owner;
                    item.Quantity = material.Quantity;

                    container.AddItem(item, true);

                    var drilledMineralDefinition = material.Definition;
                    var drilledQuantity          = material.Quantity;

                    player.MissionHandler.EnqueueMissionEventInfo(new DrillMineralEventInfo(player, drilledMineralDefinition, drilledQuantity, terrainLock.Location));
                    player.Zone?.MiningLogHandler.EnqueueMiningLog(drilledMineralDefinition, drilledQuantity);
                }

                //save container
                container.Save();
                OnGathererMaterial(zone, player);

                Transaction.Current.OnCommited(() => container.SendUpdateToOwnerAsync());
                scope.Complete();
            }
        }
        private int GetHarvestedAmountPerCycle(PlantRule plantRule)
        {
            double amount;

            switch (plantRule.Type)
            {
            case PlantType.SlimeRoot:
            case PlantType.ElectroPlant:
            case PlantType.RustBush:
            case PlantType.TreeIron:
            {
                var m = _materialHelper.GetMaterialInfo(plantRule.FruitMaterialName.ToMaterialType());
                amount = m.Amount;
                break;
            }

            default:
                throw new PerpetuumException(ErrorCodes.PlantNotHarvestable);
            }

            return((int)(amount * _amountModifier));
        }
Exemple #4
0
        private void OnMineralScanned(MaterialProbeType materialProbeType, MaterialType materialType = MaterialType.Undefined)
        {
            var m = _materialHelper.GetMaterialInfo(materialType);

            _player.MissionHandler.EnqueueMissionEventInfo(new ScanMaterialEventInfo(_player, m.EntityDefault.Definition, materialProbeType, _player.CurrentPosition));
        }