コード例 #1
0
 private void PreventCollision(EntityUid uid, ThrownItemComponent component, PreventCollideEvent args)
 {
     if (args.BodyB.Owner == component.Thrower)
     {
         args.Cancel();
     }
 }
コード例 #2
0
        private void ThrowItem(EntityUid uid, ThrownItemComponent component, ThrownEvent args)
        {
            if (!EntityManager.TryGetComponent(component.Owner, out FixturesComponent? fixturesComponent) ||
                fixturesComponent.Fixtures.Count != 1)
            {
                return;
            }
            if (!EntityManager.TryGetComponent(component.Owner, out PhysicsComponent? physicsComponent))
            {
                return;
            }

            if (fixturesComponent.Fixtures.ContainsKey(ThrowingFixture))
            {
                Logger.Error($"Found existing throwing fixture on {component.Owner}");
                return;
            }
            var fixture         = fixturesComponent.Fixtures.Values.First();
            var shape           = fixture.Shape;
            var throwingFixture = new Fixture(physicsComponent, shape)
            {
                CollisionMask = (int)CollisionGroup.ThrownItem, Hard = false, ID = ThrowingFixture
            };

            _fixtures.TryCreateFixture(physicsComponent, throwingFixture, manager: fixturesComponent);
        }
コード例 #3
0
        public void LandComponent(ThrownItemComponent thrownItem)
        {
            if (thrownItem.Deleted || Deleted(thrownItem.Owner) || _containerSystem.IsEntityInContainer(thrownItem.Owner))
            {
                return;
            }

            var landing = thrownItem.Owner;

            // Unfortunately we can't check for hands containers as they have specific names.
            if (thrownItem.Owner.TryGetContainerMan(out var containerManager) &&
                EntityManager.HasComponent <SharedHandsComponent>(containerManager.Owner))
            {
                EntityManager.RemoveComponent(landing, thrownItem);
                return;
            }

            // Assume it's uninteresting if it has no thrower. For now anyway.
            if (thrownItem.Thrower is not null)
            {
                _adminLogger.Add(LogType.Landed, LogImpact.Low, $"{ToPrettyString(landing):entity} thrown by {ToPrettyString(thrownItem.Thrower.Value):thrower} landed.");
            }

            var landMsg = new LandEvent {
                User = thrownItem.Thrower
            };

            RaiseLocalEvent(landing, landMsg, false);
        }
コード例 #4
0
        private void HandleCollision(EntityUid uid, ThrownItemComponent component, StartCollideEvent args)
        {
            var thrower   = component.Thrower;
            var otherBody = args.OtherFixture.Body;

            if (otherBody.Owner == thrower)
            {
                return;
            }
            ThrowCollideInteraction(thrower, args.OurFixture.Body, otherBody);
        }
コード例 #5
0
        private void HandleSleep(EntityUid uid, ThrownItemComponent thrownItem, PhysicsSleepMessage message)
        {
            // Unfortunately we can't check for hands containers as they have specific names.
            if (EntityManager.GetEntity(uid).TryGetContainerMan(out var manager) &&
                manager.Owner.HasComponent <SharedHandsComponent>())
            {
                return;
            }

            LandComponent(thrownItem);
        }
コード例 #6
0
        private void OnHandleState(EntityUid uid, ThrownItemComponent component, ref ComponentHandleState args)
        {
            if (args.Current is not ThrownItemComponentState state || state.Thrower == null)
            {
                return;
            }

            if (EntityManager.TryGetEntity(state.Thrower.Value, out var entity))
            {
                component.Thrower = entity;
            }
        }
コード例 #7
0
        private void OnHandleState(EntityUid uid, ThrownItemComponent component, ref ComponentHandleState args)
        {
            if (args.Current is not ThrownItemComponentState {
                Thrower : not null
            } state ||
                !state.Thrower.Value.IsValid())
            {
                return;
            }

            component.Thrower = state.Thrower.Value;
        }
コード例 #8
0
        private void LandItem(EntityUid uid, ThrownItemComponent component, LandEvent args)
        {
            if (!component.Owner.TryGetComponent(out PhysicsComponent? physicsComponent))
            {
                return;
            }

            var fixture = physicsComponent.GetFixture(ThrowingFixture);

            if (fixture == null)
            {
                return;
            }

            _broadphaseSystem.DestroyFixture(physicsComponent, fixture);
        }
コード例 #9
0
        private void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent)
        {
            if (EntityManager.TryGetComponent(uid, out PhysicsComponent? physicsComponent))
            {
                var fixture = physicsComponent.GetFixture(ThrowingFixture);

                if (fixture != null)
                {
                    _broadphaseSystem.DestroyFixture(physicsComponent, fixture);
                }
            }

            EntityManager.EventBus.RaiseLocalEvent(uid, new StopThrowEvent {
                User = thrownItemComponent.Thrower?.Uid
            });
            EntityManager.RemoveComponent <ThrownItemComponent>(uid);
        }
コード例 #10
0
        private void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent)
        {
            if (EntityManager.TryGetComponent(uid, out PhysicsComponent? physicsComponent))
            {
                var fixture = _fixtures.GetFixtureOrNull(physicsComponent, ThrowingFixture);

                if (fixture != null)
                {
                    _fixtures.DestroyFixture(physicsComponent, fixture);
                }
            }

            EntityManager.EventBus.RaiseLocalEvent(uid, new StopThrowEvent {
                User = thrownItemComponent.Thrower
            }, true);
            EntityManager.RemoveComponent <ThrownItemComponent>(uid);
        }
コード例 #11
0
        private void ThrowItem(EntityUid uid, ThrownItemComponent component, ThrownEvent args)
        {
            if (!component.Owner.TryGetComponent(out PhysicsComponent? physicsComponent) ||
                physicsComponent.Fixtures.Count != 1)
            {
                return;
            }

            if (physicsComponent.GetFixture(ThrowingFixture) != null)
            {
                Logger.Error($"Found existing throwing fixture on {component.Owner}");
                return;
            }

            var shape = physicsComponent.Fixtures[0].Shape;

            _broadphaseSystem.CreateFixture(physicsComponent, new Fixture(physicsComponent, shape)
            {
                CollisionLayer = (int)CollisionGroup.ThrownItem, Hard = false, ID = ThrowingFixture
            });
        }
コード例 #12
0
        public void LandComponent(ThrownItemComponent thrownItem)
        {
            if (thrownItem.Deleted || thrownItem.Owner.Deleted || _containerSystem.IsEntityInContainer(thrownItem.Owner.Uid))
            {
                return;
            }

            var landing = thrownItem.Owner;

            // Unfortunately we can't check for hands containers as they have specific names.
            if (thrownItem.Owner.TryGetContainerMan(out var containerManager) &&
                containerManager.Owner.HasComponent <SharedHandsComponent>())
            {
                EntityManager.RemoveComponent(landing.Uid, thrownItem);
                return;
            }

            var landMsg = new LandEvent {
                User = thrownItem.Thrower?.Uid
            };

            RaiseLocalEvent(landing.Uid, landMsg, false);
        }
コード例 #13
0
        private void LandComponent(ThrownItemComponent thrownItem)
        {
            if (thrownItem.Owner.Deleted)
            {
                return;
            }

            var user        = thrownItem.Thrower;
            var landing     = thrownItem.Owner;
            var coordinates = landing.Transform.Coordinates;

            // LandInteraction
            // TODO: Refactor these to system messages
            var landMsg = new LandEvent(user, landing, coordinates);

            RaiseLocalEvent(landing.Uid, landMsg);
            if (landMsg.Handled)
            {
                return;
            }

            var comps    = landing.GetAllComponents <ILand>().ToArray();
            var landArgs = new LandEventArgs(user, coordinates);

            // Call Land on all components that implement the interface
            foreach (var comp in comps)
            {
                if (landing.Deleted)
                {
                    break;
                }
                comp.Land(landArgs);
            }

            ComponentManager.RemoveComponent(landing.Uid, thrownItem);
        }
コード例 #14
0
 private void OnGetState(EntityUid uid, ThrownItemComponent component, ref ComponentGetState args)
 {
     args.State = new ThrownItemComponentState(component.Thrower?.Uid);
 }
コード例 #15
0
 private void HandleSleep(EntityUid uid, ThrownItemComponent thrownItem, PhysicsSleepMessage message)
 {
     StopThrow(uid, thrownItem);
 }
コード例 #16
0
 private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsSleepEvent @event)
 {
     StopThrow(uid, thrownItem);
 }