Ejemplo n.º 1
0
        private bool isAttached_connector(AttachedGrids partner)
        {
            foreach (KeyValuePair <IMySlimBlock, wasConnected> pair in allConnectors)
            {
                IMySlimBlock connector = pair.Key;
                MyObjectBuilder_ShipConnector builder_conn = connector.GetObjectBuilder() as MyObjectBuilder_ShipConnector;
                pair.Value.connected = builder_conn.Connected;
                if (!builder_conn.Connected)
                {
                    continue;
                }

                long connectedEntityId = builder_conn.ConnectedEntityId;
                foreach (IMySlimBlock connectPartner in partner.allConnectors.Keys)
                {
                    if (connectedEntityId == connectPartner.FatBlock.EntityId)
                    {
                        log("matched " + myGrid.DisplayName + " : " + connector.FatBlock.DefinitionDisplayNameText + " to " + partner.myGrid.DisplayName + " : " + connectPartner.FatBlock.DefinitionDisplayNameText, "isAttached_connector()", Logger.severity.TRACE);
                        tryAddAttached(partner);
                        return(true);
                    }
                }
            }
            return(false);
        }
Ejemplo n.º 2
0
        public static AttachedGrids getFor(IMyCubeGrid myGrid)
        {
            AttachedGrids instance;

            if (registry.TryGetValue(myGrid, out instance))
            {
                return(instance);
            }
            instance        = new AttachedGrids();
            instance.myGrid = myGrid;

            List <IMySlimBlock> allBlocks = new List <IMySlimBlock>();

            myGrid.GetBlocks(allBlocks);
            foreach (IMySlimBlock block in allBlocks)
            {
                instance.myGrid_OnBlockAdded(block);
            }

            myGrid.OnBlockAdded   += instance.myGrid_OnBlockAdded;
            myGrid.OnBlockRemoved += instance.myGrid_OnBlockRemoved;
            myGrid.OnClosing      += instance.myGrid_OnClosing;
            registry.Add(myGrid, instance);
            instance.log("created for: " + myGrid.DisplayName, "getFor()");
            return(instance);
        }
Ejemplo n.º 3
0
 private bool tryAddAttached(AttachedGrids toAttach)
 {
     if (toAttach == this || attachedToMe.Contains(toAttach))
     {
         //log("already attached " + toAttach.DisplayName, "tryAddAttached()", Logger.severity.TRACE);
         return(false);
     }
     attachedToMe.Add(toAttach);
     toAttach.tryAddAttached(this);
     log("attached " + toAttach.myGrid.DisplayName, "tryAddAttached()", Logger.severity.TRACE);
     return(true);
 }
Ejemplo n.º 4
0
        private void buildAttached(int buildID)
        {
            if (last_build_ID == buildID)
            {
                //log("already building for : " + myGrid.DisplayName, "buildAttached()", Logger.severity.TRACE);
                return;
            }
            last_build_ID = buildID;
            log("building for : " + myGrid.DisplayName, "buildAttached()", Logger.severity.TRACE);

            // get all the potentially attached grids
            BoundingBoxD world     = myGrid.WorldAABB;
            MatrixD      scale     = MatrixD.CreateScale(1.1);
            BoundingBoxD searchBox = world.Transform(scale);

            searchBox = searchBox.Translate(world.Center - searchBox.Center);
            foreach (IMyEntity entity in MyAPIGateway.Entities.GetEntitiesInAABB(ref searchBox))
            {
                IMyCubeGrid grid = entity as IMyCubeGrid;
                if (grid == null || grid == myGrid)
                {
                    continue;
                }
                AttachedGrids partner = getFor(grid);
                if (attachedToMe.Contains(partner))
                {
                    //log("already attached: " + grid.DisplayName, "buildAttached()", Logger.severity.TRACE);
                    continue;
                }

                // check each grid for isAttached
                log("checking grid: " + grid.DisplayName, "buildAttached()", Logger.severity.TRACE);
                if (isAttached_piston(partner) || partner.isAttached_piston(this) ||
                    isAttached_motor(partner) || partner.isAttached_motor(this) ||
                    isAttached_connector(partner) || partner.isAttached_connector(this) ||
                    isAttached_landingGear(partner) || partner.isAttached_landingGear(this))
                {
                    continue;
                }
            }
            HashSet <AttachedGrids> copy = new HashSet <AttachedGrids>(attachedToMe);

            foreach (AttachedGrids attached in copy)
            {
                //log("building for attached: " + grid.DisplayName, "buildAttached()", Logger.severity.TRACE);
                attached.buildAttached(buildID);
            }
        }
Ejemplo n.º 5
0
 private bool isAttached_motor(AttachedGrids partner)
 {
     foreach (IMySlimBlock motorBase in allMotorBases)
     {
         MyObjectBuilder_MotorBase builder_base = motorBase.GetObjectBuilder() as MyObjectBuilder_MotorBase;
         long rotorEntityId = builder_base.RotorEntityId;
         foreach (IMySlimBlock motorRotor in partner.allMotorRotors)
         {
             if (rotorEntityId == motorRotor.FatBlock.EntityId)
             {
                 log("matched " + myGrid.DisplayName + " : " + motorBase.FatBlock.DefinitionDisplayNameText + " to " + partner.myGrid.DisplayName + " : " + motorRotor.FatBlock.DefinitionDisplayNameText, "isAttached_motor()", Logger.severity.TRACE);
                 tryAddAttached(partner);
                 return(true);
             }
         }
     }
     return(false);
 }
Ejemplo n.º 6
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="partner"></param>
 /// <returns>true iff a new grid was attached</returns>
 private bool isAttached_piston(AttachedGrids partner)
 {
     foreach (IMySlimBlock pistonBase in allPistonBases)
     {
         MyObjectBuilder_PistonBase builder_base = pistonBase.GetObjectBuilder() as MyObjectBuilder_PistonBase;
         long topBlockId = builder_base.TopBlockId;
         foreach (IMySlimBlock pistonTop in partner.allPistonTops)
         {
             if (topBlockId == pistonTop.FatBlock.EntityId)
             {
                 log("matched " + myGrid.DisplayName + " : " + pistonBase.FatBlock.DefinitionDisplayNameText + " to " + partner.myGrid.DisplayName + " : " + pistonTop.FatBlock.DefinitionDisplayNameText, "isAttached_piston()", Logger.severity.TRACE);
                 tryAddAttached(partner);
                 return(true);
             }
         }
     }
     return(false);
 }
Ejemplo n.º 7
0
        private bool isGridAttached(AttachedGrids searchFor, int searchID)
        {
            if (searchID == mySearchAttached_ID)
            {
                return(false);                // already searching
            }
            mySearchAttached_ID = searchID;

            if (attachedToMe.Contains(searchFor))
            {
                return(true);                // found it
            }
            foreach (AttachedGrids attached in attachedToMe)
            {
                if (attached.isGridAttached(searchFor, searchID))
                {
                    return(true);                    // attached through another
                }
            }
            return(false);            // not attached
        }
Ejemplo n.º 8
0
 private bool isAttached_landingGear(AttachedGrids partner)
 {
     return(false);
 }
Ejemplo n.º 9
0
        /// <summary>
        /// Tests for sendFrom is working and grid attached or in range. Use without range to skip range test. If sendTo is not a block or a grid, will skip grid test. If sendTo is a block, it must be working.
        /// </summary>
        /// <param name="sendFrom"></param>
        /// <param name="sendTo"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        public static bool canSendTo(this IMyCubeBlock sendFrom, IMyEntity sendTo, bool friendsOnly, float range = 0, bool rangeIsSquared = false)
        {
            sendFrom.throwIfNull_argument("sendFrom");
            sendTo.throwIfNull_argument("sendTo");

            if (sendFrom.Closed || !sendFrom.IsWorking)
            {
                return(false);
            }

            IMyCubeBlock sendToAsBlock = sendTo as IMyCubeBlock;

            if (sendToAsBlock != null)
            {
                if (sendToAsBlock.Closed || !sendToAsBlock.IsWorking)
                {
                    return(false);
                }

                if (friendsOnly && !sendFrom.canConsiderFriendly(sendToAsBlock))
                {
                    return(false);
                }

                if (AttachedGrids.isGridAttached(sendFrom.CubeGrid, sendToAsBlock.CubeGrid))
                {
                    return(true);
                }

                if (range > 0)
                {
                    double distanceSquared = (sendFrom.GetPosition() - sendTo.GetPosition()).LengthSquared();
                    if (rangeIsSquared)
                    {
                        return(distanceSquared < range);
                    }
                    else
                    {
                        return(distanceSquared < range * range);
                    }
                }
            }
            else
            {
                IMyCubeGrid sendToAsGrid = sendTo as IMyCubeGrid;
                if (sendToAsGrid != null)
                {
                    if (friendsOnly && !sendFrom.canConsiderFriendly(sendToAsGrid))
                    {
                        return(false);
                    }

                    if (Rynchodon.AttachedGrids.isGridAttached(sendFrom.CubeGrid, sendToAsGrid))
                    {
                        return(true);
                    }
                }

                // may or may not be grid
                if (range > 0)
                {
                    double distance = sendTo.WorldAABB.Distance(sendFrom.GetPosition());
                    if (rangeIsSquared)
                    {
                        return(distance * distance < range);
                    }
                    else
                    {
                        return(distance < range);
                    }
                }
            }

            return(false);
        }