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); }
/// <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); }); }
public RemovedFromBodyEvent(SharedBodyComponent old) { Old = old; }
public AddedToBodyEvent(SharedBodyComponent body) { Body = body; }
protected override void OnRemovedFromBody(SharedBodyComponent old) { base.OnRemovedFromBody(old); HandleMind(Part !.Owner, old.Owner); }
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); } }
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);
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);
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);
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);
public AddedToPartInBodyEvent(SharedBodyComponent body, SharedBodyPartComponent part) { Body = body; Part = part; }
protected override void OnAddedToBody(SharedBodyComponent body) { base.OnAddedToBody(body); WasAddedToBody = true; }
public RemovedFromPartInBodyEvent(SharedBodyComponent oldBody, SharedBodyPartComponent oldPart) { OldBody = oldBody; OldPart = oldPart; }
protected override void OnAddedToPartInBody(SharedBodyComponent body, SharedBodyPartComponent part) { base.OnAddedToPartInBody(body, part); WasAddedToPartInBody = true; }
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) { }