private void PreventCollision(EntityUid uid, ThrownItemComponent component, PreventCollideEvent args) { if (args.BodyB.Owner == component.Thrower) { args.Cancel(); } }
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); }
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); }
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); }
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); }
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; } }
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; }
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); }
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); }
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); }
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 }); }
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); }
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); }
private void OnGetState(EntityUid uid, ThrownItemComponent component, ref ComponentGetState args) { args.State = new ThrownItemComponentState(component.Thrower?.Uid); }
private void HandleSleep(EntityUid uid, ThrownItemComponent thrownItem, PhysicsSleepMessage message) { StopThrow(uid, thrownItem); }
private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsSleepEvent @event) { StopThrow(uid, thrownItem); }