示例#1
0
 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;
 }
示例#2
0
文件: Seat.cs 项目: Morphan1/Voxalia
 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;
 }
示例#3
0
文件: Seat.cs 项目: Morphan1/Voxalia
 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;
 }