public JointVehicleMotor ConnectWheel(VehiclePartEntity wheel, bool driving, bool powered) { wheel.SetFriction(2.5f); Vector3 left = Quaternion.Transform(new Vector3(-1, 0, 0), wheel.GetOrientation()); Vector3 up = Quaternion.Transform(new Vector3(0, 0, 1), wheel.GetOrientation()); JointSlider pointOnLineJoint = new JointSlider(this, wheel, -new Location(up)); JointLAxisLimit suspensionLimit = new JointLAxisLimit(this, wheel, 0f, 0.1f, wheel.GetPosition(), wheel.GetPosition(), -new Location(up)); JointPullPush spring = new JointPullPush(this, wheel, -new Location(up), true); BEPUphysics.CollisionRuleManagement.CollisionRules.AddRule(wheel.Body, this.Body, BEPUphysics.CollisionRuleManagement.CollisionRule.NoBroadPhase); // TODO: How necessary is this? Should we replicate this clientside? if (driving) { JointSpinner spinner = new JointSpinner(this, wheel, new Location(-left)); TheRegion.AddJoint(spinner); } else { JointSwivelHinge swivelhinge = new JointSwivelHinge(this, wheel, new Location(up), new Location(-left)); TheRegion.AddJoint(swivelhinge); } TheRegion.AddJoint(pointOnLineJoint); TheRegion.AddJoint(suspensionLimit); TheRegion.AddJoint(spring); if (powered) { JointVehicleMotor motor = new JointVehicleMotor(this, wheel, new Location(driving ? left : up), !driving); TheRegion.AddJoint(motor); return motor; } return null; }
public bool Accept(PhysicsEntity sitter) { if (Sitter != null) { return false; } Sitter = sitter; if (Sitter.CurrentSeat != null) { Sitter.CurrentSeat.Kick(); } Sitter.CurrentSeat = this; OldPosition = Sitter.GetPosition() - SeatHolder.GetPosition(); Sitter.SetOrientation(SeatHolder.GetOrientation()); Sitter.SetPosition(SeatHolder.GetPosition() + PositionOffset); if (Sitter is PlayerEntity) { ((PlayerEntity)Sitter).Teleport(SeatHolder.GetPosition() + PositionOffset); // TODO: Teleport method on all entities! } double len = (double)PositionOffset.Length(); js = new JointSlider(SeatHolder, sitter, PositionOffset / len); jbs = new JointBallSocket(SeatHolder, sitter, sitter.GetPosition()); jnc = new JointNoCollide(SeatHolder, sitter); SeatHolder.TheRegion.AddJoint(js); SeatHolder.TheRegion.AddJoint(jbs); SeatHolder.TheRegion.AddJoint(jnc); if (SeatHolder is VehicleEntity && sitter is PlayerEntity) { ((VehicleEntity)SeatHolder).Accepted((PlayerEntity)sitter, this); } return true; }
public void Kick() { if (js == null) { return; } if (SeatHolder is VehicleEntity && Sitter != null && Sitter is PlayerEntity) { ((VehicleEntity)SeatHolder).SeatKicked((PlayerEntity)Sitter, this); } SeatHolder.TheRegion.DestroyJoint(js); SeatHolder.TheRegion.DestroyJoint(jbs); SeatHolder.TheRegion.DestroyJoint(jnc); js = null; jbs = null; jnc = null; if (Sitter is PlayerEntity) { ((PlayerEntity)Sitter).Teleport(OldPosition + SeatHolder.GetPosition()); } else { Sitter.SetPosition(OldPosition + SeatHolder.GetPosition()); } Sitter.CurrentSeat = null; Sitter = null; OldPosition = Location.Zero; }