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); } }
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); } }
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>()); } }
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); } }
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); } }
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); } }
void CheckInitControls() { if (IsWelder) { if (!SessionCore.InitedWelderControls) { SessionCore.InitWelderControls(); } } else if (IsGrinder) { if (!SessionCore.InitedGrinderControls) { SessionCore.InitGrinderControls(); } } }
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); } } }
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); }