Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
            }
        }