Beispiel #1
0
    // Spawns an object in the world at random edge position and random angle
    private void SpawnEntity()
    {
        if (!isActive)
        {
            return;
        }

        Vector3    startPosition = GenerateStartLocation();
        Quaternion startRotation = GenerateStartRotation(startPosition);

        // TODO: Warn player that a entity is approaching

        GameObject entity = Instantiate(prefab, startPosition, startRotation, transform);

        if (entity.tag == "Ship")
        {
            ShipHandler shipHandler = entity.GetComponent <ShipHandler>();
            shipHandler.CurrentDirection = CalculateStartVelocity(entity);
            shipHandler.Speed            = speed;

            if (speed <= 50)
            {
                speed += speedIncrease;
            }

            ColorCoordinator colorCoordinator = FindObjectOfType <ColorCoordinator>();
            shipHandler.ShipColor = colorCoordinator.GetRandomPadColor();
        }
        else
        {
            entity.GetComponent <Rigidbody>().velocity = CalculateStartVelocity(entity);
        }

        NetworkServer.Spawn(entity);
    }
Beispiel #2
0
 public RefuelStarFinder(
     ApplicationDbContext dbContext,
     IStarSystemRepository starSystemRepository,
     ShipHandler shipHandler,
     bool useFsdBoost)
 {
     this.dbContext            = dbContext;
     this.starSystemRepository = starSystemRepository;
     this.shipHandler          = shipHandler;
     this.useFsdBoost          = useFsdBoost;
 }
Beispiel #3
0
 public MainHandler(DiscordSocketClient Discord)
 {
     guilds            = new Dictionary <ulong, GuildHandler>();
     Client            = Discord;
     ConfigHandler     = new Handlers.ConfigHandler();
     CommandHandler    = new CommandHandler();
     PermissionHandler = new PermissionHandler(this);
     TextHandler       = new TextHandler(this);
     ShipHandler       = new ShipHandler(this);
     BotHandler        = new BotHandler();
     forumUpdater      = new ForumUpdater(this);
     ExceptionHandler  = new ExceptionHandler(this);
     DatabaseHandler   = new Handlers.DatabaseHandler(this);
 }
Beispiel #4
0
        public async Task InitializeEarlyAsync(IServiceProvider services)
        {
            await ConfigHandler.InitializeAsync();

            await CommandHandler.InitializeAsync(this, services);

            await TextHandler.InitializeAsync(ConfigHandler.GetSwearString());

            await ShipHandler.InitializeAsync();

            await BotHandler.InitializeAsync();

            await DatabaseHandler.InitializeAsync();
        }
Beispiel #5
0
        public static Toil PutPawnOnShip(Pawn pawnToBoard, Pawn ship)
        {
            Toil toil = new Toil();

            toil.initAction = delegate()
            {
                CompShips shipComp = ship.GetComp <CompShips>();
                shipComp.Notify_Boarded(pawnToBoard);
                ShipHandler handler = shipComp.handlers.Find(x => x.role.handlingType == HandlingTypeFlags.None);
                shipComp.GiveLoadJob(pawnToBoard, handler);
            };
            toil.defaultCompleteMode = ToilCompleteMode.Instant;
            return(toil);
        }
 private void InitHandlers()
 {
     GameEvents        = new GameHandler(this);
     PlayerEvents      = new PlayerHandler(this);
     ShipEvents        = new ShipHandler(this);
     CombatEvents      = new CombatHandler(this);
     ExplorationEvents = new ExplorationHandler(this);
     StationEvents     = new StationHandler(this);
     TradeEvents       = new TradeHandler(this);
     TravelEvents      = new TravelHandler(this);
     PowerplayEvents   = new PowerplayHandler(this);
     WingEvents        = new WingHandler(this);
     SquadronEvents    = new SquadronHandler(this);
     CrewEvents        = new CrewHandler(this);
 }
Beispiel #7
0
        public async Task Close()
        {
            foreach (ulong id in guilds.Keys)
            {
                await guilds[id].Close();
            }
            await ConfigHandler.Close();

            await CommandHandler.Close();

            await TextHandler.Close();

            await ShipHandler.Close();

            await BotHandler.Close();

            await DatabaseHandler.Close();
        }
    void RegisterTouchToShip(Touch currentTouch)
    {
        int currentFingerId = currentTouch.fingerId;

        if (fingerIdToShip.ContainsKey(currentFingerId))
        {
            GameObject shipObject = fingerIdToShip[currentFingerId];

            // Handle if ship is destroyed while drawing path
            if (shipObject != null)
            {
                ShipHandler shipHandler = shipObject.GetComponent <ShipHandler>();
                if (currentFingerId == shipHandler.FingerId)
                {
                    Vector3 point = cam.ScreenToWorldPoint(new Vector3(currentTouch.position.x, currentTouch.position.y, cam.transform.position.y - shipObject.transform.position.y));
                    CmdAddPointToPath(shipObject.GetComponent <NetworkIdentity>(), point);
                }
            }
        }
    }
Beispiel #9
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
            {
                return(null);
            }
            Pawn pawn2 = this.FindPrisoner(pawn);

            if (pawn2 is null)
            {
                return(null);
            }
            Pawn        ship    = this.FindShipToDeposit(pawn, pawn2);
            ShipHandler handler = ship.GetComp <CompShips>().handlers.Find(x => x.role.handlingType == HandlingTypeFlags.None);

            return(new Job(JobDefOf.PrepareCaravan_GatherPawns, pawn2)
            {
                count = 1
            });
        }
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
            {
                return(null);
            }
            Pawn pawn2 = this.FindDownedPawn(pawn);

            if (pawn2 is null)
            {
                return(null);
            }
            Pawn        ship    = this.FindShipToDeposit(pawn, pawn2);
            ShipHandler handler = ship.GetComp <CompShips>().handlers.Find(x => x.role.handlingType == HandlingTypeFlags.None);

            return(new Job(JobDefOf_Ships.CarryPawnToShip, pawn2, ship)
            {
                count = 1
            });
        }
    // Set up ship and finger id if touch on ship
    void InitTouch(Touch currentTouch)
    {
        Ray        ray = cam.ScreenPointToRay(currentTouch.position);
        RaycastHit hit;

        // Send out ray and see if ship got touched
        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.tag == "Ship")
            {
                // Save ship to dict
                GameObject shipObject = hit.transform.gameObject;
                fingerIdToShip.Add(currentTouch.fingerId, shipObject);

                // Set finger id to ship
                ShipHandler shipHandler = shipObject.GetComponent <ShipHandler>();
                shipHandler.FingerId = currentTouch.fingerId;
                CmdClearPath(shipObject.GetComponent <NetworkIdentity>());
            }
        }
    }
Beispiel #12
0
        public static Toil BoardShip(Pawn pawnBoarding, TargetIndex index)
        {
            Toil toil = new Toil();

            toil.initAction = delegate()
            {
                CompShips ship = toil.actor.jobs.curJob.GetTarget(index).Thing.TryGetComp <CompShips>();
                ship.Notify_Boarded(pawnBoarding);
                bool flag = !pawnBoarding.IsColonist;

                if (!flag)
                {
                    foreach (ShipHandler handler in ship.handlers)
                    {
                        if (handler.AreSlotsAvailable)
                        {
                            ship.GiveLoadJob(pawnBoarding, handler);
                            ship.ReserveSeat(pawnBoarding, handler);
                            break;
                        }
                    }
                }
                else
                {
                    ShipHandler handler = ship.handlers.Find(x => x.role.handlingType == HandlingTypeFlags.None && x.AreSlotsAvailable);
                    if (handler is null)
                    {
                        handler = ship.handlers.Find(x => x.AreSlotsAvailable);
                    }
                    if (handler is null)
                    {
                        Log.Error("Could not find spot for " + pawnBoarding.LabelShort + " to board.");
                    }
                    ship.GiveLoadJob(pawnBoarding, handler);
                    ship.ReserveSeat(pawnBoarding, handler);
                }
            };
            toil.defaultCompleteMode = ToilCompleteMode.Instant;
            return(toil);
        }
Beispiel #13
0
    // Spawns an object in the world at random edge position and random angle
    private void SpawnEntity()
    {
        Vector3    startPosition = GenerateStartLocation();
        Quaternion startRotation = GenerateStartRotation(startPosition);

        // TODO: Warn player that a entity is approaching

        GameObject entity = Instantiate(prefab, startPosition, startRotation, transform);

        if (entity.tag == "Ship")
        {
            ShipHandler shipHandler = entity.GetComponent <ShipHandler>();
            shipHandler.CurrentDirection = CalculateStartVelocity(entity);
            shipHandler.Speed            = speed;
        }
        else
        {
            entity.GetComponent <Rigidbody>().velocity = CalculateStartVelocity(entity);
        }

        NetworkServer.Spawn(entity);
    }
Beispiel #14
0
 public Bill_BoardShip(Pawn newBoard, ShipHandler newHandler)
 {
     pawnToBoard = newBoard;
     handler     = newHandler;
 }
Beispiel #15
0
 void Start()
 {
     handler = GetComponent <ShipHandler>();
 }
Beispiel #16
0
        public static void Main()
        {
            var configuration = new ConfigurationBuilder()
                                .AddJsonFile("appsettings.json")
                                .AddJsonFile("appsettings.ignored.json")
                                .Build();

            var app = new AppSettings();

            configuration.GetSection("App").Bind(app);

            var serviceProvider = new ServiceCollection()
                                  .AddLogging()
                                  .AddDbContext <ApplicationDbContext>(options =>
            {
                options.UseMySql(
                    configuration.GetConnectionString("Default"),
                    new MySqlServerVersion(new Version(8, 0, 21)),
                    mysqlOptions =>
                {
                    mysqlOptions.EnableRetryOnFailure();
                }
                    );
            })
                                  .BuildServiceProvider();

            var dbContext = serviceProvider.GetService <ApplicationDbContext>();

            var repository = new StarSystemRepository(
                dbContext,
                new StarSystemRepository.Options
            {
                Mode       = "all",
                SectorSize = app.RepositorySectorSize,
            }
                );

            var ship = new Ship
            {
                Name         = app.Ship.Name,
                DryMass      = app.Ship.DryMass,
                FuelCapacity = app.Ship.FuelCapacity,
                FSD          = new FrameShiftDrive
                {
                    FuelPower      = app.Ship.FsdFuelPower,
                    FuelMultiplier = app.Ship.FsdFuelMultiplier,
                    MaxFuelPerJump = app.Ship.FsdMaxFuelPerJump,
                    OptimisedMass  = app.Ship.FsdOptimisedMass
                },
                GuardianBonus = app.Ship.GuardianBonus,
                FuelScoopRate = app.Ship.FuelScoopRate
            };

            var jumpParameters = app.Ship.RefuelLevels
                                 .Select(x => new JumpParameters(
                                             (RefuelType)Enum.Parse(typeof(RefuelType), x.RefuelType, true),
                                             x.RefuelMin,
                                             x.RefuelMax,
                                             x.JumpsMin,
                                             x.JumpsMax,
                                             x.MultiJumpRangeFactor
                                             ))
                                 .ToList();

            var start = repository.GetByName(app.Start);

            if (app.NeutronBoostedAtStart)
            {
                start.HasNeutron        = true;
                start.DistanceToNeutron = 0;
            }

            var goal = repository.GetByName(app.Goal);

            var edgeConstraints = (app.EdgeConstraints ?? new List <EdgeConstraintSettings>())
                                  .Select <EdgeConstraintSettings, IEdgeConstraint>(x =>
            {
                if (x.Type == "Angle")
                {
                    return(new AngleEdgeConstraint(
                               goal,
                               double.Parse(x.Parameters["Angle"])
                               ));
                }
                else if (x.Type == "Cylinder")
                {
                    return(new CylinderEdgeConstraint(
                               start,
                               goal,
                               float.Parse(x.Parameters["Radius"])
                               ));
                }
                else if (x.Type == "MaximumJumps")
                {
                    return(new MaximumJumpsEdgeConstraint(
                               int.Parse(x.Parameters["Jumps"])
                               ));
                }
                else if (x.Type == "MinimumDistance")
                {
                    return(new MinimumDistanceEdgeConstraint(
                               double.Parse(x.Parameters["Distance"])
                               ));
                }
                else if (x.Type == "FuelRestriction")
                {
                    var min = x.Parameters["Min"];
                    var max = x.Parameters["Max"];

                    return(new FuelRestrictionEdgeConstraint(
                               repository.GetByName(x.Parameters["System"]),
                               string.IsNullOrEmpty(min) ? (double?)null : double.Parse(min),
                               string.IsNullOrEmpty(max) ? (double?)null : double.Parse(max)
                               ));
                }
                else if (x.Type == "Exclude")
                {
                    return(new ExcludeEdgeConstraint(
                               x.Parameters["Names"]
                               .Split(';')
                               .Select(y => y.Trim())
                               .Where(y => !string.IsNullOrEmpty(y))
                               .Select(y => {
                        var parts = y.Split(",");
                        return (parts[0], parts[1]);
                    })
                               .ToList()
                               ));
                }
                else if (x.Type == "Beagle")
                {
                    return(new BeagleEdgeConstraint());
                }
                else
                {
                    throw new InvalidOperationException();
                }
            })
                                  .ToList();

            var shipHandler = new ShipHandler(ship);

            var refuelStarFinder = new RefuelStarFinder(
                dbContext,
                new StarSystemRepository(
                    dbContext,
                    new StarSystemRepository.Options
            {
                Mode       = "scoopable",
                SectorSize = app.RepositorySectorSize,
            }
                    ),
                shipHandler,
                app.UseFsdBoost
                );

            var nodeHandler = new NodeHandler(
                new StarSystemRepository(
                    dbContext,
                    new StarSystemRepository.Options
            {
                Mode       = app.RepositoryMode,
                SectorSize = app.RepositorySectorSize,
            }
                    ),
                refuelStarFinder,
                edgeConstraints,
                shipHandler,
                jumpParameters,
                start,
                goal,
                new NodeHandler.Options
            {
                UseFsdBoost             = app.UseFsdBoost,
                UseRefuelStarFinder     = app.UseRefuelStarFinder,
                NeighborRangeMin        = app.NeighborRangeMin,
                NeighborRangeMax        = 5000,
                NeighborRangeMultiplier = 2,
                NeighborCountMin        = 10,
                NeighborCountMax        = 1000000,
            }
                );

            var pathfinder = new Pathfinder(nodeHandler);

            var tStart = DateTime.UtcNow;

            var route = pathfinder.Invoke()
                        .Cast <Node>()
                        .ToList();

            if (app.UseRefuelStarFinder)
            {
                route = refuelStarFinder.Invoke(route).ToList();
            }

            var tEnd = DateTime.UtcNow;

            Console.WriteLine();
            Console.WriteLine(
                "Neighbors cache: [Hits={0}, Misses={1}]",
                nodeHandler.cacheHits,
                nodeHandler.cacheMisses
                );

            Console.WriteLine();
            Console.WriteLine("Time: {0}", (tEnd - tStart));


            Console.WriteLine();
            Console.WriteLine("route:");
            for (var i = 0; i < route.Count; i++)
            {
                var prev = 0 < i ? route[i - 1] : default;
                var node = route[i];
                var next = i < route.Count - 1 ? route[i + 1] : default;

                var system = node.StarSystem;

                Console.WriteLine("  - name: {0}", system.Name);

                if (system.Name.Equals("???"))
                {
                    Console.WriteLine("    x: {0:0}", system.Coordinates.X);
                    Console.WriteLine("    y: {0:0}", system.Coordinates.Y);
                    Console.WriteLine("    z: {0:0}", system.Coordinates.Z);
                }

                var    scoopable  = false;
                var    neutron    = false;
                var    whiteDwarf = false;
                var    boost      = false;
                double?fuel       = null;

                if (next != null)
                {
                    if (next.RefuelType == RefuelType.Scoop ||
                        next.RefuelType == RefuelType.ScoopHeatsink ||
                        next.RefuelType == RefuelType.ScoopReckless)
                    {
                        scoopable = true;
                    }

                    if (next.RefuelType != RefuelType.None)
                    {
                        fuel = next.RefuelAvg;
                    }

                    if (next.BoostType == BoostType.Neutron)
                    {
                        neutron = true;
                    }
                    else if (next.BoostType == BoostType.WhiteDwarf)
                    {
                        whiteDwarf = true;
                    }
                    else if (next.BoostType == BoostType.Synthesis)
                    {
                        boost = true;
                    }
                }

                if (scoopable && system.DistanceToScoopable != 0)
                {
                    Console.WriteLine("    scoopable: true");
                }
                else if (!scoopable && system.HasScoopable && system.DistanceToScoopable == 0)
                {
                    Console.WriteLine("    scoopable: false");
                }

                if (neutron && system.DistanceToNeutron != 0)
                {
                    Console.WriteLine("    neutron: true");
                }
                else if (!neutron && system.HasNeutron && system.DistanceToNeutron == 0)
                {
                    Console.WriteLine("    neutron: false");
                }

                if (whiteDwarf && system.DistanceToWhiteDwarf != 0)
                {
                    Console.WriteLine("    white-dwarf: true");
                    Console.WriteLine("    boost: true");
                }
                else if (!whiteDwarf && system.HasWhiteDwarf && system.DistanceToWhiteDwarf == 0)
                {
                    Console.WriteLine("    white-dwarf: false");
                }

                if (boost)
                {
                    Console.WriteLine("    boost: true");
                }

                if (fuel.HasValue)
                {
                    Console.WriteLine("    fuel: {0:0.00}", fuel);
                }

                /*
                 * if (i < route.Count - 1)
                 * {
                 *  Console.WriteLine("    x-fuel: {0}", node.FuelAvg);
                 *  Console.WriteLine("    x-jumps: {0}", node.Jumps);
                 *  Console.WriteLine("    x-time: {0:0}", pathfinder.GetDistance(node, route[i+1]));
                 * }
                 */
            }
        }
Beispiel #17
0
 private void Awake()
 {
     Instance = this;
 }