// Constructor
        public TextEditor2ViewModel(KoreManager kore, KoreFileInfo koreFile)
        {
            _kore    = kore;
            KoreFile = koreFile;

            _adapter     = KoreFile.Adapter as ITextAdapter;
            GameAdapters = _kore.GetAdapters <IGameAdapter>().Select(ga => new GameAdapter(ga)).ToList();

            // TODO: Implement game adapter persistence
            SelectedGameAdapter = GameAdapters.FirstOrDefault();
            SelectedZoomLevel   = 1;

            if (Keyboard.IsKeyDown(Key.LeftShift))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "84D2BD62-7AC6-459B-B3BB-3A65855135F6") ?? GameAdapters.First();
                SelectedZoomLevel   = 2;
            }
            else if (Keyboard.IsKeyDown(Key.LeftAlt))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "B344166C-F1BE-49B2-9ADC-38771D0A15DA") ?? GameAdapters.First();
                SelectedZoomLevel   = 1;
            }

            // Direct entry loading is now dead since GameAdapters have become a thing
            //if (_adapter != null)
            //    Entries = new ObservableCollection<TextEntry>(_adapter.Entries);

            SelectedEntry = Entries?.FirstOrDefault();
        }
Ejemplo n.º 2
0
        private static void LoadGameAdapters()
        {
            var adaptersPath = Path.Combine(Environment.CurrentDirectory, "adapters");

            if (!Directory.Exists(adaptersPath))
            {
                Directory.CreateDirectory(adaptersPath);
            }

            var files = Directory.EnumerateFiles(adaptersPath, "*.dll", SearchOption.TopDirectoryOnly);

            foreach (var file in files)
            {
                var defaultAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(file);
                var exportedTypes   = defaultAssembly.GetExportedTypes();
                foreach (var exportedType in exportedTypes)
                {
                    if (!typeof(IGameAdapter).IsAssignableFrom(exportedType))
                    {
                        continue;
                    }
                    if (exportedType.IsAbstract)
                    {
                        continue;
                    }

                    var gameAdapter = Activator.CreateInstance(exportedType);
                    GameAdapters.Register((IGameAdapter)gameAdapter);
                }
            }
        }
Ejemplo n.º 3
0
        // Constructor
        public TextEditor2ViewModel(PluginManager pluginManager, IStateInfo koreFile)
        {
            _pluginManager = pluginManager;
            KoreFile       = koreFile;

            _state       = KoreFile.PluginState as ITextState;
            GameAdapters = pluginManager.GetGameAdapters().Select(ga => new GameAdapter(ga)).ToList();

            // TODO: Implement game adapter persistence
            SelectedGameAdapter = GameAdapters.FirstOrDefault();
            SelectedZoomLevel   = 1;

            if (Keyboard.IsKeyDown(Key.LeftShift))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.PluginId == Guid.Parse("84D2BD62-7AC6-459B-B3BB-3A65855135F6")) ?? GameAdapters.First();
                SelectedZoomLevel   = 2;
            }
            else if (Keyboard.IsKeyDown(Key.LeftAlt))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.PluginId == Guid.Parse("B344166C-F1BE-49B2-9ADC-38771D0A15DA")) ?? GameAdapters.First();
                SelectedZoomLevel   = 1;
            }

            SelectedEntry = Entries?.FirstOrDefault();
        }
Ejemplo n.º 4
0
        private static void Main(string[] args)
        {
            var currentThread = Thread.CurrentThread;

            currentThread.Name = "Server";

            Logger.Debug("Fetching {0} argument(s)", args.Length);

            var executingAssembly = Assembly.GetExecutingAssembly();
            var assemblyName      = executingAssembly.GetName();

            Console.Title           = assemblyName.Name + " " + assemblyName.Version;
            Console.CancelKeyPress += HandleCancelKeyPressed;

            Logger.Info("Configuring libraries...");
            ConfigureLibraries();

            Logger.Info("Loading game adapters...");
            LoadGameAdapters();
            var serverAdapter = GameAdapters.Lock();

            if (serverAdapter == null)
            {
                Logger.Error("No game adapter found");
                return;
            }

            _server       = new GameServer(serverAdapter);
            Console.Title = _server.Name;

            _server.Start();
        }
Ejemplo n.º 5
0
        // Constructor
        public TextEditor2ViewModel(FileManager fileManager, PluginLoader pluginLoader, KoreFileInfo koreFile)
        {
            _fileManager  = fileManager;
            _pluginLoader = pluginLoader;
            KoreFile      = koreFile;

            _adapter     = KoreFile.Adapter as ITextAdapter;
            GameAdapters = _pluginLoader.GetAdapters <IGameAdapter>().Select(ga => new GameAdapter(ga)).ToList();

            // TODO: Implement game adapter persistence
            SelectedGameAdapter = GameAdapters.FirstOrDefault();
            SelectedZoomLevel   = 1;

            if (Keyboard.IsKeyDown(Key.LeftShift))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "84D2BD62-7AC6-459B-B3BB-3A65855135F6") ?? GameAdapters.First();
                SelectedZoomLevel   = 2;
            }
            else if (Keyboard.IsKeyDown(Key.LeftAlt))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "B344166C-F1BE-49B2-9ADC-38771D0A15DA") ?? GameAdapters.First();
                SelectedZoomLevel   = 1;
            }

            SelectedEntry = Entries?.FirstOrDefault();
        }
Ejemplo n.º 6
0
        public void HandleLoginRequest(string username)
        {
            // "Login request" message already received
            if (_username != null)
            {
                return;
            }

            if (!GameAdapters.IsSupported(NetworkClient.Version.Protocol))
            {
                NetworkClient.Disconnect(new TextComponentString("Unsupported version " + NetworkClient.Version.Protocol)
                {
                    Color = TextColor.Red
                });
                return;
            }

            _username = username;

            using (var rngProvider = new RNGCryptoServiceProvider())
            {
                _signature = new byte[4];
                rngProvider.GetBytes(_signature);
            }

            NetworkClient.Send(new MessageClientEncryptionRequest.Message(
                                   string.Empty,
                                   Cryptography.PublicKey,
                                   _signature
                                   ));
        }
Ejemplo n.º 7
0
     public void HandleHandshake(HandshakeMessage.Message message)
     {
         NetworkClient.Version = GameAdapters.IsSupported(message.Protocol) ? GameAdapters.GetVersion(message.Protocol) : new GameVersion("Unknown", message.Protocol);
         NetworkClient.State   = message.RequestedState switch
         {
             1 => (NetworkState)StatusState.Instance,
             2 => (NetworkState)LoginState.Instance,
             _ => throw new NotSupportedException("Invalid requested state: " + message.RequestedState)
         };
     }
 }
Ejemplo n.º 8
0
        public void LoadChunk(ChunkPosition position)
        {
            if (IsLoaded(position))
            {
                Logger.Warn("Trying to load an already loaded chunk at {0}", position);
                return;
            }

            // TODO use Client's adapter
            var version = GameAdapters.CurrentVersion;
            var adapter = GameAdapters.Resolve(version.Protocol);
            var chunk   = RenderChunk(position, new GlobalBlockPalette(adapter.BlockRegistry));

            _loadedChunks[position] = chunk;
            _client.Connection.LoadChunk(position, chunk);

            ChunkLoaded?.Invoke(this, new ChunkEventArgs(position, chunk));
        }
Ejemplo n.º 9
0
        public void HandleInfoRequest()
        {
            var version = GameAdapters.IsSupported(NetworkClient.Version.Protocol) ? NetworkClient.Version : GameAdapters.CurrentVersion;
            var status  = new ServerStatus(
                version,
                new PlayerInfo(
                    0, 20, new GameProfile[0]
                    ),
                new TextComponentString("Using game adapter ")
            {
                Color    = TextColor.Green,
                Children =
                {
                    new TextComponentString(version.ToString())
                }
            }
                );

            NetworkClient.Send(new MessageClientServerInfo.Message(status));
        }
Ejemplo n.º 10
0
        private void RequestSession(string ip = null)
        {
            var serverHash = Cryptography.GetServerHash(
                EmptyArrays.EmptyBytes,
                _sharedSecret,
                Cryptography.PublicKey
                );

            var urlBuilder = new UriBuilder(HasJoinedUrl);

            var queryString = new NameValueCollection
            {
                ["username"] = _username,
                ["serverId"] = serverHash
            };

            if (ip != null)
            {
                queryString["ip"] = ip;
            }
            urlBuilder.Query = string.Join("&", queryString.AllKeys.Select(key => key + '=' + queryString.Get(key)));

            Logger.Debug("Requesting player profile for user \"{0}\" (query: {1})", _username, urlBuilder.Query);

            HttpClient
            .GetAsync(urlBuilder.Uri)
            .ContinueWith(requestTask =>
            {
                if (requestTask.IsFaulted)
                {
                    throw requestTask.Exception;
                }

                var responseMessage = requestTask.Result;
                if (responseMessage.StatusCode != HttpStatusCode.OK)
                {
                    NetworkClient.Disconnect(new TextComponentTranslate("multiplayer.disconnect.authservers_down")
                    {
                        Color = TextColor.Red
                    });
                    return;
                }

                var httpContent = responseMessage.Content;
                httpContent
                .ReadAsStringAsync()
                .ContinueWith(readTask =>
                {
                    _profile = JsonConvert.DeserializeObject <GameProfile>(readTask.Result);

                    if (!_username.Equals(_profile.Name))
                    {
                        NetworkClient.Disconnect(
                            new TextComponentTranslate("multiplayer.disconnect.unverified_username")
                        {
                            Color = TextColor.Red
                        });
                        return;
                    }

                    Logger.Info("UUID of player {0} is {1}", _profile.Name, _profile.Id);

                    NetworkClient
                    .Send(new MessageClientEnableCompression.Message(CompressionThreshold))
                    .ContinueWith(CheckErrors)
                    .ContinueWith(t1 =>
                    {
                        if (NetworkClient.Closed)             // encryption gone wrong
                        {
                            return;
                        }

                        NetworkClient.EnableCompression(CompressionThreshold);

                        NetworkClient
                        .Send(new MessageClientLoginResponse.Message(
                                  _profile.Id.ToString(),
                                  _profile.Name
                                  ))
                        .ContinueWith(CheckErrors)
                        .ContinueWith(t2 =>
                        {
                            if (NetworkClient.Closed)                 // compression gone wrong
                            {
                                return;
                            }

                            _adapter            = GameAdapters.Resolve(NetworkClient.Version.Protocol);
                            NetworkClient.State = _adapter.NetworkState;
                            NetworkClient.AddTask(FinalizeLogin);
                        });
                    });
                }).ContinueWith(CheckErrors);
            }).ContinueWith(CheckErrors);
        }