예제 #1
0
        static bool CanMergeCubes(IMyCubeBlock padA, IMyCubeBlock padB, Vector3I gridOffset, List <IMySlimBlock> blocksOverlapping, List <IMySlimBlock> weldPadsOverlapping)
        {
            blocksOverlapping.Clear();
            try
            {
                IMyCubeGrid gridA         = padA.CubeGrid;
                IMyCubeGrid gridB         = padB.CubeGrid;
                MyCubeGrid  internalGridB = (MyCubeGrid)gridB;

                MatrixI transform = gridA.CalculateMergeTransform(gridB, gridOffset);

                bool result = true;

                // check gridToMerge's blocks against grid's blocks
                foreach (IMySlimBlock slimGridB in internalGridB.GetBlocks()) // get blocks without intermediary lists
                {
                    if (slimGridB.FatBlock == padB)
                    {
                        continue;
                    }

                    // ignore all pads
                    //if(IsWeldPad(slimGridB.BlockDefinition.Id))
                    //    continue;

                    Vector3I     pos       = Vector3I.Transform(slimGridB.Position, transform);
                    IMySlimBlock slimGridA = gridA.GetCubeBlock(pos);

                    if (slimGridA != null)
                    {
                        if (slimGridA.FatBlock == padA)
                        {
                            continue;
                        }

                        // ignore all pads
                        //if(IsWeldPad(slimGridA.BlockDefinition.Id))
                        //    continue;

                        //MyAPIGateway.Utilities.ShowNotification($"{(master ? "master" : "slavetest")} :: {slimGrid1.BlockDefinition.ToString()} OVERLAPS {slimGrid2.BlockDefinition.ToString()}", 16);
                        //DebugDraw(slimGrid1.CubeGrid, slimGrid1.Min, slimGrid1.Max, Color.Red, master);
                        //DebugDraw(slimGrid2.CubeGrid, slimGrid2.Min, slimGrid2.Max, Color.Yellow, master);
                        //result = false;
                        //continue;

                        bool isWeldPadA = (slimGridA?.FatBlock?.GameLogic?.GetAs <WeldPad>() != null);
                        bool isWeldPadB = (slimGridB?.FatBlock?.GameLogic?.GetAs <WeldPad>() != null);

                        if (isWeldPadA || isWeldPadB)
                        {
                            if (isWeldPadA)
                            {
                                weldPadsOverlapping.Add(slimGridA);
                            }

                            if (isWeldPadB)
                            {
                                weldPadsOverlapping.Add(slimGridB);
                            }
                        }
                        else
                        {
                            blocksOverlapping.Add(slimGridA);
                            blocksOverlapping.Add(slimGridB);
                            result = false;
                        }

                        // allow more blocks to be found
                    }

                    //DebugDraw(grid1, pos, pos, Color.Blue, master);
                }

                return(result);
            }
            catch (Exception e)
            {
                Log.Error(e);
            }

            return(false);
        }