コード例 #1
0
        /// <summary>
        /// Starts the server from the provided assembly
        /// </summary>
        /// <param name="assembly">The Uchu instance to start</param>
        /// <param name="acceptConsoleCommands">Whether to handle console commands or not</param>
        public async Task StartAsync(Assembly assembly, bool acceptConsoleCommands = false)
        {
            RegisterDefaultAssemblies(assembly);
            if (acceptConsoleCommands)
            {
                StartConsole();
            }

            Running = true;

            var server = RakNetServer.RunAsync();
            var api    = Api.StartAsync(ApiPort);

            var tasks = new[]
            {
                server,
                api
            };

            await Task.WhenAny(tasks).ConfigureAwait(false);

            Console.WriteLine($"EXIT: {server.Status} | {api.Status}");

            await StopAsync().ConfigureAwait(false);
        }
コード例 #2
0
        public async Task ConfigureAsync(string configFile)
        {
            var serializer = new XmlSerializer(typeof(Configuration));

            await using var fs = File.OpenRead(configFile);

            Logger.Config = Config = (Configuration)serializer.Deserialize(fs);

            if (!File.Exists(configFile))
            {
                throw new ArgumentException($"{configFile} config file does not exist.");
            }

            if (!string.IsNullOrWhiteSpace(Config.ResourcesConfiguration?.GameResourceFolder))
            {
                Resources = new LocalResources(Config);
            }

            ServerSpecification specification;

            await using (var ctx = new NovaContext())
            {
                specification = await ctx.Specifications.FirstAsync(s => s.Id == Id);
            }

            Port = specification.Port;

            _server = new RakNetServer(Port, "3.25 ND1");
        }
コード例 #3
0
        /// <summary>
        /// Shuts down the server
        /// </summary>
        public Task StopAsync()
        {
            Console.WriteLine(ResourceStrings.Server_StopAsync_Log);

            Running = false;
            ServerStopped?.Invoke();
            Certificate?.Dispose();
            Api?.Close();

            return(RakNetServer.ShutdownAsync());
        }
コード例 #4
0
ファイル: Server.cs プロジェクト: DigitalData/Uchu
        public Task StopAsync()
        {
            Logger.Log("Shutting down...");

            Running = false;

            ServerStopped?.Invoke();

            Certificate.Dispose();

            return(RakNetServer.ShutdownAsync());
        }
コード例 #5
0
ファイル: Server.cs プロジェクト: enteryournamehere/Uchu
        public Task StopAsync()
        {
            Console.WriteLine("Shutting down...");

            Running = false;

            ServerStopped?.Invoke();

            Certificate?.Dispose();

            Api?.Close();

            return(RakNetServer.ShutdownAsync());
        }
コード例 #6
0
        public void HandleBatchPacket(RakNetSession session, byte[] buffer)
        {
            string id = RakNetServer.IPEndPointToID(session.EndPoint);

            if (this.players.ContainsKey(id))
            {
                Player player = this.players[id];
                int    pkid   = buffer[0];

                if (pkid == BatchPacket.ID)
                {
                    using (BatchPacket batch = new BatchPacket())
                    {
                        batch.SetBuffer(buffer);
                        batch.Decode();

                        this.GetPackets(batch, player);
                    }
                }
            }
        }
コード例 #7
0
 public ServerStartWorkerEventArgs(RakNetServer server) : base(server)
 {
 }
コード例 #8
0
ファイル: Server.cs プロジェクト: DigitalData/Uchu
        public async Task HandlePacketAsync(IPEndPoint endPoint, byte[] data, Reliability reliability)
        {
            var connection = RakNetServer.GetConnection(endPoint);

            await using var stream = new MemoryStream(data);
            using var reader       = new BitReader(stream);

            var header = new PacketHeader();

            reader.Read(header);

            if (header.MessageId != MessageIdentifier.UserPacketEnum)
            {
                throw new ArgumentOutOfRangeException($"Packet is not {nameof(MessageIdentifier.UserPacketEnum)}");
            }

            if (header.PacketId == 0x05)
            {
                //
                // Game Message
                //

                var objectId  = reader.Read <long>();
                var messageId = reader.Read <ushort>();

                try
                {
                    if (GameMessageReceived != null)
                    {
                        await GameMessageReceived(objectId, messageId, reader, connection).ConfigureAwait(false);
                    }
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }

                return;
            }

            //
            // Regular Packet
            //

            if (!HandlerMap.TryGetValue(header.RemoteConnectionType, out var temp) ||
                !temp.TryGetValue(header.PacketId, out var handler))
            {
                Logger.Warning($"No handler registered for Packet ({header.RemoteConnectionType}:0x{header.PacketId:x})!");

                return;
            }
            ;

            Logger.Debug($"Received {handler.Packet.GetType().FullName}");

            reader.BaseStream.Position = 8;

            try
            {
                reader.Read(handler.Packet);

                await InvokeHandlerAsync(handler, connection).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Logger.Error(e);
            }
        }
コード例 #9
0
ファイル: Server.cs プロジェクト: DigitalData/Uchu
        public async Task StartAsync(Assembly assembly, bool acceptConsoleCommands = false)
        {
            Logger.Information("Registering assemblies...");

            RegisterAssembly(typeof(Server).Assembly);
            RegisterAssembly(assembly);

            RakNetServer.MessageReceived += HandlePacketAsync;

            Running = true;

            if (acceptConsoleCommands)
            {
                var _ = Task.Run(async() =>
                {
                    Logger.Information($"Ready to accept console command...");

                    while (Running)
                    {
                        var command = Console.ReadLine();

                        if (string.IsNullOrWhiteSpace(command))
                        {
                            continue;
                        }

                        Console.WriteLine(await HandleCommandAsync(command, null, GameMasterLevel.Console).ConfigureAwait(false));
                    }
                });
            }

            try
            {
                Logger.Information("Looking for requests...");

                await using (var ctx = new UchuContext())
                {
                    var request = ctx.WorldServerRequests.FirstOrDefault(w => w.SpecificationId == Id);

                    if (request == default)
                    {
                        Logger.Information($"Starting server...");

                        await RakNetServer.RunAsync().ConfigureAwait(false);

                        return;
                    }

                    Logger.Information($"Request found for {Id}");

                    request.State = WorldServerRequestState.Complete;

                    ctx.SaveChanges();
                }

                Logger.Information($"Starting server...");

                await RakNetServer.RunAsync().ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Logger.Error(e);
            }
        }
コード例 #10
0
 public ServerDisconnectPeerEventArgs(RakNetServer server, RakNetPeer peer) : base(server)
 {
     Peer = peer;
 }
コード例 #11
0
 public RakNetServerEventArgs(RakNetServer server)
 {
     Server = server;
 }
コード例 #12
0
 public ServerPacketHandleEventArgs(RakNetServer server, RakNetPacket packet) : base(server)
 {
     Packet = packet;
 }
コード例 #13
0
 public virtual void Connect(RakNetServer server)
 {
     Server = server;
 }
コード例 #14
0
 private void Init()
 {
     this.server = new RakNetServer(MineNET.Server.ServerConfig.ServerPort);
     this.RegisterPackets();
 }
コード例 #15
0
        internal Connection(IPEndPoint endPoint, RakNetServer server)
        {
            EndPoint = endPoint;

            _server = server;
        }