/// <summary>
        /// Inserts storeable entities into this storage container if possible, otherwise return to the hand of the user
        /// </summary>
        /// <param name="user"></param>
        /// <param name="attackwith"></param>
        /// <returns></returns>
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            _ensureInitialCalculated();
            Logger.DebugS("Storage", "Storage (UID {0}) attacked by user (UID {1}) with entity (UID {2}).", Owner.Uid, eventArgs.User.Uid, eventArgs.AttackWith.Uid);

            if (Owner.TryGetComponent <PlaceableSurfaceComponent>(out var placeableSurfaceComponent))
            {
                return(false);
            }

            if (!eventArgs.User.TryGetComponent(out HandsComponent hands))
            {
                return(false);
            }

            //Check that we can drop the item from our hands first otherwise we obviously cant put it inside
            if (CanInsert(hands.GetActiveHand.Owner) && hands.Drop(hands.ActiveIndex))
            {
                if (Insert(eventArgs.AttackWith))
                {
                    return(true);
                }
            }
            else
            {
                Owner.PopupMessage(eventArgs.User, "Can't insert.");
            }
            return(false);
        }
Beispiel #2
0
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            if (!eventArgs.AttackWith.TryGetComponent <WelderComponent>(out var welder))
            {
                return(false);
            }
            if (welder.TryUse(5.0f))
            {
                // Repair generator
                var damagable = Owner.GetComponent <DamageableComponent>();
                var breakable = Owner.GetComponent <BreakableComponent>();
                damagable.HealAllDamage();
                breakable.broken = false;
                _intact          = true;

                var entitySystemManager = IoCManager.Resolve <IEntitySystemManager>();
                var notifyManager       = IoCManager.Resolve <IServerNotifyManager>();

                entitySystemManager.GetEntitySystem <AudioSystem>().Play("/Audio/items/welder2.ogg", Owner);
                notifyManager.PopupMessage(Owner, eventArgs.User, Loc.GetString("You repair the gravity generator with the welder"));

                return(true);
            }
            else
            {
                return(false);
            }
        }
        bool IAttackBy.AttackBy(AttackByEventArgs eventArgs)
        {
            if (!eventArgs.AttackWith.HasComponent <PowerCellComponent>())
            {
                return(false);
            }

            if (Cell != null)
            {
                return(false);
            }

            var handsComponent = eventArgs.User.GetComponent <IHandsComponent>();

            if (!handsComponent.Drop(eventArgs.AttackWith, _cellContainer))
            {
                return(false);
            }

            if (Owner.TryGetComponent(out SoundComponent soundComponent))
            {
                soundComponent.Play("/Audio/items/weapons/pistol_magin.ogg");
            }

            return(true);
        }
 public bool AttackBy(AttackByEventArgs eventArgs)
 {
     if (eventArgs.AttackWith.TryGetComponent(out WirecutterComponent wirecutter))
     {
         Owner.Delete();
         return(true);
     }
     return(false);
 }
        /// <summary>
        /// Inserts storeable entities into this storage container if possible, otherwise return to the hand of the user
        /// </summary>
        /// <param name="user"></param>
        /// <param name="attackwith"></param>
        /// <returns></returns>
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            Logger.DebugS("Storage", "Storage (UID {0}) attacked by user (UID {1}) with entity (UID {2}).", Owner.Uid, eventArgs.User.Uid, eventArgs.AttackWith.Uid);

            if(Owner.TryGetComponent<PlaceableSurfaceComponent>(out var placeableSurfaceComponent))
            {
                return false;
            }

            return PlayerInsertEntity(eventArgs.User);
         }
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            var playerEntity      = eventArgs.User;
            var interactionSystem = _entitySystemManager.GetEntitySystem <InteractionSystem>();

            if (!interactionSystem.InRangeUnobstructed(playerEntity.Transform.MapPosition, Owner.Transform.WorldPosition, ignoredEnt: Owner, insideBlockerValid: Prototype.CanBuildInImpassable))
            {
                _notifyManager.PopupMessage(Owner.Transform.GridPosition, playerEntity,
                                            _localizationManager.GetString("You can't reach there!"));
                return(false);
            }

            var stage = Prototype.Stages[Stage];

            if (TryProcessStep(stage.Forward, eventArgs.AttackWith))
            {
                Stage++;
                if (Stage == Prototype.Stages.Count - 1)
                {
                    // Oh boy we get to finish construction!
                    var entMgr = IoCManager.Resolve <IServerEntityManager>();
                    var ent    = entMgr.SpawnEntity(Prototype.Result, Transform.GridPosition);
                    ent.GetComponent <ITransformComponent>().LocalRotation = Transform.LocalRotation;
                    Owner.Delete();
                    return(true);
                }

                stage = Prototype.Stages[Stage];
                if (stage.Icon != null)
                {
                    Sprite.LayerSetSprite(0, stage.Icon);
                }
            }

            else if (TryProcessStep(stage.Backward, eventArgs.AttackWith))
            {
                Stage--;
                if (Stage == 0)
                {
                    // Deconstruction complete.
                    Owner.Delete();
                    return(true);
                }

                stage = Prototype.Stages[Stage];
                if (stage.Icon != null)
                {
                    Sprite.LayerSetSprite(0, stage.Icon);
                }
            }

            return(true);
        }
        bool IAttackBy.AttackBy(AttackByEventArgs eventArgs)
        {
            var result = TryInsertItem(eventArgs.AttackWith);

            if (!result)
            {
                var localizationManager = IoCManager.Resolve <ILocalizationManager>();
                eventArgs.User.PopupMessage(Owner, localizationManager.GetString("Unable to insert capacitor"));
            }

            return(result);
        }
Beispiel #8
0
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            var itemEntity = eventArgs.User.GetComponent <HandsComponent>().GetActiveHand.Owner;

            if (itemEntity.TryGetComponent <PourableComponent>(out var attackPourable))
            {
                //Get target and check if it can be poured into
                if (!Owner.TryGetComponent <SolutionComponent>(out var mySolution) ||
                    !mySolution.CanPourIn)
                {
                    return(false);
                }

                if (!itemEntity.TryGetComponent <SolutionComponent>(out var attackSolution) ||
                    !attackSolution.CanPourOut)
                {
                    return(false);
                }

                //Get transfer amount. May be smaller than _transferAmount if not enough room
                var realTransferAmount = ReagentUnit.Min(attackPourable.TransferAmount, mySolution.EmptyVolume);
                if (realTransferAmount <= 0) //Special message if container is full
                {
                    _notifyManager.PopupMessage(Owner.Transform.GridPosition, eventArgs.User,
                                                Loc.GetString("Container is full"));
                    return(false);
                }

                //Move units from attackSolution to targetSolution
                var removedSolution = attackSolution.SplitSolution(realTransferAmount);
                if (!mySolution.TryAddSolution(removedSolution))
                {
                    return(false);
                }

                _notifyManager.PopupMessage(Owner.Transform.GridPosition, eventArgs.User,
                                            Loc.GetString("Transferred {0}u", removedSolution.TotalVolume));
                return(true);
            }

            if (!itemEntity.TryGetComponent(typeof(FoodComponent), out var food))
            {
                return(false);
            }

            var ent = food.Owner; //Get the entity of the ItemComponent.

            _storage.Insert(ent);
            UpdateUserInterface();
            return(true);
        }
Beispiel #9
0
 public bool AttackBy(AttackByEventArgs eventArgs)
 {
     if (!eventArgs.AttackWith.TryGetComponent(out PowerStorageComponent component))
     {
         return(false);
     }
     if (capacitorComponent.Full)
     {
         Owner.PopupMessage(eventArgs.User, "Capacitor at max charge");
         return(false);
     }
     capacitorComponent.FillFrom(component);
     return(true);
 }
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            if (!eventArgs.AttackWith.HasComponent <WriteComponent>())
            {
                return(false);
            }
            if (!eventArgs.User.TryGetComponent(out IActorComponent actor))
            {
                return(false);
            }

            _mode = PaperAction.Write;
            UpdateUserInterface();
            _userInterface.Open(actor.playerSession);
            return(true);
        }
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            if (eventArgs.AttackWith.TryGetComponent(out WirecutterComponent wirecutter))
            {
                Owner.Delete();
                var droppedEnt = Owner.EntityManager.SpawnEntity("CableStack", eventArgs.ClickLocation);

                if (droppedEnt.TryGetComponent <StackComponent>(out var stackComp))
                {
                    stackComp.Count = 1;
                }

                return(true);
            }
            return(false);
        }
Beispiel #12
0
        bool IAttackBy.AttackBy(AttackByEventArgs eventArgs)
        {
            if (!eventArgs.AttackWith.HasComponent <PowerCellComponent>())
            {
                return(false);
            }

            if (Cell != null)
            {
                return(false);
            }

            eventArgs.User.GetComponent <IHandsComponent>().Drop(eventArgs.AttackWith, _cellContainer);

            return(_cellContainer.Insert(eventArgs.AttackWith));
        }
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            if (!eventArgs.AttackWith.HasComponent <WrenchComponent>())
            {
                return(false);
            }

            if (!Owner.TryGetComponent(out PhysicsComponent physics))
            {
                return(false);
            }

            physics.Anchored = !physics.Anchored;
            _audioSystem.Play("/Audio/items/ratchet.ogg", Owner);

            return(true);
        }
 public bool AttackBy(AttackByEventArgs eventArgs)
 {
     if (!eventArgs.AttackWith.TryGetComponent(out BallisticMagazineComponent component))
     {
         return(false);
     }
     if (Magazine != null)
     {
         Owner.PopupMessage(eventArgs.User, "Already got a magazine.");
         return(false);
     }
     if (!MagazineTypes.Contains(component.MagazineType))
     {
         Owner.PopupMessage(eventArgs.User, "Magazine doesn't fit.");
         return(false);
     }
     return(InsertMagazine(eventArgs.AttackWith));
 }
        bool IAttackBy.AttackBy(AttackByEventArgs eventArgs)
        {
            if (!Owner.TryGetComponent(out MaterialStorageComponent storage) ||
                !eventArgs.AttackWith.TryGetComponent(out MaterialComponent material))
            {
                return(false);
            }

            var multiplier = 1;

            if (eventArgs.AttackWith.TryGetComponent(out StackComponent stack))
            {
                multiplier = stack.Count;
            }

            var totalAmount = 0;

            // Check if it can insert all materials.
            foreach (var mat in material.MaterialTypes.Values)
            {
                // TODO: Change how MaterialComponent works so this is not hard-coded.
                if (!storage.CanInsertMaterial(mat.ID, VolumePerSheet * multiplier))
                {
                    return(false);
                }
                totalAmount += VolumePerSheet * multiplier;
            }

            // Check if it can take ALL of the material's volume.
            if (storage.CanTakeAmount(totalAmount))
            {
                return(false);
            }

            foreach (var mat in material.MaterialTypes.Values)
            {
                storage.InsertMaterial(mat.ID, VolumePerSheet * multiplier);
            }

            eventArgs.AttackWith.Delete();

            return(false);
        }
Beispiel #16
0
        public bool AttackBy(AttackByEventArgs eventArgs)
        {
            var stage = Prototype.Stages[Stage];

            if (TryProcessStep(stage.Forward, eventArgs.AttackWith))
            {
                Stage++;
                if (Stage == Prototype.Stages.Count - 1)
                {
                    // Oh boy we get to finish construction!
                    var entMgr = IoCManager.Resolve <IServerEntityManager>();
                    var ent    = entMgr.SpawnEntity(Prototype.Result, Transform.GridPosition);
                    ent.GetComponent <ITransformComponent>().LocalRotation = Transform.LocalRotation;
                    Owner.Delete();
                    return(true);
                }

                stage = Prototype.Stages[Stage];
                if (stage.Icon != null)
                {
                    Sprite.LayerSetSprite(0, stage.Icon);
                }
            }

            else if (TryProcessStep(stage.Backward, eventArgs.AttackWith))
            {
                Stage--;
                if (Stage == 0)
                {
                    // Deconstruction complete.
                    Owner.Delete();
                    return(true);
                }

                stage = Prototype.Stages[Stage];
                if (stage.Icon != null)
                {
                    Sprite.LayerSetSprite(0, stage.Icon);
                }
            }

            return(true);
        }
        bool IAttackBy.AttackBy(AttackByEventArgs eventArgs)
        {
            var item = eventArgs.AttackWith;

            if (!item.TryGetComponent(out MeleeWeaponComponent meleeWeaponComponent))
            {
                return(false);
            }

            Owner.GetComponent <DamageableComponent>().TakeDamage(DamageType.Brute, meleeWeaponComponent.Damage, item, eventArgs.User);

            if (!item.TryGetComponent(out PickaxeComponent pickaxeComponent))
            {
                return(true);
            }
            if (!string.IsNullOrWhiteSpace(pickaxeComponent.MiningSound) &&
                item.TryGetComponent <SoundComponent>(out var soundComponent))
            {
                soundComponent.Play(pickaxeComponent.MiningSound, AudioParams.Default);
            }
            return(true);
        }
Beispiel #18
0
        /// <summary>
        /// Called when you click the owner entity with something in your active hand. If the entity in your hand
        /// contains a <see cref="SolutionComponent"/>, if you have hands, and if the dispenser doesn't already
        /// hold a container, it will be added to the dispenser.
        /// </summary>
        /// <param name="args">Data relevant to the event such as the actor which triggered it.</param>
        /// <returns></returns>
        bool IAttackBy.AttackBy(AttackByEventArgs args)
        {
            if (!args.User.TryGetComponent(out IHandsComponent hands))
            {
                _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User,
                                            _localizationManager.GetString("You have no hands."));
                return(true);
            }

            var activeHandEntity = hands.GetActiveHand.Owner;

            if (activeHandEntity.TryGetComponent <SolutionComponent>(out var solution))
            {
                if (HasBeaker)
                {
                    _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User,
                                                _localizationManager.GetString("This dispenser already has a container in it."));
                }
                else if ((solution.Capabilities & SolutionCaps.FitsInDispenser) == 0)
                {
                    //If it can't fit in the dispenser, don't put it in. For example, buckets and mop buckets can't fit.
                    _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User,
                                                _localizationManager.GetString("That can't fit in the dispenser."));
                }
                else
                {
                    _beakerContainer.Insert(activeHandEntity);
                    Solution.SolutionChanged += HandleSolutionChangedEvent;
                    UpdateUserInterface();
                }
            }
            else
            {
                _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User,
                                            _localizationManager.GetString("You can't put this in the dispenser."));
            }

            return(true);
        }
        bool IAttackBy.AttackBy(AttackByEventArgs eventArgs)
        {
            var ammoMagTransfer = CanTransferFrom(eventArgs.AttackWith);

            if (ammoMagTransfer.Result)
            {
                IEntity bullet;
                if (eventArgs.AttackWith.TryGetComponent(out BallisticMagazineComponent magazineComponent))
                {
                    int fillCount = Math.Min(magazineComponent.CountLoaded, Capacity - CountLoaded);
                    for (int i = 0; i < fillCount; i++)
                    {
                        bullet = magazineComponent.TakeBullet();
                        AddBullet(bullet);
                    }
                    eventArgs.User.PopupMessage(eventArgs.User, $"Transferred {fillCount} rounds");
                    return(true);
                }
                if (eventArgs.AttackWith.TryGetComponent(out AmmoBoxComponent boxComponent))
                {
                    int fillCount = Math.Min(boxComponent.CountLeft, Capacity - CountLoaded);
                    for (int i = 0; i < fillCount; i++)
                    {
                        bullet = boxComponent.TakeBullet();
                        AddBullet(bullet);
                    }
                    eventArgs.User.PopupMessage(eventArgs.User, $"Transferred {fillCount} rounds");
                    return(true);
                }
            }
            else
            {
                eventArgs.User.PopupMessage(eventArgs.User, ammoMagTransfer.Message);
            }

            return(false);
        }
Beispiel #20
0
 public bool AttackBy(AttackByEventArgs eventArgs)
 {
     return(InsertBulb(eventArgs.AttackWith));
 }