public override void Simulate() { if (!Host.IsServer) { return; } using (Prediction.Off()) { if (!Input.Pressed(InputButton.Attack1)) { return; } var startPos = Owner.EyePosition; var dir = Owner.EyeRotation.Forward; var tr = Trace.Ray(startPos, startPos + dir * MaxTraceDistance) .Ignore(Owner) .Run(); if (!tr.Hit) { return; } if (!tr.Entity.IsValid()) { return; } var attached = !tr.Entity.IsWorld && tr.Body.IsValid() && tr.Body.PhysicsGroup != null && tr.Body.GetEntity().IsValid(); if (attached && tr.Entity is not Prop) { return; } CreateHitEffects(tr.EndPosition); if (tr.Entity is WheelEntity) { // TODO: Set properties return; } var ent = new WheelEntity { Position = tr.EndPosition, Rotation = Rotation.LookAt(tr.Normal) * Rotation.From(new Angles(0, 90, 0)), }; ent.SetModel("models/citizen_props/wheel01.vmdl"); ent.PhysicsBody.Mass = tr.Body.Mass; ent.Joint = PhysicsJoint.CreateHinge(ent.PhysicsBody, tr.Body, tr.EndPosition, tr.Normal); } }
public override void Create(EntityManager entityManager, GameObjectConversionSystem conversionSystem) { UpdateAuto(); conversionSystem.World.GetOrCreateSystem <EndJointConversionSystem>().CreateJointEntity( this, GetConstrainedBodyPair(conversionSystem), PhysicsJoint.CreateHinge( new BodyFrame { Axis = HingeAxisLocal, Position = PositionLocal }, new BodyFrame { Axis = HingeAxisInConnectedEntity, Position = PositionInConnectedEntity } ) ); }
public override void Create(EntityManager entityManager, GameObjectConversionSystem conversionSystem) { UpdateAuto(); Math.CalculatePerpendicularNormalized(HingeAxisLocal, out var perpendicularLocal, out _); Math.CalculatePerpendicularNormalized(HingeAxisInConnectedEntity, out var perpendicularConnected, out _); conversionSystem.World.GetOrCreateSystem <EndJointConversionSystem>().CreateJointEntity( this, GetConstrainedBodyPair(conversionSystem), PhysicsJoint.CreateHinge( new BodyFrame { Axis = HingeAxisLocal, Position = PositionLocal, PerpendicularAxis = perpendicularLocal }, new BodyFrame { Axis = HingeAxisInConnectedEntity, Position = PositionInConnectedEntity, PerpendicularAxis = perpendicularConnected } ) ); }
void ConvertHingeJoint(LegacyHinge joint) { RigidTransform worldFromBodyA = Math.DecomposeRigidBodyTransform(joint.transform.localToWorldMatrix); RigidTransform worldFromBodyB = joint.connectedBody == null ? RigidTransform.identity : Math.DecomposeRigidBodyTransform(joint.connectedBody.transform.localToWorldMatrix); Math.CalculatePerpendicularNormalized(joint.axis, out float3 perpendicularA, out _); var bodyAFromJoint = new BodyFrame { Axis = joint.axis, PerpendicularAxis = perpendicularA, Position = joint.anchor }; var connectedEntity = GetPrimaryEntity(joint.connectedBody); var isConnectedBodyConverted = joint.connectedBody == null || connectedEntity != Entity.Null; RigidTransform bFromA = isConnectedBodyConverted ? math.mul(math.inverse(worldFromBodyB), worldFromBodyA) : worldFromBodyA; RigidTransform bFromBSource = isConnectedBodyConverted ? RigidTransform.identity : worldFromBodyB; var bodyBFromJoint = new BodyFrame { Axis = math.mul(bFromA.rot, joint.axis), PerpendicularAxis = math.mul(bFromA.rot, perpendicularA), Position = math.mul(bFromBSource, new float4(joint.connectedAnchor, 1f)).xyz }; var limits = math.radians(new FloatRange(joint.limits.min, joint.limits.max).Sorted()); var jointData = joint.useLimits ? PhysicsJoint.CreateLimitedHinge(bodyAFromJoint, bodyBFromJoint, limits) : PhysicsJoint.CreateHinge(bodyAFromJoint, bodyBFromJoint); m_EndJointConversionSystem.CreateJointEntity(joint, GetConstrainedBodyPair(joint), jointData); }