private void PlayerIntersect(MyEntity ent) { var character = ent as IMyCharacter; if (character == null || character.MarkedForClose || character.IsDead) { return; } var npcname = character.ToString(); if (npcname.Equals(SpaceWolf)) { if (_isServer) { var charEvent = Session.Instance.PlayerEffectPool.Get(); charEvent.Init(character, this); Session.Instance.ThreadEvents.Enqueue(charEvent); } return; } var player = MyAPIGateway.Multiplayer.Players.GetPlayerControllingEntity(ent); if (player == null || player.PromoteLevel == MyPromoteLevel.Owner || player.PromoteLevel == MyPromoteLevel.Admin) { return; } var bOriBBoxD = new MyOrientedBoundingBoxD(ent.PositionComp.LocalAABB, ent.PositionComp.WorldMatrixRef); Vector3D closestPos; var sMatrix = DetectMatrixOutside; var dist = CustomCollision.EllipsoidDistanceToPos(ref DetectMatrixOutsideInv, ref sMatrix, ref bOriBBoxD.Center, out closestPos); if (dist <= ent.PositionComp.LocalVolume.Radius) { var collisionData = new MyCollisionPhysicsData { Entity1 = ent, Force1 = -Vector3.Normalize(ShieldEnt.PositionComp.WorldAABB.Center - closestPos), CollisionAvg = closestPos }; if (_isServer) { var charEvent = Session.Instance.PlayerCollisionPool.Get(); charEvent.Init(collisionData, this); Session.Instance.ThreadEvents.Enqueue(charEvent); } } }
private void PlayerIntersect(MyEntity ent) { var character = ent as IMyCharacter; if (character == null || character.MarkedForClose || character.IsDead) { return; } var npcname = character.ToString(); if (npcname.Equals(SpaceWolf)) { if (_isServer) { var charEvent = Session.Instance.PlayerEffectPool.Get(); charEvent.Init(character, this); Session.Instance.ThreadEvents.Enqueue(charEvent); } return; } var player = MyAPIGateway.Multiplayer.Players.GetPlayerControllingEntity(ent); if (player == null || player.PromoteLevel == MyPromoteLevel.Owner || player.PromoteLevel == MyPromoteLevel.Admin) { return; } var obb = new MyOrientedBoundingBoxD(ent.PositionComp.WorldAABB.Center, ent.PositionComp.LocalAABB.HalfExtents, Quaternion.CreateFromRotationMatrix(ent.WorldMatrix)); var playerIntersect = CustomCollision.ObbIntersect(obb, DetectMatrixOutside, DetectMatrixOutsideInv); if (playerIntersect != null) { var collisionData = new MyCollisionPhysicsData { Entity1 = ent, Force1 = -Vector3.Normalize(ShieldEnt.PositionComp.WorldAABB.Center - (Vector3D)playerIntersect), CollisionAvg = (Vector3D)playerIntersect }; if (_isServer) { var charEvent = Session.Instance.PlayerCollisionPool.Get(); charEvent.Init(collisionData, this); Session.Instance.ThreadEvents.Enqueue(charEvent); } } }
private void ComputeVoxelPhysics(MyEntity entity1, MyCubeGrid entity2, Vector3D collisionAvg) { var e2Physics = ((IMyCubeGrid)entity2).Physics; var e2IsStatic = e2Physics.IsStatic; float bMass; if (e2IsStatic) { bMass = float.MaxValue * 0.001f; } else { bMass = entity2.GetCurrentMass(); } var sMass = float.MaxValue * 0.001f; var bCom = e2Physics.CenterOfMassWorld; var bMassRelation = bMass / sMass; var bRelationClamp = MathHelper.Clamp(bMassRelation, 0, 1); var bCollisionCorrection = Vector3D.Lerp(bCom, collisionAvg, bRelationClamp); Vector3 bVelAtPoint; e2Physics.GetVelocityAtPointLocal(ref bCollisionCorrection, out bVelAtPoint); var momentum = (bMass * bVelAtPoint) + (sMass * 0); var resultVelocity = momentum / (bMass + sMass); var bDir = (resultVelocity - bVelAtPoint) * bMass; var bForce = Vector3D.Normalize(bCom - collisionAvg); var collisionData = new MyCollisionPhysicsData { Entity1 = entity1, Entity2 = entity2, E1IsStatic = true, E2IsStatic = false, E1IsHeavier = true, E2IsHeavier = false, Mass1 = sMass, Mass2 = bMass, Com1 = Vector3D.Zero, Com2 = bCom, CollisionCorrection1 = Vector3D.Zero, CollisionCorrection2 = bCollisionCorrection, ImpDirection1 = Vector3D.Zero, ImpDirection2 = bDir, ImpPosition1 = Vector3D.Zero, ImpPosition2 = bCollisionCorrection, Force1 = Vector3D.Zero, Force2 = bForce, ForcePos1 = null, ForcePos2 = null, ForceTorque1 = null, ForceTorque2 = null, CollisionAvg = collisionAvg, Immediate = false }; var collisionEvent = Session.Instance.VoxelCollisionPhysicsPool.Get(); collisionEvent.Init(collisionData, this); Session.Instance.ThreadEvents.Enqueue(collisionEvent); }
private void ComputeCollisionPhysics(MyCubeGrid entity1, MyCubeGrid entity2, Vector3D collisionAvg) { var e1Physics = ((IMyCubeGrid)entity1).Physics; var e2Physics = ((IMyCubeGrid)entity2).Physics; var e1IsStatic = e1Physics.IsStatic; var e2IsStatic = e2Physics.IsStatic; float bMass; if (e1IsStatic) { bMass = float.MaxValue * 0.001f; } else { bMass = entity1.GetCurrentMass(); } float sMass; if (e2IsStatic) { sMass = float.MaxValue * 0.001f; } else if (DsSet.Settings.FortifyShield && DsState.State.Enhancer) { sMass = entity2.GetCurrentMass() * 2; } else { sMass = entity2.GetCurrentMass(); } var bCom = e1Physics.CenterOfMassWorld; var bMassRelation = bMass / sMass; var bRelationClamp = MathHelper.Clamp(bMassRelation, 0, 1); var bCollisionCorrection = Vector3D.Lerp(bCom, collisionAvg, bRelationClamp); Vector3 bVelAtPoint; e1Physics.GetVelocityAtPointLocal(ref bCollisionCorrection, out bVelAtPoint); var sCom = e2IsStatic ? DetectionCenter : e2Physics.CenterOfMassWorld; var sMassRelation = sMass / bMass; var sRelationClamp = MathHelper.Clamp(sMassRelation, 0, 1); var sCollisionCorrection = Vector3D.Lerp(sCom, collisionAvg, sRelationClamp); Vector3 sVelAtPoint; e2Physics.GetVelocityAtPointLocal(ref sCollisionCorrection, out sVelAtPoint); var momentum = (bMass * bVelAtPoint) + (sMass * sVelAtPoint); var resultVelocity = momentum / (bMass + sMass); var bDir = (resultVelocity - bVelAtPoint) * bMass; var bForce = Vector3D.Normalize(bCom - collisionAvg); var sDir = (resultVelocity - sVelAtPoint) * sMass; var sforce = Vector3D.Normalize(sCom - collisionAvg); if (!e2IsStatic) { var collisionData = new MyCollisionPhysicsData { Entity1 = entity1, Entity2 = entity2, E1IsStatic = e1IsStatic, E2IsStatic = e2IsStatic, E1IsHeavier = e1IsStatic || bMass > sMass, E2IsHeavier = e2IsStatic || sMass > bMass, Mass1 = bMass, Mass2 = sMass, Com1 = bCom, Com2 = sCom, CollisionCorrection1 = bCollisionCorrection, CollisionCorrection2 = sCollisionCorrection, ImpDirection1 = bDir, ImpDirection2 = sDir, Force1 = bForce, Force2 = sforce, CollisionAvg = collisionAvg, }; var collisionEvent = Session.Instance.CollisionPool.Get(); collisionEvent.Init(collisionData, this); Session.Instance.ThreadEvents.Enqueue(collisionEvent); } else { var altMomentum = (bMass * bVelAtPoint); var altResultVelocity = altMomentum / (bMass + (bMass * 0.5f)); var bDir2 = (altResultVelocity - bVelAtPoint) * bMass; var transformInv = DetectMatrixOutsideInv; var normalMat = MatrixD.Transpose(transformInv); var localNormal = Vector3D.Transform(collisionAvg, transformInv); var surfaceNormal = Vector3D.Normalize(Vector3D.TransformNormal(localNormal, normalMat)); Vector3 velAtPoint; e1Physics.GetVelocityAtPointLocal(ref collisionAvg, out velAtPoint); var bSurfaceDir = -Vector3D.Dot(velAtPoint, surfaceNormal) * surfaceNormal; var collisionData = new MyCollisionPhysicsData { Entity1 = entity1, Mass1 = bMass, Com1 = bCom, CollisionCorrection1 = bCollisionCorrection, ImpDirection1 = bDir2, ImpDirection2 = bSurfaceDir, Force1 = bForce, CollisionAvg = collisionAvg }; var collisionEvent = Session.Instance.StaticCollisionPool.Get(); collisionEvent.Init(collisionData, this); Session.Instance.ThreadEvents.Enqueue(collisionEvent); } }