예제 #1
0
    private void OnEmergencyRepealAll(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleRepealAllMessage args)
    {
        var player = args.Session.AttachedEntity;

        if (player == null)
        {
            return;
        }

        if (!_reader.FindAccessTags(player.Value).Contains(EmergencyRepealAllAccess))
        {
            _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), Filter.Entities(player.Value), PopupType.Medium);
            return;
        }

        if (component.AuthorizedEntities.Count == 0)
        {
            return;
        }

        _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Session:user}");
        _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", component.AuthorizationsRequired)));
        component.AuthorizedEntities.Clear();
        UpdateAllEmergencyConsoles();
    }
예제 #2
0
        private void UserSplit(EntityUid uid, EntityUid userUid, int amount,
                               StackComponent?stack             = null,
                               TransformComponent?userTransform = null)
        {
            if (!Resolve(uid, ref stack))
            {
                return;
            }

            if (!Resolve(userUid, ref userTransform))
            {
                return;
            }

            if (amount <= 0)
            {
                _popupSystem.PopupCursor(Loc.GetString("comp-stack-split-too-small"), Filter.Entities(userUid));
                return;
            }

            if (Split(uid, amount, userTransform.Coordinates, stack) is not {
            } split)
            {
                return;
            }

            if (TryComp <HandsComponent>(userUid, out var hands) && TryComp <ItemComponent>(split, out var item))
            {
                hands.PutInHandOrDrop(item);
            }

            _popupSystem.PopupCursor(Loc.GetString("comp-stack-split"), Filter.Entities(userUid));
        }
예제 #3
0
        private void UserSplit(EntityUid uid, EntityUid userUid, int amount,
                               StackComponent?stack             = null,
                               TransformComponent?userTransform = null)
        {
            if (!Resolve(uid, ref stack))
            {
                return;
            }

            if (!Resolve(userUid, ref userTransform))
            {
                return;
            }

            if (amount <= 0)
            {
                _popupSystem.PopupCursor(Loc.GetString("comp-stack-split-too-small"), Filter.Entities(userUid));
                return;
            }

            if (Split(uid, amount, userTransform.Coordinates, stack) is not {
            } split)
            {
                return;
            }

            _handsSystem.PickupOrDrop(userUid, split);

            _popupSystem.PopupCursor(Loc.GetString("comp-stack-split"), Filter.Entities(userUid));
        }
        private void OnUnanchorAttempt(EntityUid uid, AtmosUnsafeUnanchorComponent component, UnanchorAttemptEvent args)
        {
            if (!component.Enabled || !EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodes))
            {
                return;
            }

            if (_atmosphereSystem.GetTileMixture(EntityManager.GetComponent <TransformComponent>(component.Owner).Coordinates) is not {
            } environment)
            {
                return;
            }

            foreach (var node in nodes.Nodes.Values)
            {
                if (node is not PipeNode pipe)
                {
                    continue;
                }

                if ((pipe.Air.Pressure - environment.Pressure) > 2 * Atmospherics.OneAtmosphere)
                {
                    args.Delay += 1.5f;
                    _popupSystem.PopupCursor(Loc.GetString("comp-atmos-unsafe-unanchor-warning"), Filter.Entities(args.User));
                    return; // Show the warning only once.
                }
            }
        }
예제 #5
0
        /// <summary>
        ///     Execute actions associated with the given verb.
        /// </summary>
        /// <remarks>
        ///     Unless this is a client-exclusive verb, this will also tell the server to run the same verb. However, if the verb
        ///     is disabled and has a tooltip, this function will only generate a pop-up-message instead of executing anything.
        /// </remarks>
        public void ExecuteVerb(EntityUid target, Verb verb, VerbType verbType)
        {
            if (verb.Disabled)
            {
                if (verb.Message != null)
                {
                    _popupSystem.PopupCursor(verb.Message);
                }
                return;
            }

            var user = _playerManager.LocalPlayer?.ControlledEntity;

            if (user == null)
            {
                return;
            }

            ExecuteVerb(verb, user.Value, target);

            if (!verb.ClientExclusive)
            {
                RaiseNetworkEvent(new ExecuteVerbEvent(target, verb, verbType));
            }
        }
예제 #6
0
        private void OnToggleMainBreaker(EntityUid uid, ApcComponent component, ApcToggleMainBreakerMessage args)
        {
            TryComp <AccessReaderComponent>(uid, out var access);
            if (args.Session.AttachedEntity == null)
            {
                return;
            }

            if (access == null || _accessReader.IsAllowed(args.Session.AttachedEntity.Value, access))
            {
                ApcToggleBreaker(uid, component);
            }
            else
            {
                _popupSystem.PopupCursor(Loc.GetString("apc-component-insufficient-access"),
                                         Filter.Entities(args.Session.AttachedEntity.Value), PopupType.Medium);
            }
        }
예제 #7
0
        private void OnToggleMainBreaker(EntityUid uid, ApcComponent component, ApcToggleMainBreakerMessage args)
        {
            TryComp <AccessReaderComponent>(uid, out var access);
            if (args.Session.AttachedEntity == null)
            {
                return;
            }

            if (access == null || _accessReader.IsAllowed(access, args.Session.AttachedEntity.Value))
            {
                component.MainBreakerEnabled = !component.MainBreakerEnabled;
                Comp <PowerNetworkBatteryComponent>(uid).CanDischarge = component.MainBreakerEnabled;

                UpdateUIState(uid, component);
                SoundSystem.Play(Filter.Pvs(uid), component.OnReceiveMessageSound.GetSound(), uid, AudioParams.Default.WithVolume(-2f));
            }
            else
            {
                _popupSystem.PopupCursor(Loc.GetString("apc-component-insufficient-access"),
                                         Filter.Entities(args.Session.AttachedEntity.Value));
            }
        }
        private void OnInteractUsing(EntityUid uid, PlantHolderComponent component, InteractUsingEvent args)
        {
            if (TryComp(args.Used, out SeedComponent? seeds))
            {
                if (component.Seed == null)
                {
                    if (!_botanySystem.TryGetSeed(seeds, out var seed))
                    {
                        return;
                    }

                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-plant-success-message",
                                                           ("seedName", seed.Name),
                                                           ("seedNoun", seed.Noun)), Filter.Entities(args.User), PopupType.Medium);

                    component.Seed      = seed;
                    component.Dead      = false;
                    component.Age       = 1;
                    component.Health    = component.Seed.Endurance;
                    component.LastCycle = _gameTiming.CurTime;

                    EntityManager.QueueDeleteEntity(args.Used);

                    component.CheckLevelSanity();
                    component.UpdateSprite();

                    return;
                }

                _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-already-seeded-message",
                                                       ("name", Comp <MetaDataComponent>(uid).EntityName)), Filter.Entities(args.User), PopupType.Medium);
                return;
            }

            if (_tagSystem.HasTag(args.Used, "Hoe"))
            {
                if (component.WeedLevel > 0)
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-remove-weeds-message",
                                                           ("name", Comp <MetaDataComponent>(uid).EntityName)), Filter.Entities(args.User), PopupType.Medium);
                    _popupSystem.PopupEntity(Loc.GetString("plant-holder-component-remove-weeds-others-message",
                                                           ("otherName", Comp <MetaDataComponent>(args.User).EntityName)), uid, Filter.PvsExcept(args.User));
                    component.WeedLevel = 0;
                    component.UpdateSprite();
                }
                else
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-no-weeds-message"), Filter.Entities(args.User));
                }

                return;
            }

            if (_tagSystem.HasTag(args.Used, "Shovel"))
            {
                if (component.Seed != null)
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-remove-plant-message",
                                                           ("name", Comp <MetaDataComponent>(uid).EntityName)), Filter.Entities(args.User), PopupType.Medium);
                    _popupSystem.PopupEntity(Loc.GetString("plant-holder-component-remove-plant-others-message",
                                                           ("name", Comp <MetaDataComponent>(args.User).EntityName)), uid, Filter.PvsExcept(args.User));
                    component.RemovePlant();
                }
                else
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-no-plant-message",
                                                           ("name", Comp <MetaDataComponent>(uid).EntityName)), Filter.Entities(args.User));
                }

                return;
            }

            if (_solutionSystem.TryGetDrainableSolution(args.Used, out var solution) &&
                _solutionSystem.TryGetSolution(uid, component.SoilSolutionName, out var targetSolution) && TryComp(args.Used, out SprayComponent? spray))
            {
                var amount = FixedPoint2.New(1);

                var targetEntity   = uid;
                var solutionEntity = args.Used;


                SoundSystem.Play(spray.SpraySound.GetSound(), Filter.Pvs(args.Used),
                                 args.Used, AudioHelpers.WithVariation(0.125f));


                var split = _solutionSystem.Drain(solutionEntity, solution, amount);

                if (split.TotalVolume == 0)
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-no-plant-message",
                                                           ("owner", args.Used)), Filter.Entities(args.User));
                    return;
                }

                _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-spray-message",
                                                       ("owner", uid),
                                                       ("amount", split.TotalVolume)), Filter.Entities(args.User), PopupType.Medium);

                _solutionSystem.TryAddSolution(targetEntity, targetSolution, split);

                component.ForceUpdateByExternalCause();

                return;
            }

            if (_tagSystem.HasTag(args.Used, "PlantSampleTaker"))
            {
                if (component.Seed == null)
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-nothing-to-sample-message"), Filter.Entities(args.User));
                    return;
                }

                if (component.Sampled)
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-already-sampled-message"), Filter.Entities(args.User));
                    return;
                }

                if (component.Dead)
                {
                    _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-dead-plant-message"), Filter.Entities(args.User));
                    return;
                }

                component.Seed.Unique = false;
                var seed = _botanySystem.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates);
                seed.RandomOffset(0.25f);
                _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-take-sample-message",
                                                       ("seedName", component.Seed.DisplayName)), Filter.Entities(args.User));
                component.Health -= (_random.Next(3, 5) * 10);

                if (_random.Prob(0.3f))
                {
                    component.Sampled = true;
                }

                // Just in case.
                component.CheckLevelSanity();
                component.ForceUpdateByExternalCause();

                return;
            }

            if (HasComp <SharpComponent>(args.Used))
            {
                component.DoHarvest(args.User);
            }

            if (TryComp <ProduceComponent?>(args.Used, out var produce))
            {
                _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-compost-message",
                                                       ("owner", uid),
                                                       ("usingItem", args.Used)), Filter.Entities(args.User), PopupType.Medium);
                _popupSystem.PopupEntity(Loc.GetString("plant-holder-component-compost-others-message",
                                                       ("user", Identity.Entity(args.User, EntityManager)),
                                                       ("usingItem", args.Used),
                                                       ("owner", uid)), uid, Filter.PvsExcept(args.User));

                if (_solutionSystem.TryGetSolution(args.Used, produce.SolutionName, out var solution2))
                {
                    // This deliberately discards overfill.
                    _solutionSystem.TryAddSolution(args.Used, solution2,
                                                   _solutionSystem.SplitSolution(args.Used, solution2, solution2.TotalVolume));

                    component.ForceUpdateByExternalCause();
                }

                EntityManager.QueueDeleteEntity(args.Used);
            }
        }
예제 #9
0
 private void ConsolePopup(ICommonSession session, string text)
 {
     _popup.PopupCursor(text, Filter.SinglePlayer(session));
 }