public static AsteroidIntel DeserializeAsteroid(string s)
        {
            AsteroidIntel astr = new AsteroidIntel();

            astr.Deserialize(s);
            return(astr);
        }
        static public AsteroidIntel IGCUnpack(object data)
        {
            var unpacked = (MyTuple <Vector3D, float, long>)data;
            var astr     = new AsteroidIntel();

            astr.IGCUnpackInto(unpacked);
            return(astr);
        }
        public HoneybeeMiningTask(MyGridProgram program, HoneybeeMiningSystem miningSystem, IAutopilot autopilot, IAgentSubsystem agentSubsystem, Waypoint target, AsteroidIntel host, IIntelProvider intelProvider, IMonitorSubsystem monitorSubsystem, IDockingSubsystem dockingSubsystem, DockTaskGenerator dockTaskGenerator, UndockFirstTaskGenerator undockTaskGenerator)
        {
            Program               = program;
            MiningSystem          = miningSystem;
            Autopilot             = autopilot;
            AgentSubsystem        = agentSubsystem;
            MonitorSubsystem      = monitorSubsystem;
            Host                  = host;
            MiningDepth           = MiningSystem.MineDepth;
            LowestExpectedOreDist = (float)MiningDepth;
            DockingSubsystem      = dockingSubsystem;

            Status = TaskStatus.Incomplete;

            double lDoc, det;

            GetSphereLineIntersects(host.Position, host.Radius, target.Position, target.Direction, out lDoc, out det);
            Perpendicular = GetPerpendicular(target.Direction);
            CoPerp        = Perpendicular.Cross(target.Direction);

            if (det < 0)
            {
                Status = TaskStatus.Aborted;
                state  = -1;
                return;
            }

            SurfaceDist = -lDoc + Math.Sqrt(det);

            ApproachPoint = target.Position + target.Direction * SurfaceDist * 0.3;
            ExitPoint     = ApproachPoint;

            EntryPoint = target.Position + target.Direction * miningSystem.CloseDist;
            MiningEnd  = target.Position - target.Direction * MiningDepth;

            SurfacePoint = target.Position;

            LeadTask = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.SmartEnter);
            MineTask = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.DoNotAvoid);

            LeadTask.Destination.Position    = ApproachPoint;
            LeadTask.Destination.Direction   = target.Direction * -1;
            LeadTask.Destination.DirectionUp = Perpendicular + CoPerp;
            intelProvider.ReportFleetIntelligence(LeadTask.Destination, TimeSpan.FromSeconds(1));
            MineTask.Destination.Direction   = target.Direction * -1;
            MineTask.Destination.DirectionUp = Perpendicular + CoPerp;
            MineTask.Destination.Position    = EntryPoint;

            DockTaskGenerator   = dockTaskGenerator;
            UndockTaskGenerator = undockTaskGenerator;
        }
Beispiel #4
0
 public void DeserializeSubsystem(string serialized)
 {
     if (IsMaster)
     {
         MyStringReader reader = new MyStringReader(serialized);
         while (reader.HasNextLine)
         {
             var s = reader.NextLine();
             if (s == string.Empty)
             {
                 return;
             }
             ReportFleetIntelligence(AsteroidIntel.DeserializeAsteroid(s), TimeSpan.Zero);
         }
     }
 }
        public ITask GenerateTask(TaskType type, MyTuple <IntelItemType, long> intelKey, Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence> IntelItems, TimeSpan canonicalTime, long myID)
        {
            if (type != TaskType.Mine)
            {
                return(new NullTask());
            }
            if (!IntelItems.ContainsKey(intelKey))
            {
                return(new NullTask());
            }
            if (intelKey.Item1 != IntelItemType.Waypoint)
            {
                return(new NullTask());
            }

            var target = (Waypoint)IntelItems[intelKey];

            // Make sure we actually have the asteroid we are supposed to be mining
            AsteroidIntel host = null;

            foreach (var kvp in IntelItems)
            {
                if (kvp.Key.Item1 != IntelItemType.Asteroid)
                {
                    continue;
                }
                var dist = (kvp.Value.GetPositionFromCanonicalTime(canonicalTime) - target.GetPositionFromCanonicalTime(canonicalTime)).Length();
                if (dist > kvp.Value.Radius)
                {
                    continue;
                }
                host = (AsteroidIntel)kvp.Value;
                break;
            }

            if (host == null)
            {
                return(new NullTask());
            }

            Task = new HoneybeeMiningTask(Program, MiningSystem, Autopilot, AgentSubsystem, target, host, IntelProvider, MonitorSubsystem, DockingSubsystem, DockTaskGenerator, UndockTaskGenerator);

            return(Task);
        }
        public MyTuple <IntelItemType, long>?TryIGCUnpack(object data, Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence> intelItems)
        {
            var unpacked = (MyTuple <int, long, MyTuple <Vector3D, float, long> >)data;
            var key      = MyTuple.Create((IntelItemType)unpacked.Item1, unpacked.Item2);

            if (intelItems != null && key.Item1 == IntelItemType.Asteroid)
            {
                if (intelItems.ContainsKey(key))
                {
                    ((AsteroidIntel)intelItems[key]).IGCUnpackInto(unpacked.Item3);
                }
                else
                {
                    intelItems.Add(key, AsteroidIntel.IGCUnpack(unpacked.Item3));
                }

                return(key);
            }
            return(null);
        }
 public static string SerializeAsteroid(AsteroidIntel astr)
 {
     return($"{astr.Position.ToString()}|{astr.Radius}|{astr.ID}");
 }