public void OnWorldPosChanged(ref MatrixD newTransform)
        {

            MatrixD worldPos = newTransform;
            m_caster.OnWorldPositionChanged(ref worldPos);

            var entitiesInRange = this.m_caster.EntitiesInRange;
            float closestDistance = float.MaxValue;
            MyEntity closestEntity = null;

            if (!m_isPointOfRefSet)
                m_pointOfReference = worldPos.Translation;

            if (entitiesInRange != null && entitiesInRange.Count > 0)
            {
               // int i = 0;
                foreach (var entity in entitiesInRange.Values)
                {
                    float distanceSq = (float)Vector3D.DistanceSquared(entity.DetectionPoint, m_pointOfReference);

                    if (entity.Entity.Physics != null && entity.Entity.Physics.Enabled)
                    {
                        if (distanceSq < closestDistance)
                        {
                            closestEntity = entity.Entity;
                            this.m_distanceToHitSq = distanceSq;
                            this.m_hitPosition = entity.DetectionPoint;

                            closestDistance = distanceSq;
                        }
                    }
                 //   ++i;
                }
            }

            this.m_hitCubeGrid = closestEntity as MyCubeGrid;
            this.m_hitBlock = null;
            this.m_hitDestroaybleObj = closestEntity as IMyDestroyableObject;
            this.m_hitFloatingObject = closestEntity as MyFloatingObject;
            this.m_hitCharacter = closestEntity as MyCharacter;

            if (m_hitCubeGrid != null)
            {
                var invWorld = m_hitCubeGrid.PositionComp.WorldMatrixNormalizedInv;
                var gridLocalPos = Vector3D.Transform(this.m_hitPosition, invWorld);
                Vector3I blockPos;
                m_hitCubeGrid.FixTargetCube(out blockPos, gridLocalPos / m_hitCubeGrid.GridSize);
                m_hitBlock = m_hitCubeGrid.GetCubeBlock(blockPos);

            }

            
        }
        public MyFloatingObjectPhysicsStateGroup(MyFloatingObject entity, IMyReplicable owner)
            : base(entity, owner)
        {
            m_lowPrecisionOrientation = true;
            m_prioritySettings.AcceleratingPriority /= 2;
            m_prioritySettings.LinearMovingPriority /= 2;
            m_prioritySettings.StoppedPriority      /= 2;

            m_prioritySettings.AcceleratingUpdateCount *= 2;
            m_prioritySettings.LinearMovingUpdateCount *= 2;
            m_prioritySettings.StoppedUpdateCount      *= 2;
        }
示例#3
0
 private static bool ComputeFloatingObjectAmount(MyFloatingObject obj, ref MyFixedPoint amount, MyInventory inv)
 {
     amount = obj.Item.Amount;
     if (!MySession.Static.CreativeMode)
     {
         amount = MyFixedPoint.Min(amount, inv.ComputeAmountThatFits(obj.Item.Content.GetId()));
     }
     if (amount <= 0) // does not fit into inventory
     {
         return(false);
     }
     return(true);
 }
 static void RemoveFloating_Impelentation()
 {
     if (!MyEventContext.Current.IsLocallyInvoked && !MySession.Static.HasPlayerAdminRights(MyEventContext.Current.Sender.Value))
     {
         MyEventContext.ValidationFailed();
         return;
     }
     foreach (var entity in MyEntities.GetEntities())
     {
         MyFloatingObject floating = entity as MyFloatingObject;
         if (floating != null)
         {
             floating.SendCloseRequest();
         }
     }
 }
示例#5
0
 private void OnRemoveFloating(MyGuiControlButton obj)
 {
     foreach (var entity in MyEntities.GetEntities())
     {
         MyFloatingObject floating = entity as MyFloatingObject;
         if (floating != null)
         {
             if (Sync.IsServer)
             {
                 floating.Close();
             }
             else
             {
                 floating.SendCloseRequest();
             }
         }
     }
 }
示例#6
0
 public void TakeFloatingObject(MyFloatingObject obj)
 {
     MyFixedPoint amount = obj.Item.Amount;
     if (MyPerGameSettings.ConstrainInventory())
         amount = MyFixedPoint.Min(ComputeAmountThatFits(obj.Item.Content.GetObjectId()), amount);
     if (amount > 0)
     {
         if (Sync.IsServer)
         {
             if (obj.MarkedForClose)
                 return;
             MyFloatingObjects.RemoveFloatingObject(obj, amount);
             AddItemsInternal(amount, obj.Item.Content);
             SyncObject.SendAddItemsAnnounce(this, amount, obj.Item.Content);
         }
         else
             SyncObject.TakeFloatingObjectRequest(this, obj);
     }
 }
        //Do our actual removal.
        void Entities_OnEntityAdd(IMyEntity entity)
        {
            MyFloatingObject floaty = entity as MyFloatingObject;

            //Make sure its not null
            if (floaty?.Item != null)
            {
                //Also make sure its not null
                if (floaty.Item.Content?.SubtypeId != null)
                {
                    MyStringHash subtype = floaty.Item.Content.SubtypeId;
                    //Do a 2fast4u comparison
                    if (m_scraphash.Equals(subtype))
                    {
                        //Delete the entity
                        entity.Close();
                    }
                }
            }
        }
示例#8
0
        static void OnCreateFloatingObjectsCallback(ref FloatingObjectsCreateMsg msg, MyNetworkClient sender)
        {
            //MySandboxGame.Log.WriteLine("FloatingObjectsCreateMsg: " + msg.FloatingObjects.Count);

            foreach (var floatingObject in msg.FloatingObjects)
            {
                foreach (var instance in floatingObject.Instances)
                {
                    System.Diagnostics.Debug.Assert(instance.Amount > 0);

                    if (instance.Amount <= 0)
                    {
                        continue;
                    }

                    if (MyEntities.EntityExists(instance.Location.EntityId))
                    {
                        continue;
                    }

                    var objectBuilder = new MyObjectBuilder_FloatingObject();
                    objectBuilder.Item                   = new MyObjectBuilder_InventoryItem();
                    objectBuilder.Item.Amount            = instance.Amount;
                    objectBuilder.Item.Content           = MyObjectBuilderSerializer.CreateNewObject(((MyDefinitionId)floatingObject.TypeId).TypeId, ((MyDefinitionId)floatingObject.TypeId).SubtypeName);
                    objectBuilder.EntityId               = instance.Location.EntityId;
                    objectBuilder.PositionAndOrientation = new MyPositionAndOrientation(instance.Location.Position, instance.Location.Forward, instance.Location.Up);
                    objectBuilder.PersistentFlags        = MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.Enabled | MyPersistentEntityFlags2.CastShadows;

                    MyFloatingObject floatingObjectAdded = (MyFloatingObject)MyEntities.CreateFromObjectBuilderAndAdd(objectBuilder);
                    if (floatingObjectAdded.Physics != null)
                    {
                        floatingObjectAdded.Physics.LinearVelocity  = instance.Location.LinearVelocity;
                        floatingObjectAdded.Physics.AngularVelocity = instance.Location.AngularVelocity;
                    }
                }
            }
            if (Sync.IsServer)
            {
                Sync.Layer.SendMessageToAllButOne(ref msg, sender.SteamUserId);
            }
        }
        static void OnUpdateCompressedCallback(ref PositionUpdateCompressedMsg msg, MyNetworkClient sender)
        {
            MyEntity entity;

            if (MyEntities.TryGetEntityById(msg.EntityId, out entity))
            {
                MyFloatingObject floatingObject = entity as MyFloatingObject;
                if (floatingObject != null)
                {
                    MatrixD matrix = msg.GetWorldMatrix();
                    floatingObject.PositionComp.SetWorldMatrix(matrix, sender);
                    if (floatingObject.Physics != null)
                    {
                        Vector3 linearVelocity, angularVelocity;
                        msg.GetVelocities(out linearVelocity, out angularVelocity);
                        floatingObject.Physics.LinearVelocity  = linearVelocity;
                        floatingObject.Physics.AngularVelocity = angularVelocity;
                    }
                }
            }
        }
示例#10
0
        static void OnUpdateCallback(ref FloatingObjectPositionUpdateMsg msg, MyNetworkClient sender)
        {
            Debug.Assert(!Sync.IsServer);

            MyEntity entity;

            if (MyEntities.TryGetEntityById(msg.EntityId, out entity))
            {
                MyFloatingObject floatingObject = entity as MyFloatingObject;
                if (floatingObject != null)
                {
                    MatrixD  matrix      = MatrixD.CreateWorld(msg.Position, msg.Forward, msg.Up);
                    Vector3D translation = floatingObject.PositionComp.GetPosition();
                    //Quaternion rotation = Quaternion.CreateFromRotationMatrix(floatingObject.WorldMatrix.GetOrientation());
                    Quaternion rotation = Quaternion.Identity;
                    m_rigidBodyList.Clear();

                    Sandbox.Engine.Physics.MyPhysics.GetPenetrationsShape(floatingObject.Physics.RigidBody.GetShape(), ref translation, ref rotation, m_rigidBodyList, Sandbox.Engine.Physics.MyPhysics.NotCollideWithStaticLayer);

                    //if (m_rigidBodyList.Count == 0 || MyPerGameSettings.EnableFloatingObjectsActiveSync)
                    //{
                    //    floatingObject.PositionComp.SetWorldMatrix(matrix, sender);
                    //}

                    if (floatingObject.Physics != null)
                    {
                        if (m_rigidBodyList.Count == 1 && m_rigidBodyList[0].Body == floatingObject.Physics.RigidBody)
                        {
                            floatingObject.PositionComp.SetWorldMatrix(matrix, sender);
                        }

                        floatingObject.Physics.LinearVelocity  = msg.LinearVelocity;
                        floatingObject.Physics.AngularVelocity = msg.AngularVelocity;
                    }
                }
            }
        }
 private static void GetSurfaceAndMaterial(IMyEntity entity, out MySurfaceImpactEnum surfaceImpact, out MyStringHash materialType)
 {
     if (entity is MyVoxelMap)
     {
         materialType  = MyMaterialType.ROCK;
         surfaceImpact = MySurfaceImpactEnum.DESTRUCTIBLE;
     }
     else if (entity is MyCharacter)
     {
         surfaceImpact = MySurfaceImpactEnum.CHARACTER;
         materialType  = MyMaterialType.CHARACTER;
     }
     else if (entity is MyFloatingObject)
     {
         MyFloatingObject obj = entity as MyFloatingObject;
         materialType  = (obj.VoxelMaterial != null) ? MyMaterialType.ROCK : MyMaterialType.METAL;
         surfaceImpact = MySurfaceImpactEnum.METAL;
     }
     else
     {
         surfaceImpact = MySurfaceImpactEnum.METAL;
         materialType  = MyMaterialType.METAL;
     }
 }
示例#12
0
        public static void UpdatePosition(MyFloatingObject floatingObject, bool toAll = true, MyNetworkClient receiver = null)
        {
            var m = floatingObject.WorldMatrix;

            FloatingObjectPositionUpdateMsg msg = new FloatingObjectPositionUpdateMsg();

            msg.EntityId = floatingObject.EntityId;
            msg.Forward  = m.Forward;
            msg.Up       = m.Up;
            msg.Position = m.Translation;
            if (floatingObject.Physics != null)
            {
                msg.LinearVelocity  = floatingObject.Physics.LinearVelocity;
                msg.AngularVelocity = floatingObject.Physics.AngularVelocity;
            }

            //PositionUpdateCompressedMsg msg = new PositionUpdateCompressedMsg();
            //msg.EntityId = floatingObject.EntityId;
            //msg.SetWorldMatrix(m);
            //if (floatingObject.Physics != null)
            //{
            //    if (floatingObject.Physics.RigidBody.IsActive)
            //    {
            //        if (floatingObject.Physics.LinearVelocity.Length() > 0.1f || floatingObject.Physics.AngularVelocity.Length() > 0.1f)
            //          msg.SetVelocities(floatingObject.Physics.LinearVelocity, floatingObject.Physics.AngularVelocity);
            //    }
            //}
            if (toAll | receiver == null)
            {
                MySession.Static.SyncLayer.SendMessageToAll(ref msg);
            }
            else
            {
                MySession.Static.SyncLayer.SendMessage(ref msg, receiver.SteamUserId);
            }
        }
        private bool FindFreeCargo(IMyEntity target, MyCubeBlock startBlock, bool transfer)
        {
            var list = Conveyor.GetConveyorListFromEntity(m_constructionBlock.ConstructionBlock);

            if (list == null)
            {
                return(false);
            }

            List <MyInventory> inventoryList = new List <MyInventory>();

            foreach (var item in list)
            {
                IMyEntity entity;
                if (MyAPIGateway.Entities.TryGetEntityById(item, out entity))
                {
                    if (!(entity is IMyCubeBlock))
                    {
                        continue;
                    }

                    if (entity is Ingame.IMyRefinery || entity is Ingame.IMyAssembler)
                    {
                        continue;
                    }

                    MyCubeBlock block = (MyCubeBlock)entity;
                    if (!block.HasInventory)
                    {
                        continue;
                    }

                    inventoryList.Add(block.GetInventory());
                }
            }

            MyFloatingObject floating        = (MyFloatingObject)target;
            float            amount          = 0f;
            MyInventory      targetInventory = null;

            foreach (var item in inventoryList.OrderByDescending(x => (float)x.MaxVolume - (float)x.CurrentVolume))
            {
                amount = GetNaniteInventoryAmountThatFits(target, (MyCubeBlock)item.Owner);
                if ((int)amount == 0)
                {
                    continue;
                }

                targetInventory = item;
                break;
            }

            if ((int)amount == 0)
            {
                return(false);
            }

            var def = MyDefinitionManager.Static.GetPhysicalItemDefinition(new VRage.Game.MyDefinitionId(floating.Item.Content.TypeId, floating.Item.Content.SubtypeId));

            if ((int)amount > 1 && (amount / def.Volume) > m_carryVolume)
            {
                amount = m_carryVolume / def.Volume;
            }

            if ((int)amount < 1)
            {
                amount = 1f;
            }

            if (transfer)
            {
                targetInventory.PickupItem(floating, (int)amount);
            }

            return(true);
        }
示例#14
0
        public override void UpdateAfterSimulation()
        {
            base.UpdateAfterSimulation();

            //MyRenderProxy.DebugDrawSphere(m_gunBase.PositionMuzzleWorld, 0.2f, new Vector3(1, 0, 0), 1.0f, true);

            m_targetGrid           = null;
            m_targetDestroyable    = null;
            m_targetFloatingObject = null;
            m_targetCharacter      = null;

            if (Owner == null)
            {
                return;
            }

            var   entitiesInRange    = m_sensor.EntitiesInRange;
            int   closestEntityIndex = 0;
            float closestDistance    = float.MaxValue;

            if (entitiesInRange != null && entitiesInRange.Count > 0)
            {
                int i = 0;
                foreach (var entity in entitiesInRange.Values)
                {
                    var targetGrid = entity.Entity as MyCubeGrid;
                    var distanceSq = (float)Vector3D.DistanceSquared(entity.DetectionPoint, m_gunBase.GetMuzzleWorldPosition());
                    if (entity.Entity.Physics != null && entity.Entity.Physics.Enabled)
                    {
                        if (distanceSq < closestDistance)
                        {
                            m_targetGrid           = targetGrid;
                            m_targetDistanceSq     = (float)distanceSq;
                            m_targetDestroyable    = entity.Entity as IMyDestroyableObject;
                            m_targetFloatingObject = entity.Entity as MyFloatingObject;
                            m_targetCharacter      = entity.Entity as MyCharacter;
                            closestDistance        = m_targetDistanceSq;
                            closestEntityIndex     = i;
                        }
                    }
                    ++i;
                }
            }

            if (m_targetGrid != null)
            {
                m_targetPosition = entitiesInRange.Values.ElementAt(closestEntityIndex).DetectionPoint;
                var invWorld     = m_targetGrid.PositionComp.GetWorldMatrixNormalizedInv();
                var gridLocalPos = Vector3D.Transform(m_targetPosition, invWorld);
                var gridSpacePos = Vector3I.Round(gridLocalPos / m_targetGrid.GridSize);
                m_targetGrid.FixTargetCube(out m_targetCube, gridLocalPos / m_targetGrid.GridSize);

                var head        = PositionComp.WorldMatrix;
                var aimToMuzzle = Vector3D.Normalize(m_targetPosition - m_gunBase.GetMuzzleWorldPosition());
                if (Vector3.Dot(aimToMuzzle, head.Forward) > 0)
                {
                    m_targetDistanceSq = 0;
                }
                else
                {
                    m_targetDistanceSq = (float)Vector3D.DistanceSquared(m_targetPosition, m_gunBase.GetMuzzleWorldPosition());
                }
            }
            PowerReceiver.Update();

            if (IsShooting && !PowerReceiver.IsPowered)
            {
                EndShoot(MyShootActionEnum.PrimaryAction);
            }

            UpdateEffect();
            CheckEffectType();

            //MyTrace.Watch("MyEngineerToolBase.RequiredPowerInput", RequiredPowerInput);
        }
示例#15
0
        private static void GetSurfaceAndMaterial(IMyEntity entity, ref Vector3D hitPosition, out MySurfaceImpactEnum surfaceImpact, out MyStringHash materialType)
        {
            var voxelBase = entity as MyVoxelBase;

            if (voxelBase != null)
            {
                materialType  = MyMaterialType.ROCK;
                surfaceImpact = MySurfaceImpactEnum.DESTRUCTIBLE;

                var voxelDefinition = voxelBase.GetMaterialAt(ref hitPosition);
                if (voxelDefinition != null)
                {
                    materialType = MyStringHash.GetOrCompute(voxelDefinition.MaterialTypeName);
                }
            }
            else if (entity is MyCharacter)
            {
                surfaceImpact = MySurfaceImpactEnum.CHARACTER;
                materialType  = MyMaterialType.CHARACTER;
                if ((entity as MyCharacter).Definition.PhysicalMaterial != null)
                {
                    materialType = MyStringHash.GetOrCompute((entity as MyCharacter).Definition.PhysicalMaterial);
                }
            }
            else if (entity is MyFloatingObject)
            {
                MyFloatingObject obj = entity as MyFloatingObject;
                materialType  = (obj.VoxelMaterial != null) ? MyMaterialType.ROCK : MyMaterialType.METAL;
                surfaceImpact = MySurfaceImpactEnum.METAL;
            }
            else if (entity is MyTrees)
            {
                surfaceImpact = MySurfaceImpactEnum.DESTRUCTIBLE;
                materialType  = MyMaterialType.WOOD;
            }
            else
            {
                surfaceImpact = MySurfaceImpactEnum.METAL;
                materialType  = MyMaterialType.METAL;
                if (entity is MyCubeGrid)
                {
                    Vector3I blockPos;
                    var      grid = (entity as MyCubeGrid);
                    if (grid != null)
                    {
                        grid.FixTargetCube(out blockPos, Vector3D.Transform(hitPosition, grid.PositionComp.WorldMatrixNormalizedInv) / grid.GridSize);
                        var block = grid.GetCubeBlock(blockPos);
                        if (block != null)
                        {
                            if (block.BlockDefinition.PhysicalMaterial != null)
                            {
                                materialType = MyStringHash.GetOrCompute(block.BlockDefinition.PhysicalMaterial.Id.SubtypeName);
                            }
                        }
                    }
                }
                if (materialType.GetHashCode() == 0)
                {
                    materialType = MyMaterialType.METAL;
                }
            }
        }
示例#16
0
        public bool Drill(bool collectOre = true, bool performCutout = true, bool assignDamagedMaterial = false)
        {
            ProfilerShort.Begin("MyDrillBase::Drill()");

            bool drillingSuccess = false;

            MySoundPair sound = null;

            if ((m_drillEntity.Parent != null) && (m_drillEntity.Parent.Physics != null) && !m_drillEntity.Parent.Physics.Enabled)
            {
                return(false);
            }

            if (performCutout)
            {
                StopSparkParticles();
                StopDustParticles();
                var          entitiesInRange = m_sensor.EntitiesInRange;
                MyStringHash targetMaterial  = MyStringHash.NullOrEmpty;
                bool         targetIsBlock   = false;
                foreach (var entry in entitiesInRange)
                {
                    drillingSuccess = false;
                    var entity = entry.Value.Entity;
                    if (entity.MarkedForClose)
                    {
                        continue;
                    }
                    if (entity is MyCubeGrid)
                    {
                        var grid = entity as MyCubeGrid;
                        if (grid.Physics != null && grid.Physics.Enabled)
                        {
                            drillingSuccess = TryDrillBlocks(grid, entry.Value.DetectionPoint, !Sync.IsServer, out targetMaterial);
                            targetIsBlock   = true;
                        }
                        if (drillingSuccess)
                        {
                            m_initialHeatup = false;
                            CreateParticles(entry.Value.DetectionPoint, false, true, false);
                        }
                    }
                    else if (entity is MyVoxelBase)
                    {
                        ProfilerShort.Begin("Drill voxel map");
                        var voxels = entity as MyVoxelBase;
                        drillingSuccess = TryDrillVoxels(voxels, entry.Value.DetectionPoint, collectOre, !Sync.IsServer, assignDamagedMaterial);
                        ProfilerShort.BeginNextBlock("Create particles");
                        if (drillingSuccess)
                        {
                            Vector3D drillHitPoint = entry.Value.DetectionPoint;
                            if (targetMaterial == MyStringHash.NullOrEmpty)
                            {
                                var voxelMaterial = voxels.GetMaterialAt(ref drillHitPoint);
                                if (voxelMaterial != null)
                                {
                                    targetMaterial = MyStringHash.GetOrCompute(voxelMaterial.MaterialTypeName);
                                }
                            }
                            CreateParticles(entry.Value.DetectionPoint, true, false, true);
                        }
                        ProfilerShort.End();
                    }
                    else if (entity is MyFloatingObject)
                    {
                        var sphere = (BoundingSphereD)m_cutOut.Sphere;
                        sphere.Radius *= 1.33f;
                        if (entity.GetIntersectionWithSphere(ref sphere))
                        {
                            MyFloatingObject flObj = entity as MyFloatingObject;
                            if (Sync.IsServer)
                            {
                                if (flObj.Item.Content.TypeId == typeof(MyObjectBuilder_Ore))
                                {
                                    var invOwn = (m_drillEntity != null && m_drillEntity.HasInventory) ? m_drillEntity : null;
                                    if (invOwn == null)
                                    {
                                        invOwn = (m_drillEntity as MyHandDrill).Owner;
                                    }

                                    System.Diagnostics.Debug.Assert((invOwn.GetInventory(0) as MyInventory) != null, "Null or unexpected inventory type!");
                                    (invOwn.GetInventory(0) as MyInventory).TakeFloatingObject(flObj);
                                }
                                else
                                {
                                    (entity as MyFloatingObject).DoDamage(70, MyDamageType.Drill, true, attackerId: m_drillEntity != null ? m_drillEntity.EntityId : 0);
                                }
                            }
                            drillingSuccess = true;
                        }
                    }
                    else if (entity is MyCharacter)
                    {
                        var sphere = (BoundingSphereD)m_cutOut.Sphere;
                        sphere.Radius *= 0.8f;
                        var character = entity as MyCharacter;
                        if (targetMaterial == MyStringHash.NullOrEmpty)
                        {
                            targetMaterial = MyStringHash.GetOrCompute((entity as MyCharacter).Definition.PhysicalMaterial);
                        }
                        if (entity.GetIntersectionWithSphere(ref sphere))
                        {
                            //MyRenderProxy.DebugDrawSphere(sphere.Center, sphere.Radius, Color.Green.ToVector3(), 1, true);

                            //damage tracking
                            if ((m_drillEntity is MyHandDrill) && (m_drillEntity as MyHandDrill).Owner == MySession.Static.LocalCharacter && character != MySession.Static.LocalCharacter && character.IsDead == false)
                            {
                                MySession.Static.TotalDamageDealt += 20;
                            }

                            if (Sync.IsServer)
                            {
                                character.DoDamage(20, MyDamageType.Drill, true, attackerId: m_drillEntity != null ? m_drillEntity.EntityId : 0);
                            }
                            drillingSuccess = true;
                        }
                        else
                        {
                            BoundingSphereD headSphere = new BoundingSphereD(character.PositionComp.WorldMatrix.Translation + character.WorldMatrix.Up * 1.25f, 0.6f);
                            //MyRenderProxy.DebugDrawSphere(headSphere.Center, headSphere.Radius, Color.Red.ToVector3(), 1, false);
                            if (headSphere.Intersects(sphere))
                            {
                                //MyRenderProxy.DebugDrawSphere(sphere.Center, sphere.Radius, Color.Green.ToVector3(), 1, true);

                                //damage tracking
                                if ((m_drillEntity is MyHandDrill) && (m_drillEntity as MyHandDrill).Owner == MySession.Static.LocalCharacter && character != MySession.Static.LocalCharacter && character.IsDead == false)
                                {
                                    MySession.Static.TotalDamageDealt += 20;
                                }

                                if (Sync.IsServer)
                                {
                                    character.DoDamage(20, MyDamageType.Drill, true, attackerId: m_drillEntity != null ? m_drillEntity.EntityId : 0);
                                }
                                drillingSuccess = true;
                            }
                        }
                    }
                    if (drillingSuccess)
                    {
                        m_lastContactTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;
                    }
                }
                if (targetMaterial != null && targetMaterial != MyStringHash.NullOrEmpty)
                {
                    sound = MyMaterialPropertiesHelper.Static.GetCollisionCue(MyMaterialPropertiesHelper.CollisionType.Start, m_drillMaterial, targetMaterial);
                    if (sound == null || sound == MySoundPair.Empty)//target material was not set in definition - using metal/rock sound
                    {
                        if (targetIsBlock)
                        {
                            targetMaterial = m_metalMaterial;
                        }
                        else
                        {
                            targetMaterial = m_rockMaterial;
                        }
                    }
                    sound = MyMaterialPropertiesHelper.Static.GetCollisionCue(MyMaterialPropertiesHelper.CollisionType.Start, m_drillMaterial, targetMaterial);
                }
            }

            if (sound != null && sound != MySoundPair.Empty)
            {
                StartLoopSound(sound);
            }
            else
            {
                StartIdleSound(m_idleSoundLoop);
            }

            if (!IsDrilling)
            {
                IsDrilling = true;
                m_animationLastUpdateTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;
            }

            ProfilerShort.End();
            return(drillingSuccess);
        }
示例#17
0
 public override void OnAddedToContainer()
 {
     base.OnAddedToContainer();
     m_floatingObject = Container.Entity as MyFloatingObject;
 }
示例#18
0
        private static void GetSurfaceAndMaterial(IMyEntity entity, ref Vector3D hitPosition, out MySurfaceImpactEnum surfaceImpact, out MyStringHash materialType)
        {
            var voxelBase = entity as MyVoxelBase;

            if (voxelBase != null)
            {
                materialType  = MyMaterialType.ROCK;
                surfaceImpact = MySurfaceImpactEnum.DESTRUCTIBLE;

                var voxelDefinition = voxelBase.GetMaterialAt(ref hitPosition);
                if (voxelDefinition != null)
                {
                    materialType = MyStringHash.GetOrCompute(voxelDefinition.MaterialTypeName);
                }
            }
            else if (entity is MyCharacter)
            {
                surfaceImpact = MySurfaceImpactEnum.CHARACTER;
                materialType  = MyMaterialType.CHARACTER;
                if ((entity as MyCharacter).Definition.PhysicalMaterial != null)
                {
                    materialType = MyStringHash.GetOrCompute((entity as MyCharacter).Definition.PhysicalMaterial);
                }
            }
            else if (entity is MyFloatingObject)
            {
                MyFloatingObject obj = entity as MyFloatingObject;
                materialType  = (obj.VoxelMaterial != null) ? MyMaterialType.ROCK : (obj.ItemDefinition != null && obj.ItemDefinition.PhysicalMaterial != MyStringHash.NullOrEmpty ? obj.ItemDefinition.PhysicalMaterial : MyMaterialType.METAL);
                surfaceImpact = MySurfaceImpactEnum.METAL;
            }
            else if (entity is MyTrees)
            {
                surfaceImpact = MySurfaceImpactEnum.DESTRUCTIBLE;
                materialType  = MyMaterialType.WOOD;
            }
            else if (entity is IMyHandheldGunObject <MyGunBase> )
            {
                surfaceImpact = MySurfaceImpactEnum.METAL;
                materialType  = MyMaterialType.METAL;
                var mat = (entity as IMyHandheldGunObject <MyGunBase>).GunBase;
                if (mat != null && mat.WeaponProperties != null && mat.WeaponProperties.WeaponDefinition != null)
                {
                    materialType = mat.WeaponProperties.WeaponDefinition.PhysicalMaterial;
                }
            }
            else
            {
                surfaceImpact = MySurfaceImpactEnum.METAL;
                materialType  = MyMaterialType.METAL;
                if (entity is MyCubeGrid)
                {
                    var grid = (entity as MyCubeGrid);
                    if (grid != null)
                    {
                        var block = grid.GetTargetedBlock(hitPosition);
                        if (block != null)
                        {
                            if (block.BlockDefinition.PhysicalMaterial != null)
                            {
                                materialType = MyStringHash.GetOrCompute(block.BlockDefinition.PhysicalMaterial.Id.SubtypeName);
                            }
                        }
                    }
                }
            }
            if (materialType.GetHashCode() == 0)
            {
                materialType = MyMaterialType.METAL;
            }
        }
示例#19
0
 public FloatingObjectViewModel(MyFloatingObject floating, EntityTreeViewModel tree) : base(floating, tree)
 {
 }
示例#20
0
        public bool Drill(bool collectOre = true, bool performCutout = true)
        {
            ProfilerShort.Begin("MyDrillBase::Drill()");

            bool drillingSuccess = false;

            MySoundPair sound = null;

            if ((m_drillEntity.Parent != null) && (m_drillEntity.Parent.Physics != null) && !m_drillEntity.Parent.Physics.Enabled)
            {
                return(false);
            }

            if (performCutout)
            {
                var entitiesInRange = m_sensor.EntitiesInRange;
                foreach (var entry in entitiesInRange)
                {
                    drillingSuccess = false;
                    var entity = entry.Value.Entity;
                    if (entity.MarkedForClose)
                    {
                        continue;
                    }
                    if (entity is MyCubeGrid)
                    {
                        var grid = entity as MyCubeGrid;
                        if (grid.Physics != null && grid.Physics.Enabled)
                        {
                            drillingSuccess = TryDrillBlocks(grid, entry.Value.DetectionPoint, !Sync.IsServer);
                        }
                        if (drillingSuccess)
                        {
                            m_initialHeatup = false;
                            sound           = m_sounds.MetalLoop;
                            CreateParticles(entry.Value.DetectionPoint, false, true, false);
                        }
                    }
                    else if (entity is MyVoxelBase)
                    {
                        ProfilerShort.Begin("Drill voxel map");
                        var voxels = entity as MyVoxelBase;
                        drillingSuccess = TryDrillVoxels(voxels, entry.Value.DetectionPoint, collectOre, !Sync.IsServer);
                        ProfilerShort.BeginNextBlock("Create particles");
                        if (drillingSuccess)
                        {
                            sound = m_sounds.RockLoop;
                            CreateParticles(entry.Value.DetectionPoint, true, false, true);
                        }
                        ProfilerShort.End();
                    }
                    else if (entity is MyFloatingObject)
                    {
                        var sphere = (BoundingSphereD)m_cutOut.Sphere;
                        sphere.Radius *= 1.33f;
                        if (entity.GetIntersectionWithSphere(ref sphere))
                        {
                            MyFloatingObject flObj = entity as MyFloatingObject;
                            if (Sync.IsServer)
                            {
                                if (flObj.Item.Content.TypeId == typeof(MyObjectBuilder_Ore))
                                {
                                    IMyInventoryOwner invOwn = m_drillEntity as IMyInventoryOwner;
                                    if (invOwn == null)
                                    {
                                        invOwn = (m_drillEntity as MyHandDrill).Owner as IMyInventoryOwner;
                                    }
                                    invOwn.GetInventory(0).TakeFloatingObject(flObj);
                                }
                                else
                                {
                                    (entity as MyFloatingObject).DoDamage(70, MyDamageType.Drill, true, attackerId: m_drillEntity != null ? m_drillEntity.EntityId : 0);
                                }
                            }
                            drillingSuccess = true;
                        }
                    }
                    else if (entity is MyCharacter)
                    {
                        var sphere = (BoundingSphereD)m_cutOut.Sphere;
                        sphere.Radius *= (4 / 5f);
                        var character = entity as MyCharacter;
                        if (entity.GetIntersectionWithSphere(ref sphere))
                        {
                            //MyRenderProxy.DebugDrawSphere(sphere.Center, sphere.Radius, Color.Green.ToVector3(), 1, true);
                            if (Sync.IsServer)
                            {
                                character.DoDamage(20, MyDamageType.Drill, true, attackerId: m_drillEntity != null ? m_drillEntity.EntityId : 0);
                            }
                            drillingSuccess = true;
                        }
                        else
                        {
                            BoundingSphereD headSphere = new BoundingSphereD(character.PositionComp.WorldMatrix.Translation + character.WorldMatrix.Up * 1.25f, 0.6f);
                            //MyRenderProxy.DebugDrawSphere(headSphere.Center, headSphere.Radius, Color.Red.ToVector3(), 1, false);
                            if (headSphere.Intersects(sphere))
                            {
                                //MyRenderProxy.DebugDrawSphere(sphere.Center, sphere.Radius, Color.Green.ToVector3(), 1, true);
                                if (Sync.IsServer)
                                {
                                    character.DoDamage(20, MyDamageType.Drill, true, attackerId: m_drillEntity != null ? m_drillEntity.EntityId : 0);
                                }
                                drillingSuccess = true;
                            }
                        }
                    }
                    if (drillingSuccess)
                    {
                        m_lastContactTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;
                    }
                }
            }

            if (sound != null)
            {
                StartLoopSound(sound);
            }
            else
            {
                StartIdleSound(m_sounds.IdleLoop);
            }

            IsDrilling = true;

            m_animationLastUpdateTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;
            ProfilerShort.End();
            return(drillingSuccess);
        }
示例#21
0
        public string SendHttpResponseResponse(HttpListenerRequest request)
        {
            StringBuilder sb     = new StringBuilder();
            JsonWriter    writer = new JsonWriter(sb);

            switch (request.Url.AbsolutePath)
            {
            //case "/gc/collect/0":
            //    GC.Collect(0);
            //    break;
            //case "/gc/collect/1":
            //    GC.Collect(1);
            //    break;
            //case "/gc/collect/2":
            //    GC.Collect(2);
            //    break;
            case "/metrics/v1/server":
                int    usedPCU            = 0;
                int    maxPlayers         = 0;
                int    maxFactionCount    = 0;
                int    maxFloatingObjects = 0;
                int    maxGridSize        = 0;
                int    maxBlocksPerPlayer = 0;
                string blockLimit         = "";
                int    totalPCU           = 0;
                int    modCount           = 0;
                if (MySession.Static != null)
                {
                    if (MySession.Static.GlobalBlockLimits != null)
                    {
                        usedPCU = MySession.Static.GlobalBlockLimits.PCUBuilt;
                    }
                    maxPlayers         = MySession.Static.MaxPlayers;
                    maxFactionCount    = MySession.Static.MaxFactionsCount;
                    maxFloatingObjects = MySession.Static.MaxFloatingObjects;
                    maxGridSize        = MySession.Static.MaxGridSize;
                    maxBlocksPerPlayer = MySession.Static.MaxBlocksPerPlayer;
                    totalPCU           = MySession.Static.TotalPCU;
                    modCount           = MySession.Static.Mods.Count;
                    switch (MySession.Static.BlockLimitsEnabled)
                    {
                    case MyBlockLimitsEnabledEnum.GLOBALLY:
                        blockLimit = "globally";
                        break;

                    case MyBlockLimitsEnabledEnum.NONE:
                        blockLimit = "none";
                        break;

                    case MyBlockLimitsEnabledEnum.PER_FACTION:
                        blockLimit = "faction";
                        break;

                    case MyBlockLimitsEnabledEnum.PER_PLAYER:
                        blockLimit = "player";
                        break;
                    }
                }
                writer.WriteObjectStart();
                writer.WritePropertyName("Version");
                writer.Write(MyFinalBuildConstants.APP_VERSION_STRING_DOTS.ToString());
                writer.WritePropertyName("ServerName");
                writer.Write(MySandboxGame.ConfigDedicated.ServerName);
                writer.WritePropertyName("WorldName");
                writer.Write(MySandboxGame.ConfigDedicated.WorldName);
                writer.WritePropertyName("IsReady");
                writer.Write(MySession.Static != null && MySession.Static.Ready);
                writer.WritePropertyName("SimSpeed");
                writer.Write(Sync.ServerSimulationRatio);
                writer.WritePropertyName("SimulationCpuLoad");
                writer.Write((float)(int)Sync.ServerCPULoad);
                writer.WritePropertyName("TotalTime");
                writer.Write(MySandboxGame.TotalTimeInMilliseconds / 1000);
                writer.WritePropertyName("Players");
                writer.Write((Sync.Clients != null) ? (Sync.Clients.Count - 1) : 0);
                writer.WritePropertyName("UsedPCU");
                writer.Write(usedPCU);
                writer.WritePropertyName("MaxPlayers");
                writer.Write(maxPlayers);
                writer.WritePropertyName("MaxFactionsCount");
                writer.Write(maxFactionCount);
                writer.WritePropertyName("MaxFloatingObjects");
                writer.Write(maxFloatingObjects);
                writer.WritePropertyName("MaxGridSize");
                writer.Write(maxGridSize);
                writer.WritePropertyName("MaxBlocksPerPlayer");
                writer.Write(maxBlocksPerPlayer);
                writer.WritePropertyName("BlockLimitsEnabled");
                writer.Write(blockLimit);
                writer.WritePropertyName("TotalPCU");
                writer.Write(totalPCU);
                writer.WritePropertyName("ModCount");
                writer.Write(modCount);
                writer.WritePropertyName("SaveDuration");
                writer.Write(saveDuration);
                writer.WriteObjectEnd();
                break;

            case "/metrics/v1/load":
                writer.WriteArrayStart();
                LoadEvent loadEv;
                while (!loadEvents.Empty)
                {
                    if (loadEvents.TryDequeueBack(out loadEv))
                    {
                        writer.WriteObjectStart();
                        writer.WritePropertyName("ServerCPULoad");
                        writer.Write(loadEv.ServerCPULoad);
                        writer.WritePropertyName("ServerCPULoadSmooth");
                        writer.Write(loadEv.ServerCPULoadSmooth);
                        writer.WritePropertyName("ServerSimulationRatio");
                        writer.Write(loadEv.ServerSimulationRatio);
                        writer.WritePropertyName("ServerThreadLoad");
                        writer.Write(loadEv.ServerThreadLoad);
                        writer.WritePropertyName("ServerThreadLoadSmooth");
                        writer.Write(loadEv.ServerThreadLoadSmooth);
                        writer.WritePropertyName("MillisecondsInThePast");
                        writer.Write((DateTime.Now - loadEv.Occurred).TotalMilliseconds);
                        writer.WriteObjectEnd();
                    }
                }
                writer.WriteArrayEnd();
                break;

            case "/metrics/v1/process":
                System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
                writer.WriteObjectStart();
                writer.WritePropertyName("PrivateMemorySize64");
                writer.Write(currentProcess.PrivateMemorySize64);
                writer.WritePropertyName("VirtualMemorySize64");
                writer.Write(currentProcess.VirtualMemorySize64);
                writer.WritePropertyName("WorkingSet64");
                writer.Write(currentProcess.WorkingSet64);
                writer.WritePropertyName("NonpagedSystemMemorySize64");
                writer.Write(currentProcess.NonpagedSystemMemorySize64);
                writer.WritePropertyName("PagedMemorySize64");
                writer.Write(currentProcess.PagedMemorySize64);
                writer.WritePropertyName("PagedSystemMemorySize64");
                writer.Write(currentProcess.PagedSystemMemorySize64);
                writer.WritePropertyName("PeakPagedMemorySize64");
                writer.Write(currentProcess.PeakPagedMemorySize64);
                writer.WritePropertyName("PeakVirtualMemorySize64");
                writer.Write(currentProcess.PeakVirtualMemorySize64);
                writer.WritePropertyName("PeakWorkingSet64");
                writer.Write(currentProcess.PeakWorkingSet64);
                writer.WritePropertyName("GCLatencyMode");
                writer.Write((int)System.Runtime.GCSettings.LatencyMode);
                writer.WritePropertyName("GCIsServerGC");
                writer.Write(System.Runtime.GCSettings.IsServerGC);
                writer.WritePropertyName("GCTotalMemory");
                writer.Write(GC.GetTotalMemory(false));
                writer.WritePropertyName("GCMaxGeneration");
                writer.Write(GC.MaxGeneration);
                writer.WritePropertyName("GCCollectionCount0");
                writer.Write(GC.CollectionCount(0));
                writer.WritePropertyName("GCCollectionCount1");
                writer.Write(GC.CollectionCount(1));
                writer.WritePropertyName("GCCollectionCount2");
                writer.Write(GC.CollectionCount(2));
                writer.WriteObjectEnd();
                break;

            case "/metrics/v1/events":
                writer.WriteArrayStart();
                Event ev;
                while (!events.Empty)
                {
                    if (events.TryDequeueBack(out ev))
                    {
                        writer.WriteObjectStart();
                        writer.WritePropertyName("Type");
                        writer.Write(ev.Type);
                        writer.WritePropertyName("Text");
                        writer.Write(ev.Text);
                        writer.WritePropertyName("Tags");
                        writer.WriteArrayStart();
                        foreach (var tag in ev.Tags)
                        {
                            writer.Write(tag);
                        }
                        writer.WriteArrayEnd();
                        writer.WritePropertyName("SecondsInThePast");
                        writer.Write((DateTime.Now - ev.Occurred).TotalSeconds);
                        writer.WriteObjectEnd();
                    }
                }
                writer.WriteArrayEnd();
                break;

            case "/metrics/v1/players":
                writer.WriteArrayStart();
                PlayerEvent playerEv;
                while (!playerEvents.Empty)
                {
                    if (playerEvents.TryDequeueBack(out playerEv))
                    {
                        writer.WriteObjectStart();
                        writer.WritePropertyName("Type");
                        writer.Write(playerEv.Type);
                        writer.WritePropertyName("SteamId");
                        writer.Write(playerEv.SteamId);
                        writer.WritePropertyName("MillisecondsInThePast");
                        writer.Write((DateTime.Now - playerEv.Occurred).TotalMilliseconds);
                        writer.WriteObjectEnd();
                    }
                }
                writer.WriteArrayEnd();
                break;

            case "/metrics/v1/session/grids":
                writer.WriteArrayStart();
                if (MySession.Static != null && MySession.Static.Ready)
                {
                    ICollection <MyPlayer>         onlinePlayers = MySession.Static.Players.GetOnlinePlayers();
                    MyConcurrentHashSet <MyEntity> entities      = MyEntities.GetEntities();

                    Type      type  = typeof(MyEntities);
                    FieldInfo info  = type.GetField("m_entitiesForUpdateOnce", BindingFlags.NonPublic | BindingFlags.Static);
                    object    value = info.GetValue(null);
                    CachingList <MyEntity> m_entitiesForUpdateOnce = value as CachingList <MyEntity>;
                    List <long>            x_entitiesForUpdateOnce = new List <long>();

                    info  = type.GetField("m_entitiesForUpdate", BindingFlags.NonPublic | BindingFlags.Static);
                    value = info.GetValue(null);
                    MyDistributedUpdater <ConcurrentCachingList <MyEntity>, MyEntity> m_entitiesForUpdate = value as MyDistributedUpdater <ConcurrentCachingList <MyEntity>, MyEntity>;
                    List <long> x_entitiesForUpdate = new List <long>();

                    info  = type.GetField("m_entitiesForUpdate10", BindingFlags.NonPublic | BindingFlags.Static);
                    value = info.GetValue(null);
                    MyDistributedUpdater <CachingList <MyEntity>, MyEntity> m_entitiesForUpdate10 = value as MyDistributedUpdater <CachingList <MyEntity>, MyEntity>;
                    List <long> x_entitiesForUpdate10 = new List <long>();

                    info  = type.GetField("m_entitiesForUpdate100", BindingFlags.NonPublic | BindingFlags.Static);
                    value = info.GetValue(null);
                    MyDistributedUpdater <CachingList <MyEntity>, MyEntity> m_entitiesForUpdate100 = value as MyDistributedUpdater <CachingList <MyEntity>, MyEntity>;
                    List <long> x_entitiesForUpdate100 = new List <long>();

                    info  = type.GetField("m_entitiesForSimulate", BindingFlags.NonPublic | BindingFlags.Static);
                    value = info.GetValue(null);
                    MyDistributedUpdater <CachingList <MyEntity>, MyEntity> m_entitiesForSimulate = value as MyDistributedUpdater <CachingList <MyEntity>, MyEntity>;
                    List <long> x_entitiesForSimulate = new List <long>();

                    Torch.InvokeBlocking(() =>
                    {
                        x_entitiesForUpdateOnce = m_entitiesForUpdateOnce.Select((x) => x.EntityId).ToList();
                        x_entitiesForUpdate     = m_entitiesForUpdate.List.Select((x) => x.EntityId).ToList();
                        x_entitiesForUpdate10   = m_entitiesForUpdate10.List.Select((x) => x.EntityId).ToList();
                        x_entitiesForUpdate100  = m_entitiesForUpdate100.List.Select((x) => x.EntityId).ToList();
                        x_entitiesForSimulate   = m_entitiesForSimulate.List.Select((x) => x.EntityId).ToList();
                    });

                    bool IsConcealed(MyCubeGrid grid)
                    {
                        int NeedsUpdateMatches = 0;
                        int RegistedMatches    = 0;

                        if ((grid.NeedsUpdate & MyEntityUpdateEnum.BEFORE_NEXT_FRAME) > MyEntityUpdateEnum.NONE)
                        {
                            NeedsUpdateMatches++;
                            if (x_entitiesForUpdateOnce.Any((x) => x == grid.EntityId))
                            {
                                RegistedMatches++;
                            }
                        }
                        if ((grid.NeedsUpdate & MyEntityUpdateEnum.EACH_FRAME) > MyEntityUpdateEnum.NONE)
                        {
                            NeedsUpdateMatches++;
                            if (x_entitiesForUpdate.Any((x) => x == grid.EntityId))
                            {
                                RegistedMatches++;
                            }
                        }
                        if ((grid.NeedsUpdate & MyEntityUpdateEnum.EACH_10TH_FRAME) > MyEntityUpdateEnum.NONE)
                        {
                            NeedsUpdateMatches++;
                            if (x_entitiesForUpdate10.Any((x) => x == grid.EntityId))
                            {
                                RegistedMatches++;
                            }
                        }
                        if ((grid.NeedsUpdate & MyEntityUpdateEnum.EACH_100TH_FRAME) > MyEntityUpdateEnum.NONE)
                        {
                            NeedsUpdateMatches++;
                            if (x_entitiesForUpdate100.Any((x) => x == grid.EntityId))
                            {
                                RegistedMatches++;
                            }
                        }
                        if ((grid.NeedsUpdate & MyEntityUpdateEnum.SIMULATE) > MyEntityUpdateEnum.NONE)
                        {
                            NeedsUpdateMatches++;
                            if (x_entitiesForSimulate.Any((x) => x == grid.EntityId))
                            {
                                RegistedMatches++;
                            }
                        }

                        return(NeedsUpdateMatches > 0 && RegistedMatches == 0);
                    }

                    foreach (MyEntity item in entities)
                    {
                        MyCubeGrid myCubeGrid = item as MyCubeGrid;
                        if (myCubeGrid != null && !myCubeGrid.Closed && myCubeGrid.Physics != null)
                        {
                            long   steamId       = 0L;
                            string displayName   = string.Empty;
                            string factionTag    = string.Empty;
                            string factionName   = string.Empty;
                            long   groupEntityId = 0L;
                            if (myCubeGrid.BigOwners.Count > 0)
                            {
                                steamId = myCubeGrid.BigOwners[0];

                                MyIdentity myIdentity = MySession.Static.Players.TryGetIdentity(steamId);
                                if (myIdentity != null)
                                {
                                    displayName = myIdentity.DisplayName;
                                }

                                IMyFaction myFaction = MySession.Static.Factions.TryGetPlayerFaction(steamId);
                                if (myFaction != null)
                                {
                                    factionTag  = myFaction.Tag;
                                    factionName = myFaction.Name;
                                }
                            }

                            foreach (var group in MyCubeGridGroups.Static.Physical.Groups)
                            {
                                bool found = false;

                                foreach (var node in group.Nodes)
                                {
                                    if (node.NodeData != myCubeGrid)
                                    {
                                        continue;
                                    }

                                    groupEntityId = group.Nodes.OrderByDescending(x => x.NodeData.BlocksCount).First().NodeData.EntityId;
                                    found         = true;
                                    break;
                                }

                                if (found)
                                {
                                    break;
                                }
                            }

                            int conveyorInventoryBlockCount = 0;
                            int conveyorEndpointBlockCount  = 0;
                            int conveyorLineCount           = 0;
                            int conveyorConnectorCount      = 0;
                            if (myCubeGrid?.GridSystems?.ConveyorSystem != null)
                            {
                                type = myCubeGrid.GridSystems.ConveyorSystem.GetType();
                                conveyorInventoryBlockCount = (type.GetField("m_inventoryBlocks", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(myCubeGrid.GridSystems.ConveyorSystem) as HashSet <MyCubeBlock>).Count;
                                conveyorEndpointBlockCount  = (type.GetField("m_conveyorEndpointBlocks", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(myCubeGrid.GridSystems.ConveyorSystem) as HashSet <IMyConveyorEndpointBlock>).Count;
                                conveyorLineCount           = (type.GetField("m_lines", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(myCubeGrid.GridSystems.ConveyorSystem) as HashSet <MyConveyorLine>).Count;
                                conveyorConnectorCount      = (type.GetField("m_connectors", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(myCubeGrid.GridSystems.ConveyorSystem) as HashSet <MyShipConnector>).Count;
                            }

                            writer.WriteObjectStart();
                            writer.WritePropertyName("DisplayName");
                            writer.Write(myCubeGrid.DisplayName);
                            writer.WritePropertyName("EntityId");
                            writer.Write(myCubeGrid.EntityId);
                            writer.WritePropertyName("PhysicsGroupEntityId");
                            writer.Write(groupEntityId);
                            writer.WritePropertyName("GridSize");
                            writer.Write(myCubeGrid.GridSizeEnum == MyCubeSize.Large ? "Large" : "Small");
                            writer.WritePropertyName("BlocksCount");
                            writer.Write(myCubeGrid.BlocksCount);
                            writer.WritePropertyName("Mass");
                            writer.Write(myCubeGrid.Physics.Mass);
                            writer.WritePropertyName("LinearSpeed");
                            writer.Write(myCubeGrid.Physics.LinearVelocity.Length());
                            writer.WritePropertyName("DistanceToPlayer");
                            writer.Write(MySession.GetPlayerDistance(myCubeGrid, onlinePlayers));
                            writer.WritePropertyName("OwnerSteamId");
                            writer.Write(steamId);
                            writer.WritePropertyName("OwnerDisplayName");
                            writer.Write(displayName);
                            writer.WritePropertyName("OwnerFactionTag");
                            writer.Write(factionTag);
                            writer.WritePropertyName("OwnerFactionName");
                            writer.Write(factionName);
                            writer.WritePropertyName("IsPowered");
                            writer.Write(myCubeGrid.GridSystems.ResourceDistributor.ResourceStateByType(MyResourceDistributorComponent.ElectricityId, withRecompute: false) != MyResourceStateEnum.NoPower);
                            writer.WritePropertyName("PCU");
                            writer.Write(myCubeGrid.BlocksPCU);
                            writer.WritePropertyName("IsConcealed");
                            writer.Write(IsConcealed(myCubeGrid));
                            writer.WritePropertyName("DampenersEnabled");
                            writer.Write(myCubeGrid.DampenersEnabled);
                            writer.WritePropertyName("IsStatic");
                            writer.Write(myCubeGrid.Physics.IsStatic);
                            writer.WritePropertyName("ConveyorSystemInventoryBlockCount");
                            writer.Write(conveyorInventoryBlockCount);
                            writer.WritePropertyName("ConveyorSystemEndpointBlockCount");
                            writer.Write(conveyorEndpointBlockCount);
                            writer.WritePropertyName("ConveyorSystemLineCount");
                            writer.Write(conveyorLineCount);
                            writer.WritePropertyName("ConveyorSystemConnectorCount");
                            writer.Write(conveyorConnectorCount);
                            writer.WriteObjectEnd();
                        }
                    }
                }
                writer.WriteArrayEnd();
                break;

            case "/metrics/v1/session/asteroids":
                writer.WriteArrayStart();
                if (MySession.Static != null && MySession.Static.Ready)
                {
                    MyConcurrentHashSet <MyEntity> entities = MyEntities.GetEntities();
                    foreach (MyEntity item in entities)
                    {
                        MyVoxelBase myVoxelBase = item as MyVoxelBase;
                        if (myVoxelBase != null && !(myVoxelBase is MyPlanet) && !myVoxelBase.Closed)
                        {
                            writer.WriteObjectStart();
                            writer.WritePropertyName("DisplayName");
                            writer.Write(myVoxelBase.StorageName);
                            writer.WritePropertyName("EntityId");
                            writer.Write(myVoxelBase.EntityId);
                            writer.WriteObjectEnd();
                        }
                    }
                }
                writer.WriteArrayEnd();
                break;

            case "/metrics/v1/session/planets":
                writer.WriteArrayStart();
                if (MySession.Static != null && MySession.Static.Ready)
                {
                    MyConcurrentHashSet <MyEntity> entities = MyEntities.GetEntities();
                    foreach (MyEntity item in entities)
                    {
                        MyPlanet myPlanet = item as MyPlanet;
                        if (myPlanet != null && !myPlanet.Closed)
                        {
                            string storageName = myPlanet.StorageName;
                            long   entityId    = myPlanet.EntityId;
                            writer.WriteObjectStart();
                            writer.WritePropertyName("DisplayName");
                            writer.Write(storageName);
                            writer.WritePropertyName("EntityId");
                            writer.Write(entityId);
                            writer.WriteObjectEnd();
                        }
                    }
                }
                writer.WriteArrayEnd();
                break;

            case "/metrics/v1/session/floatingObjects":
                writer.WriteArrayStart();
                if (MySession.Static != null && MySession.Static.Ready)
                {
                    ICollection <MyPlayer>         onlinePlayers = MySession.Static.Players.GetOnlinePlayers();
                    MyConcurrentHashSet <MyEntity> entities      = MyEntities.GetEntities();
                    foreach (MyEntity item in entities)
                    {
                        MyFloatingObject     myFloatingObject     = item as MyFloatingObject;
                        MyInventoryBagEntity myInventoryBagEntity = item as MyInventoryBagEntity;
                        if (myFloatingObject != null || myInventoryBagEntity != null)
                        {
                            string value  = string.Empty;
                            long   value2 = 0L;
                            string value3 = string.Empty;
                            float  value4 = 0f;
                            float  value5 = 0f;
                            float  value6 = 0f;
                            string value7 = string.Empty;
                            if (myFloatingObject != null)
                            {
                                if (myFloatingObject.Closed || myFloatingObject.Physics == null)
                                {
                                    continue;
                                }
                                value  = myFloatingObject.DisplayName;
                                value2 = myFloatingObject.EntityId;
                                value3 = "FloatingObject";
                                value4 = myFloatingObject.Physics.Mass;
                                value5 = myFloatingObject.Physics.LinearVelocity.Length();
                                value6 = MySession.GetPlayerDistance(myFloatingObject, onlinePlayers);
                                var def = MyDefinitionManager.Static.GetPhysicalItemDefinition(new MyDefinitionId(myFloatingObject.Item.Content.TypeId, myFloatingObject.Item.Content.SubtypeId));
                                value7 = def.DisplayNameText;
                            }
                            else if (myInventoryBagEntity != null)
                            {
                                if (myInventoryBagEntity.Closed || myInventoryBagEntity.Physics == null)
                                {
                                    continue;
                                }
                                value  = myInventoryBagEntity.DisplayName;
                                value2 = myInventoryBagEntity.EntityId;
                                value3 = "Bag";
                                value4 = myInventoryBagEntity.Physics.Mass;
                                value5 = myInventoryBagEntity.Physics.LinearVelocity.Length();
                                value6 = MySession.GetPlayerDistance(myInventoryBagEntity, onlinePlayers);
                                value7 = "Bag";
                            }
                            writer.WriteObjectStart();
                            writer.WritePropertyName("DisplayName");
                            writer.Write(value);
                            writer.WritePropertyName("EntityId");
                            writer.Write(value2);
                            writer.WritePropertyName("Kind");
                            writer.Write(value3);
                            writer.WritePropertyName("Mass");
                            writer.Write(value4);
                            writer.WritePropertyName("LinearSpeed");
                            writer.Write(value5);
                            writer.WritePropertyName("DistanceToPlayer");
                            writer.Write(value6);
                            writer.WritePropertyName("TypeDisplayName");
                            writer.Write(value7);
                            writer.WriteObjectEnd();
                        }
                    }
                }
                writer.WriteArrayEnd();
                break;

            case "/metrics/v1/session/factions":
                writer.WriteArrayStart();
                if (MySession.Static != null && MySession.Static.Ready)
                {
                    List <MyFaction> factions = MySession.Static.Factions.Select((x) => x.Value).ToList();
                    foreach (MyFaction myfaction in factions)
                    {
                        writer.WriteObjectStart();
                        writer.WritePropertyName("AcceptHumans");
                        writer.Write(myfaction.AcceptHumans);
                        writer.WritePropertyName("AutoAcceptMember");
                        writer.Write(myfaction.AutoAcceptMember);
                        writer.WritePropertyName("AutoAcceptPeace");
                        writer.Write(myfaction.AutoAcceptPeace);
                        writer.WritePropertyName("EnableFriendlyFire");
                        writer.Write(myfaction.EnableFriendlyFire);
                        writer.WritePropertyName("FactionId");
                        writer.Write(myfaction.FactionId);
                        writer.WritePropertyName("FounderId");
                        writer.Write(myfaction.FounderId);
                        writer.WritePropertyName("MemberCount");
                        writer.Write(myfaction.Members.Count);
                        writer.WritePropertyName("Name");
                        writer.Write(myfaction.Name);
                        writer.WritePropertyName("Tag");
                        writer.Write(myfaction.Tag);
                        writer.WritePropertyName("NPCOnly");
                        writer.Write(myfaction.Members.All((x) => MySession.Static.Players.IdentityIsNpc(x.Value.PlayerId)));
                        writer.WriteObjectEnd();
                    }
                }
                writer.WriteArrayEnd();
                break;
            }

            return(sb.ToString());
        }
 public override void OnAddedToContainer(MyComponentContainer container)
 {
     base.OnAddedToContainer(container);
     m_floatingObject = Entity as MyFloatingObject;
 }
示例#23
0
        private static void GetSurfaceAndMaterial(IMyEntity entity, ref LineD line, ref Vector3D hitPosition, out MySurfaceImpactEnum surfaceImpact, out MyStringHash materialType)
        {
            var voxelBase = entity as MyVoxelBase;

            if (voxelBase != null)
            {
                materialType  = MyMaterialType.ROCK;
                surfaceImpact = MySurfaceImpactEnum.DESTRUCTIBLE;

                var voxelDefinition = voxelBase.GetMaterialAt(ref hitPosition);
                if (voxelDefinition != null)
                {
                    materialType = MyStringHash.GetOrCompute(voxelDefinition.MaterialTypeName);
                }
            }
            else if (entity is MyCharacter)
            {
                surfaceImpact = MySurfaceImpactEnum.CHARACTER;
                materialType  = MyMaterialType.CHARACTER;
                if ((entity as MyCharacter).Definition.PhysicalMaterial != null)
                {
                    materialType = MyStringHash.GetOrCompute((entity as MyCharacter).Definition.PhysicalMaterial);
                }
            }
            else if (entity is MyFloatingObject)
            {
                MyFloatingObject obj = entity as MyFloatingObject;
                materialType  = (obj.VoxelMaterial != null) ? MyMaterialType.ROCK : (obj.ItemDefinition != null && obj.ItemDefinition.PhysicalMaterial != MyStringHash.NullOrEmpty ? obj.ItemDefinition.PhysicalMaterial : MyMaterialType.METAL);
                surfaceImpact = MySurfaceImpactEnum.METAL;
            }
            else if (entity is MyTrees)
            {
                surfaceImpact = MySurfaceImpactEnum.DESTRUCTIBLE;
                materialType  = MyMaterialType.WOOD;
            }
            else if (entity is IMyHandheldGunObject <MyGunBase> )
            {
                surfaceImpact = MySurfaceImpactEnum.METAL;
                materialType  = MyMaterialType.METAL;
                var mat = (entity as IMyHandheldGunObject <MyGunBase>).GunBase;
                if (mat != null && mat.WeaponProperties != null && mat.WeaponProperties.WeaponDefinition != null)
                {
                    materialType = mat.WeaponProperties.WeaponDefinition.PhysicalMaterial;
                }
            }
            else
            {
                surfaceImpact = MySurfaceImpactEnum.METAL;
                materialType  = MyMaterialType.METAL;
                if (entity is MyCubeGrid)
                {
                    var grid = (entity as MyCubeGrid);
                    if (grid != null)
                    {
                        var block = grid.GetTargetedBlock(hitPosition);
                        if (block != null)
                        {
                            if (block.BlockDefinition.PhysicalMaterial != null && !block.BlockDefinition.PhysicalMaterial.Id.TypeId.IsNull)
                            {
                                materialType = MyStringHash.GetOrCompute(block.BlockDefinition.PhysicalMaterial.Id.SubtypeName);
                            }
                            else
                            {
                                if (block.FatBlock != null)
                                {
                                    MyIntersectionResultLineTriangleEx?res = null;
                                    block.FatBlock.GetIntersectionWithLine(ref line, out res);
                                    if (res.HasValue)
                                    {
                                        var technique = block.FatBlock.ModelCollision.GetDrawTechnique(res.Value.Triangle.TriangleIndex);
                                        if (technique == VRageRender.Import.MyMeshDrawTechnique.GLASS)
                                        {
                                            materialType = MyStringHash.GetOrCompute("Glass");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            System.Diagnostics.Debug.Assert(materialType.GetHashCode() != 0, "Unknown material");
        }
示例#24
0
        public override void UpdateAfterSimulation()
        {
            base.UpdateAfterSimulation();

            //MyRenderProxy.DebugDrawSphere(m_gunBase.PositionMuzzleWorld, 0.2f, new Vector3(1, 0, 0), 1.0f, true);

            m_targetGrid           = null;
            m_targetDestroyable    = null;
            m_targetFloatingObject = null;
            m_targetCharacter      = null;

            if (Owner == null)
            {
                return;
            }

            var   entitiesInRange    = m_sensor.EntitiesInRange;
            int   closestEntityIndex = 0;
            float closestDistance    = float.MaxValue;

            if (entitiesInRange != null && entitiesInRange.Count > 0)
            {
                int i = 0;
                foreach (var entity in entitiesInRange.Values)
                {
                    var targetGrid = entity.Entity as MyCubeGrid;
                    var distanceSq = (float)Vector3D.DistanceSquared(entity.DetectionPoint, m_gunBase.GetMuzzleWorldPosition());
                    if (entity.Entity.Physics != null && entity.Entity.Physics.Enabled)
                    {
                        if (distanceSq < closestDistance)
                        {
                            m_targetGrid           = targetGrid;
                            m_targetDistanceSq     = (float)distanceSq;
                            m_targetDestroyable    = entity.Entity as IMyDestroyableObject;
                            m_targetFloatingObject = entity.Entity as MyFloatingObject;
                            m_targetCharacter      = entity.Entity as MyCharacter;
                            closestDistance        = m_targetDistanceSq;
                            closestEntityIndex     = i;
                        }
                    }
                    ++i;
                }
            }

            if (m_targetGrid != null)
            {
                m_targetPosition = entitiesInRange.Values.ElementAt(closestEntityIndex).DetectionPoint;
                var invWorld     = m_targetGrid.PositionComp.GetWorldMatrixNormalizedInv();
                var gridLocalPos = Vector3D.Transform(m_targetPosition, invWorld);
                var gridSpacePos = Vector3I.Round(gridLocalPos / m_targetGrid.GridSize);
                m_targetGrid.FixTargetCube(out m_targetCube, gridLocalPos / m_targetGrid.GridSize);

                var head        = PositionComp.WorldMatrix;
                var aimToMuzzle = Vector3D.Normalize(m_targetPosition - m_gunBase.GetMuzzleWorldPosition());
                if (Vector3.Dot(aimToMuzzle, head.Forward) > 0)
                {
                    m_targetDistanceSq = 0;
                }
                else
                {
                    m_targetDistanceSq = (float)Vector3D.DistanceSquared(m_targetPosition, m_gunBase.GetMuzzleWorldPosition());
                }
            }
            SinkComp.Update();

            if (IsShooting && !SinkComp.IsPowered)
            {
                EndShoot(MyShootActionEnum.PrimaryAction);
            }

            UpdateEffect();
            CheckEffectType();

            if (Owner != null && Owner.ControllerInfo.IsLocallyHumanControlled())
            {
                if (MySession.Static.SurvivalMode && (MySession.GetCameraControllerEnum() != MyCameraControllerEnum.Spectator || MyFinalBuildConstants.IS_OFFICIAL))
                {
                    var character = ((MyCharacter)this.CharacterInventory.Owner);
                    MyCubeBuilder.Static.MaxGridDistanceFrom = character.PositionComp.GetPosition() + character.WorldMatrix.Up * 1.8f;
                }
                else
                {
                    MyCubeBuilder.Static.MaxGridDistanceFrom = null;
                }
            }

            //MyTrace.Watch("MyEngineerToolBase.RequiredPowerInput", RequiredPowerInput);
        }
示例#25
0
        private static bool TakeFloatingObjectPrepare(long ownerEntityId, long floatingObjectId, byte inventoryIndex, out MyFloatingObject obj, out MyFixedPoint amount)
        {
            obj    = null;
            amount = 0;

            if (!MyEntities.EntityExists(ownerEntityId) || !MyEntities.EntityExists(floatingObjectId))
            {
                return(false);
            }
            obj = MyEntities.GetEntityById(floatingObjectId) as MyFloatingObject;
            if (obj.MarkedForClose)
            {
                return(false);
            }
            var owner = MyEntities.GetEntityById(ownerEntityId) as IMyInventoryOwner;
            var inv   = owner.GetInventory(inventoryIndex);

            return(ComputeFloatingObjectAmount(obj, ref amount, inv));
        }
示例#26
0
 public FloatingObjectWrapper(MyFloatingObject entity)
 {
     Entity = entity;
 }