Esempio n. 1
0
 void Main(int ticks)
 {
     try
     {
         Tool.ResourceSink.SetRequiredInputByType(Electricity, PowerConsumptionFunc());
         if (Tool.IsToolWorking())
         {
             Work(ticks);
             DrawBeam();
         }
         else
         {
             DebugNote.Text = $"{Tool.CustomName}: idle";
             ClosestGrid    = null;
             MissingComponents.Clear();
         }
         Tool.RefreshCustomInfo();
         if (SessionCore.Debug)
         {
             DebugNote.Text = $"{Tool.CustomName} perf. impact: {(RunTimesAvailable ? Math.Round(AvgRunTime, 5).ToString() : "--")}/{(RunTimesAvailable ? Math.Round(MaxRunTime, 5).ToString() : "--")} ms (avg/max)";
         }
     }
     catch (Exception Scrap)
     {
         SessionCore.LogError(Tool.CustomName, Scrap);
     }
 }
Esempio n. 2
0
 public override void Close()
 {
     try
     {
         if (SessionCore.Debug)
         {
             DebugNote.Hide();
             DebugNote.AliveTime = 0;
             DebugNote           = null;
         }
     }
     catch (Exception Scrap)
     {
         SessionCore.LogError($"{Tool.CustomName}.Close().DebugClose", Scrap);
     }
     try
     {
         SessionCore.SaveUnregister(Save);
         SyncBeamLength.Close();
         SyncDistanceMode.Close();
     }
     catch (Exception Scrap)
     {
         SessionCore.LogError($"{Tool.CustomName}.Close()", Scrap);
     }
 }
Esempio n. 3
0
 public void Load()
 {
     try
     {
         string Storage = "";
         //if (Tool.Storage.ContainsKey(SessionCore.StorageGuid))
         if (MyAPIGateway.Utilities.GetVariable($"settings_{Tool.EntityId}", out Storage))
         {
             byte[] Raw = Convert.FromBase64String(Storage);
             try
             {
                 Persistent persistent = MyAPIGateway.Utilities.SerializeFromBinary <Persistent>(Raw);
                 SyncBeamLength.Set(persistent.BeamLength);
                 SyncDistanceMode.Set(persistent.DistanceBased);
                 SessionCore.DebugWrite($"{Tool.CustomName}.Load()", $"Loaded from storage. beamlength={persistent.BeamLength}");
             }
             catch (Exception Scrap)
             {
                 SessionCore.LogError($"{Tool.CustomName}.Load()", Scrap);
             }
         }
         else
         {
             SessionCore.DebugWrite($"{Tool.CustomName}.Load()", "Storage access failed.");
         }
     }
     catch (Exception Scrap)
     {
         SessionCore.LogError($"{Tool.CustomName}.Load().AccessStorage", Scrap);
     }
 }
        public static Dictionary <string, int> CalculateMissingComponents(this IMyCubeGrid Grid)
        {
            if (Grid == null)
            {
                return(new Dictionary <string, int>());
            }
            try
            {
                Dictionary <string, int> MissingComponents = new Dictionary <string, int>();
                List <IMySlimBlock>      Blocks            = new List <IMySlimBlock>();
                Grid.GetBlocks(Blocks);

                foreach (IMySlimBlock Block in Blocks)
                {
                    try
                    {
                        Block.GetMissingComponents(MissingComponents);
                    }
                    catch (Exception Scrap)
                    {
                        SessionCore.LogError($"CalculateMissing[{Grid.CustomName}].Iterate", Scrap, DebugPrefix: "LaserWelders.");
                    }
                }
                return(MissingComponents);
            }
            catch (Exception Scrap)
            {
                SessionCore.LogError($"CalculateMissing[{Grid.CustomName}]", Scrap, DebugPrefix: "LaserWelders.");
                return(new Dictionary <string, int>());
            }
        }
Esempio n. 5
0
        void Work(int ticks = 1)
        {
            if (!MyAPIGateway.Multiplayer.IsServer)
            {
                return;
            }
            LineD           WeldRay = new LineD(BeamStart, BeamEnd);
            List <IHitInfo> Hits    = new List <IHitInfo>();
            List <MyLineSegmentOverlapResult <MyEntity> > Overlaps = new List <MyLineSegmentOverlapResult <MyEntity> >();

            MyGamePruningStructure.GetTopmostEntitiesOverlappingRay(ref WeldRay, Overlaps);

            List <IMyCubeGrid>       Grids      = new List <IMyCubeGrid>();
            List <IMyCharacter>      Characters = new List <IMyCharacter>();
            List <IMyFloatingObject> Flobjes    = new List <IMyFloatingObject>();

            Overlaps.Select(x => x.Element as IMyEntity).SortByType(Grids, Characters, Flobjes);

            ClosestGrid = Grids.OrderBy(Grid => Vector3D.DistanceSquared(Tool.GetPosition(), Grid.GetPosition())).FirstOrDefault();
            foreach (IMyCharacter Char in Characters)
            {
                Char.DoDamage(GrinderSpeed, MyDamageType.Grind, true, null, Tool.EntityId);
            }

            foreach (IMyCubeGrid Grid in Grids)
            {
                if (Grid == Tool.CubeGrid)
                {
                    continue;
                }
                try
                {
                    List <IMySlimBlock> Blocks = Grid.GetBlocksOnRay(WeldRay.From, WeldRay.To);
                    //if (!SessionCore.Debug && Blocks.Count == 0) return;

                    if (IsWelder)
                    {
                        Weld(Blocks, ticks);
                    }
                    if (IsGrinder)
                    {
                        Grind(Blocks, ticks);
                    }
                }
                catch (Exception Scrap)
                {
                    SessionCore.LogError(Grid.DisplayName, Scrap);
                }
            }

            foreach (IMyFloatingObject Flobj in Flobjes)
            {
                ToolCargo.PickupItem(Flobj);
            }
        }
Esempio n. 6
0
 public override void Init(MyObjectBuilder_EntityBase objectBuilder)
 {
     NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME;
     Tool         = Entity as IMyShipToolBase;
     Grid         = Tool.CubeGrid;
     SessionCore.SaveRegister(Save);
     Tool.ResourceSink.SetMaxRequiredInputByType(Electricity, (float)Math.Pow(1.2, MaxBeamLengthM));
     //Tool.ResourceSink.SetRequiredInputFuncByType(Electricity, PowerConsumptionFunc);
     if (!Tool.HasComponent <MyModStorageComponent>())
     {
         Tool.Storage = new MyModStorageComponent();
         Tool.Components.Add(Tool.Storage);
         SessionCore.DebugWrite($"{Tool.CustomName}.Init()", "Block doesn't have a Storage component!", IsExcessive: false);
     }
 }
Esempio n. 7
0
 public void Save()
 {
     try
     {
         Persistent persistent;
         persistent.BeamLength    = SyncBeamLength.Get();
         persistent.DistanceBased = SyncDistanceMode.Get();
         string Raw = Convert.ToBase64String(MyAPIGateway.Utilities.SerializeToBinary(persistent));
         MyAPIGateway.Utilities.SetVariable($"settings_{Tool.EntityId}", Raw);
         SessionCore.DebugWrite($"{Tool.CustomName}.Load()", "Set settings to storage.");
     }
     catch (Exception Scrap)
     {
         SessionCore.LogError($"{Tool.CustomName}.Save()", Scrap);
     }
 }
Esempio n. 8
0
 void CheckInitControls()
 {
     if (IsWelder)
     {
         if (!SessionCore.InitedWelderControls)
         {
             SessionCore.InitWelderControls();
         }
     }
     else if (IsGrinder)
     {
         if (!SessionCore.InitedGrinderControls)
         {
             SessionCore.InitGrinderControls();
         }
     }
 }
Esempio n. 9
0
        void Work(int ticks = 1)
        {
            if (!MyAPIGateway.Multiplayer.IsServer)
            {
                return;
            }
            LineD           WeldRay = new LineD(BeamStart, BeamEnd);
            List <IHitInfo> Hits    = new List <IHitInfo>();
            List <MyLineSegmentOverlapResult <MyEntity> > Overlaps = new List <MyLineSegmentOverlapResult <MyEntity> >();

            MyGamePruningStructure.GetTopmostEntitiesOverlappingRay(ref WeldRay, Overlaps);

            var Entities = Overlaps.Select(x => x.Element);
            var Grids    = Entities.OfType <IMyCubeGrid>().Except(Tool.CubeGrid).OrderBy(x => Vector3D.DistanceSquared(BlockPosition, x.GetPosition())).ToList();

            ClosestGrid = Grids.FirstOrDefault();

            foreach (IMyCharacter Char in Entities.OfType <IMyCharacter>())
            {
                Char.DoDamage(GrinderSpeed, MyDamageType.Grind, true, null, Tool.EntityId);
            }

            foreach (IMyCubeGrid Grid in Entities.OfType <IMyCubeGrid>())
            {
                try
                {
                    List <IMySlimBlock> Blocks = Grid.GetBlocksOnRay(WeldRay.From, WeldRay.To);
                    //if (!SessionCore.Debug && Blocks.Count == 0) return;

                    if (IsWelder)
                    {
                        Weld(Blocks, ticks);
                    }
                    if (IsGrinder)
                    {
                        Grind(Blocks, ticks);
                    }
                }
                catch (Exception Scrap)
                {
                    SessionCore.LogError(Grid.DisplayName, Scrap);
                }
            }
        }
Esempio n. 10
0
        void Weld(List <IMySlimBlock> Blocks, int ticks = 1)
        {
            var Welder = Tool as IMyShipWelder;

            if (Welder == null)
            {
                return;
            }
            Blocks = Blocks.Where(x => x.IsWeldable() || x.IsProjectable()).ToList();
            if (Blocks.Count == 0)
            {
                return;
            }
            if (DistanceMode)
            {
                Blocks = Blocks.OrderByDescending(x => Vector3D.DistanceSquared(x.GetPosition(), Tool.GetPosition())).ToList();
            }
            float SpeedRatio   = WelderSpeed / (DistanceMode ? 1 : Blocks.Count) * ticks;
            float BoneFixSpeed = WelderBoneRepairSpeed * ticks;
            var   Missing      = Blocks.ReadMissingComponents();
            bool  Pull         = Tool.UseConveyorSystem ? ToolCargo.PullAny(OnboardInventoryOwners, Missing) : false;

            Missing.Clear();
            HashSet <IMySlimBlock> UnbuiltBlocks = new HashSet <IMySlimBlock>();

            foreach (IMySlimBlock Block in Blocks)
            {
                if (Block.CubeGrid.Physics?.Enabled == true)
                {
                    if (Block.CanContinueBuild(ToolCargo) || Block.HasDeformation)
                    {
                        Block.MoveItemsToConstructionStockpile(ToolCargo);
                        Block.IncreaseMountLevel(SpeedRatio, Welder.OwnerId, ToolCargo, BoneFixSpeed, false);
                    }
                    else
                    {
                        UnbuiltBlocks.Add(Block);
                    }
                }
                else
                {
                    try
                    {
                        var FirstItem = ((MyCubeBlockDefinition)Block.BlockDefinition).Components[0].Definition.Id;
                        if (ToolCargo.PullAny(OnboardInventoryOwners, FirstItem.SubtypeName, 1))
                        {
                            try
                            {
                                var Projector = ((Block.CubeGrid as MyCubeGrid).Projector as IMyProjector);
                                Projector.Build(Block, 0, Tool.EntityId, false);
                            }
                            catch (Exception Scrap)
                            {
                                SessionCore.LogError(Tool.CustomName + ".WeldProjectorBlock.Build", Scrap);
                            }
                            ToolCargo.RemoveItemsOfType(1, FirstItem);
                        }
                    }
                    catch (Exception Scrap)
                    {
                        SessionCore.LogError(Tool.CustomName + ".WeldProjectorBlockStart", Scrap);
                    }
                }
                if (DistanceMode)
                {
                    break;
                }
            }
            PrintMissing(UnbuiltBlocks);
        }