public override void RemovedFromBody(SharedBodyComponent old)
        {
            DebugTools.AssertNull(Body);
            DebugTools.AssertNotNull(old);

            OnRemovedFromBody(old);
        }
        public override void AddedToBody(SharedBodyComponent body)
        {
            DebugTools.AssertNotNull(Body);
            DebugTools.AssertNotNull(body);

            OnAddedToBody(body);
        }
        private void SendBodyPartListToUser(AfterInteractEventArgs eventArgs, SharedBodyComponent body)
        {
            // Create dictionary to send to client (text to be shown : data sent back if selected)
            var toSend = new Dictionary <string, int>();

            foreach (var(part, slot) in body.Parts)
            {
                // For each limb in the target, add it to our cache if it is a valid option.
                if (part.CanAddMechanism(this))
                {
                    OptionsCache.Add(IdHash, slot);
                    toSend.Add(part + ": " + part.Name, IdHash++);
                }
            }

            if (OptionsCache.Count > 0 &&
                _entities.TryGetComponent(eventArgs.User, out ActorComponent? actor))
            {
                OpenSurgeryUI(actor.PlayerSession);
                UpdateSurgeryUIBodyPartRequest(actor.PlayerSession, toSend);
                PerformerCache = eventArgs.User;
                BodyCache      = body;
            }
            else // If surgery cannot be performed, show message saying so.
            {
                eventArgs.Target?.PopupMessage(eventArgs.User,
                                               Loc.GetString("mechanism-component-no-way-to-install-message", ("partName", Name: _entities.GetComponent <MetaDataComponent>(Owner).EntityName)));
            }
        }
        public override void RemovedFromPartInBody(SharedBodyComponent oldBody, SharedBodyPartComponent oldPart)
        {
            DebugTools.AssertNull(Body);
            DebugTools.AssertNull(Part);
            DebugTools.AssertNotNull(oldBody);
            DebugTools.AssertNotNull(oldPart);

            OnRemovedFromPartInBody(oldBody, oldPart);
        }
        public override void AddedToPartInBody(SharedBodyComponent body, SharedBodyPartComponent part)
        {
            DebugTools.AssertNotNull(Body);
            DebugTools.AssertNotNull(body);
            DebugTools.AssertNotNull(Part);
            DebugTools.AssertNotNull(part);

            OnAddedToPartInBody(body, part);
        }
Example #6
0
        /// <summary>
        ///     Raised directed at a victim when someone has force fed them a drink.
        /// </summary>
        private void OnForceDrink(EntityUid uid, SharedBodyComponent body, ForceDrinkEvent args)
        {
            if (args.Drink.Deleted)
            {
                return;
            }

            args.Drink.CancelToken = null;
            var transferAmount = FixedPoint2.Min(args.Drink.TransferAmount, args.DrinkSolution.DrainAvailable);
            var drained        = _solutionContainerSystem.Drain((args.Drink).Owner, args.DrinkSolution, transferAmount);

            if (!_bodySystem.TryGetComponentsOnMechanisms <StomachComponent>(uid, out var stomachs, body))
            {
                _popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-cannot-drink-other"),
                                         uid, Filter.Entities(args.User));

                _spillableSystem.SpillAt(uid, drained, "PuddleSmear");
                return;
            }

            var firstStomach = stomachs.FirstOrNull(
                stomach => _stomachSystem.CanTransferSolution((stomach.Comp).Owner, drained));

            // All stomach are full or can't handle whatever solution we have.
            if (firstStomach == null)
            {
                _popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough-other"),
                                         uid, Filter.Entities(args.User));

                _spillableSystem.SpillAt(uid, drained, "PuddleSmear");
                return;
            }

            EntityManager.TryGetComponent(uid, out MetaDataComponent? targetMeta);
            var targetName = targetMeta?.EntityName ?? string.Empty;

            EntityManager.TryGetComponent(args.User, out MetaDataComponent? userMeta);
            var userName = userMeta?.EntityName ?? string.Empty;

            _popupSystem.PopupEntity(Loc.GetString("drink-component-force-feed-success", ("user", userName)),
                                     uid, Filter.Entities(uid));

            _popupSystem.PopupEntity(Loc.GetString("drink-component-force-feed-success-user", ("target", targetName)),
                                     args.User, Filter.Entities(args.User));

            SoundSystem.Play(Filter.Pvs(uid), args.Drink.UseSound.GetSound(), uid, AudioParams.Default.WithVolume(-2f));

            drained.DoEntityReaction(uid, ReactionMethod.Ingestion);
            _stomachSystem.TryTransferSolution((firstStomach.Value.Comp).Owner, drained, firstStomach.Value.Comp);
        }
 protected virtual void OnRemovedFromBody(SharedBodyComponent old)
 {
 }
        public async Task BuckledDyingDropItemsTest()
        {
            var options = new ServerContentIntegrationOption {
                ExtraPrototypes = Prototypes
            };
            var server = StartServer(options);

            EntityUid           human  = default;
            BuckleComponent     buckle = null;
            HandsComponent      hands  = null;
            SharedBodyComponent body   = null;

            await server.WaitIdleAsync();

            await server.WaitAssertion(() =>
            {
                var mapManager    = IoCManager.Resolve <IMapManager>();
                var entityManager = IoCManager.Resolve <IEntityManager>();

                var grid        = GetMainGrid(mapManager);
                var coordinates = new EntityCoordinates(grid.GridEntityId, 0, 0);

                human     = entityManager.SpawnEntity(BuckleDummyId, coordinates);
                var chair = entityManager.SpawnEntity(StrapDummyId, coordinates);

                // Component sanity check
                Assert.True(entityManager.TryGetComponent(human, out buckle));
                Assert.True(entityManager.HasComponent <StrapComponent>(chair));
                Assert.True(entityManager.TryGetComponent(human, out hands));
                Assert.True(entityManager.TryGetComponent(human, out body));

                // Buckle
                Assert.True(buckle.TryBuckle(human, chair));
                Assert.NotNull(buckle.BuckledTo);
                Assert.True(buckle.Buckled);

                // Put an item into every hand
                for (var i = 0; i < hands.Count; i++)
                {
                    var akms = entityManager.SpawnEntity(ItemDummyId, coordinates);

                    // Equip items
                    Assert.True(entityManager.TryGetComponent(akms, out SharedItemComponent item));
                    Assert.True(hands.PutInHand(item));
                }
            });

            await server.WaitRunTicks(10);

            await server.WaitAssertion(() =>
            {
                // Still buckled
                Assert.True(buckle.Buckled);

                // With items in all hands
                foreach (var slot in hands.HandNames)
                {
                    Assert.NotNull(hands.GetItem(slot));
                }

                var legs = body.GetPartsOfType(BodyPartType.Leg);

                // Break our guy's kneecaps
                foreach (var leg in legs)
                {
                    body.RemovePart(leg);
                }
            });

            await server.WaitRunTicks(10);

            await server.WaitAssertion(() =>
            {
                // Still buckled
                Assert.True(buckle.Buckled);

                // Now with no item in any hand
                foreach (var slot in hands.HandNames)
                {
                    Assert.Null(hands.GetItem(slot));
                }

                buckle.TryUnbuckle(human, true);
            });
        }
Example #9
0
 public RemovedFromBodyEvent(SharedBodyComponent old)
 {
     Old = old;
 }
Example #10
0
 public AddedToBodyEvent(SharedBodyComponent body)
 {
     Body = body;
 }
Example #11
0
        protected override void OnRemovedFromBody(SharedBodyComponent old)
        {
            base.OnRemovedFromBody(old);

            HandleMind(Part !.Owner, old.Owner);
        }
Example #12
0
        protected override void OnAddedToBody(SharedBodyComponent body)
        {
            base.OnAddedToBody(body);

            HandleMind(body.Owner, Owner);
        }
        private void OnFeed(EntityUid uid, SharedBodyComponent body, FeedEvent args)
        {
            if (args.Food.Deleted)
            {
                return;
            }

            args.Food.CancelToken = null;

            if (!_bodySystem.TryGetComponentsOnMechanisms <StomachComponent>(uid, out var stomachs, body))
            {
                return;
            }

            var transferAmount = args.Food.TransferAmount != null
                ? FixedPoint2.Min((FixedPoint2)args.Food.TransferAmount, args.FoodSolution.CurrentVolume)
                : args.FoodSolution.CurrentVolume;

            var split        = _solutionContainerSystem.SplitSolution((args.Food).Owner, args.FoodSolution, transferAmount);
            var firstStomach = stomachs.FirstOrNull(
                stomach => _stomachSystem.CanTransferSolution((stomach.Comp).Owner, split));

            var forceFeed = uid != args.User;

            // No stomach so just popup a message that they can't eat.
            if (firstStomach == null)
            {
                _solutionContainerSystem.TryAddSolution(uid, args.FoodSolution, split);
                _popupSystem.PopupEntity(
                    forceFeed ?
                    Loc.GetString("food-system-you-cannot-eat-any-more-other") :
                    Loc.GetString("food-system-you-cannot-eat-any-more")
                    , uid, Filter.Entities(args.User));
                return;
            }

            split.DoEntityReaction(uid, ReactionMethod.Ingestion);
            _stomachSystem.TryTransferSolution(firstStomach.Value.Comp.Owner, split, firstStomach.Value.Comp);

            if (forceFeed)
            {
                EntityManager.TryGetComponent(uid, out MetaDataComponent? targetMeta);
                var targetName = targetMeta?.EntityName ?? string.Empty;

                EntityManager.TryGetComponent(args.User, out MetaDataComponent? userMeta);
                var userName = userMeta?.EntityName ?? string.Empty;

                _popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success", ("user", userName)),
                                         uid, Filter.Entities(uid));

                _popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success-user", ("target", targetName)),
                                         args.User, Filter.Entities(args.User));
            }
            else
            {
                _popupSystem.PopupEntity(Loc.GetString(args.Food.EatMessage, ("food", args.Food.Owner)), args.User, Filter.Entities(args.User));
            }

            SoundSystem.Play(Filter.Pvs(uid), args.Food.UseSound.GetSound(), uid, AudioParams.Default.WithVolume(-1f));

            // Try to break all used utensils
            foreach (var utensil in args.Utensils)
            {
                _utensilSystem.TryBreak((utensil).Owner, args.User);
            }

            if (args.Food.UsesRemaining > 0)
            {
                return;
            }

            if (string.IsNullOrEmpty(args.Food.TrashPrototype))
            {
                EntityManager.QueueDeleteEntity(args.Food.Owner);
            }
            else
            {
                DeleteAndSpawnTrash(args.Food, args.User);
            }
        }
Example #14
0
        public async Task AirConsistencyTest()
        {
            // --- Setup
            var options = new ServerContentIntegrationOption {
                ExtraPrototypes = Prototypes
            };
            var server = StartServer(options);

            await server.WaitIdleAsync();

            var mapLoader             = server.ResolveDependency <IMapLoader>();
            var mapManager            = server.ResolveDependency <IMapManager>();
            var entityManager         = server.ResolveDependency <IEntityManager>();
            RespiratorSystem  respSys = default;
            MetabolizerSystem metaSys = default;

            MapId                   mapId;
            IMapGrid                grid          = null;
            SharedBodyComponent     body          = default;
            EntityUid               human         = default;
            GridAtmosphereComponent relevantAtmos = default;
            float                   startingMoles = 0.0f;

            var testMapName = "Maps/Test/Breathing/3by3-20oxy-80nit.yml";

            await server.WaitPost(() =>
            {
                mapId = mapManager.CreateMap();
                grid  = mapLoader.LoadBlueprint(mapId, testMapName);
            });

            Assert.NotNull(grid, $"Test blueprint {testMapName} not found.");

            float GetMapMoles()
            {
                var totalMapMoles = 0.0f;

                foreach (var tile in relevantAtmos.Tiles.Values)
                {
                    totalMapMoles += tile.Air?.TotalMoles ?? 0.0f;
                }

                return(totalMapMoles);
            }

            await server.WaitAssertion(() =>
            {
                var coords      = new Vector2(0.5f, -1f);
                var coordinates = new EntityCoordinates(grid.GridEntityId, coords);
                human           = entityManager.SpawnEntity("HumanBodyDummy", coordinates);
                respSys         = EntitySystem.Get <RespiratorSystem>();
                metaSys         = EntitySystem.Get <MetabolizerSystem>();
                relevantAtmos   = entityManager.GetComponent <GridAtmosphereComponent>(grid.GridEntityId);
                startingMoles   = GetMapMoles();

                Assert.True(entityManager.TryGetComponent(human, out body));
                Assert.True(entityManager.HasComponent <RespiratorComponent>(human));
            });

            // --- End setup

            var inhaleCycles = 100;

            for (var i = 0; i < inhaleCycles; i++)
            {
                await server.WaitAssertion(() =>
                {
                    // inhale
                    respSys.Update(2.0f);
                    Assert.That(GetMapMoles(), Is.LessThan(startingMoles));

                    // metabolize + exhale
                    metaSys.Update(1.0f);
                    metaSys.Update(1.0f);
                    respSys.Update(2.0f);
                    Assert.That(GetMapMoles(), Is.EqualTo(startingMoles).Within(0.0001));
                });
            }

            await server.WaitIdleAsync();
        }
 protected virtual void OnRemovedFromPartInBody(SharedBodyComponent oldBody, SharedBodyPartComponent oldPart)
 {
 }
            protected override void OnRemovedFromBody(SharedBodyComponent old)
            {
                base.OnRemovedFromBody(old);

                WasRemovedFromBody = true;
            }
            protected override void OnRemovedFromPartInBody(SharedBodyComponent oldBody, SharedBodyPartComponent oldPart)
            {
                base.OnRemovedFromPartInBody(oldBody, oldPart);

                WasRemovedFromPartInBody = true;
            }
 /// <summary>
 ///     Called when the parent part is removed from a body.
 ///     For instance, removing a head with a brain inside from a body.
 ///     DO NOT CALL THIS DIRECTLY FROM OUTSIDE BODY SYSTEM CODE!
 /// </summary>
 /// <param name="old">
 ///     The body that the containing mechanism was removed from.
 /// </param>
 public abstract void RemovedFromBody(SharedBodyComponent old);
Example #19
0
 private BodyScannerUIState InterfaceState(SharedBodyComponent body)
 {
     return(new(body.Owner.Uid));
 }
 /// <summary>
 ///     Called when the parent mechanism is removed from a part that is attached to a body.
 ///     For instance, removing a brain from a head that is attached to a body.
 ///     DO NOT CALL THIS DIRECTLY FROM OUTSIDE BODY SYSTEM CODE!
 /// </summary>
 /// <param name="oldBody">
 ///     The body that the containing mechanism was removed from.
 /// </param>
 /// <param name="oldPart">
 ///     The part that the containing mechanism was removed from.
 /// </param>
 public abstract void RemovedFromPartInBody(SharedBodyComponent oldBody, SharedBodyPartComponent oldPart);
Example #21
0
        protected override void OnAddedToPartInBody(SharedBodyComponent body, SharedBodyPartComponent part)
        {
            base.OnAddedToPartInBody(body, part);

            HandleMind(body.Owner, Owner);
        }
 /// <summary>
 ///     Called when the containing part is attached to a body.
 ///     For instance, attaching a head with a brain inside to a body.
 ///     DO NOT CALL THIS DIRECTLY FROM OUTSIDE BODY SYSTEM CODE!
 /// </summary>
 /// <param name="body">
 ///     The body that the containing mechanism was added to.
 /// </param>
 public abstract void AddedToBody(SharedBodyComponent body);
Example #23
0
        protected override void OnRemovedFromPartInBody(SharedBodyComponent oldBody, SharedBodyPartComponent oldPart)
        {
            base.OnRemovedFromPartInBody(oldBody, oldPart);

            HandleMind(oldBody.Owner, Owner);
        }
 /// <summary>
 ///     Called when the parent mechanism is added to a part that is attached to a body.
 ///     For instance, adding a brain to a head that is attached to a body.
 ///     DO NOT CALL THIS DIRECTLY FROM OUTSIDE BODY SYSTEM CODE!
 /// </summary>
 /// <param name="body">
 ///     The body that the containing mechanism was added to.
 /// </param>
 /// <param name="part">
 ///     The part that the containing mechanism was added to.
 /// </param>
 public abstract void AddedToPartInBody(SharedBodyComponent body, SharedBodyPartComponent part);
Example #25
0
 public AddedToPartInBodyEvent(SharedBodyComponent body, SharedBodyPartComponent part)
 {
     Body = body;
     Part = part;
 }
            protected override void OnAddedToBody(SharedBodyComponent body)
            {
                base.OnAddedToBody(body);

                WasAddedToBody = true;
            }
Example #27
0
 public RemovedFromPartInBodyEvent(SharedBodyComponent oldBody, SharedBodyPartComponent oldPart)
 {
     OldBody = oldBody;
     OldPart = oldPart;
 }
            protected override void OnAddedToPartInBody(SharedBodyComponent body, SharedBodyPartComponent part)
            {
                base.OnAddedToPartInBody(body, part);

                WasAddedToPartInBody = true;
            }
Example #29
0
        public async Task BuckledDyingDropItemsTest()
        {
            await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { NoClient = true, ExtraPrototypes = Prototypes });

            var server = pairTracker.Pair.Server;

            var testMap = await PoolManager.CreateTestMap(pairTracker);

            var coordinates = testMap.GridCoords;

            EntityUid           human  = default;
            BuckleComponent     buckle = null;
            HandsComponent      hands  = null;
            SharedBodyComponent body   = null;

            await server.WaitIdleAsync();

            await server.WaitAssertion(() =>
            {
                var entityManager = IoCManager.Resolve <IEntityManager>();

                human     = entityManager.SpawnEntity(BuckleDummyId, coordinates);
                var chair = entityManager.SpawnEntity(StrapDummyId, coordinates);

                // Component sanity check
                Assert.True(entityManager.TryGetComponent(human, out buckle));
                Assert.True(entityManager.HasComponent <StrapComponent>(chair));
                Assert.True(entityManager.TryGetComponent(human, out hands));
                Assert.True(entityManager.TryGetComponent(human, out body));

                // Buckle
                Assert.True(buckle.TryBuckle(human, chair));
                Assert.NotNull(buckle.BuckledTo);
                Assert.True(buckle.Buckled);

                // Put an item into every hand
                for (var i = 0; i < hands.Count; i++)
                {
                    var akms = entityManager.SpawnEntity(ItemDummyId, coordinates);

                    Assert.True(EntitySystem.Get <SharedHandsSystem>().TryPickupAnyHand(human, akms));
                }
            });

            await server.WaitRunTicks(10);

            await server.WaitAssertion(() =>
            {
                // Still buckled
                Assert.True(buckle.Buckled);

                // With items in all hands
                foreach (var hand in hands.Hands.Values)
                {
                    Assert.NotNull(hands.ActiveHandEntity);
                }

                var legs = body.GetPartsOfType(BodyPartType.Leg);

                // Break our guy's kneecaps
                foreach (var leg in legs)
                {
                    body.RemovePart(leg);
                }
            });

            await server.WaitRunTicks(10);

            await server.WaitAssertion(() =>
            {
                // Still buckled
                Assert.True(buckle.Buckled);

                // Now with no item in any hand
                foreach (var hand in hands.Hands.Values)
                {
                    Assert.Null(hands.ActiveHandEntity);
                }

                buckle.TryUnbuckle(human, true);
            });

            await pairTracker.CleanReturnAsync();
        }
 protected virtual void OnAddedToPartInBody(SharedBodyComponent body, SharedBodyPartComponent part)
 {
 }