Exemplo n.º 1
0
        public ClientManager(
            NetClient netClient,
            ServerManager serverManager,
            PacketManager packetManager,
            UiManager uiManager,
            Settings.GameSettings gameSettings,
            ModSettings modSettings
            )
        {
            _netClient     = netClient;
            _serverManager = serverManager;
            _uiManager     = uiManager;
            _gameSettings  = gameSettings;
            _modSettings   = modSettings;

            _playerData = new Dictionary <ushort, ClientPlayerData>();

            _playerManager    = new PlayerManager(packetManager, gameSettings, _playerData);
            _animationManager = new AnimationManager(netClient, _playerManager, packetManager, gameSettings);
            _mapManager       = new MapManager(netClient, gameSettings);

            _entityManager = new EntityManager(netClient);

            new PauseManager(netClient).RegisterHooks();

            _commandManager = new ClientCommandManager();
            var eventAggregator = new EventAggregator();

            RegisterCommands();

            var clientApi = new ClientApi(this, _commandManager, uiManager, netClient, eventAggregator);

            _addonManager = new ClientAddonManager(clientApi);

            ModHooks.FinishedLoadingModsHook += _addonManager.LoadAddons;

            // Check if there is a valid authentication key and if not, generate a new one
            if (!AuthUtil.IsValidAuthKey(modSettings.AuthKey))
            {
                modSettings.AuthKey = AuthUtil.GenerateAuthKey();
            }

            // Then authorize the key on the locally hosted server
            serverManager.AuthorizeKey(modSettings.AuthKey);

            // Register packet handlers
            packetManager.RegisterClientPacketHandler <HelloClient>(ClientPacketId.HelloClient, OnHelloClient);
            packetManager.RegisterClientPacketHandler <ServerClientDisconnect>(ClientPacketId.ServerClientDisconnect,
                                                                               OnDisconnect);
            packetManager.RegisterClientPacketHandler <PlayerConnect>(ClientPacketId.PlayerConnect, OnPlayerConnect);
            packetManager.RegisterClientPacketHandler <ClientPlayerDisconnect>(ClientPacketId.PlayerDisconnect,
                                                                               OnPlayerDisconnect);
            packetManager.RegisterClientPacketHandler <ClientPlayerEnterScene>(ClientPacketId.PlayerEnterScene,
                                                                               OnPlayerEnterScene);
            packetManager.RegisterClientPacketHandler <ClientPlayerAlreadyInScene>(ClientPacketId.PlayerAlreadyInScene,
                                                                                   OnPlayerAlreadyInScene);
            packetManager.RegisterClientPacketHandler <GenericClientData>(ClientPacketId.PlayerLeaveScene,
                                                                          OnPlayerLeaveScene);
            packetManager.RegisterClientPacketHandler <PlayerUpdate>(ClientPacketId.PlayerUpdate, OnPlayerUpdate);
            packetManager.RegisterClientPacketHandler <EntityUpdate>(ClientPacketId.EntityUpdate, OnEntityUpdate);
            packetManager.RegisterClientPacketHandler <GameSettingsUpdate>(ClientPacketId.GameSettingsUpdated,
                                                                           OnGameSettingsUpdated);
            packetManager.RegisterClientPacketHandler <ChatMessage>(ClientPacketId.ChatMessage, OnChatMessage);

            // Register handlers for events from UI
            uiManager.ConnectInterface.ConnectButtonPressed     += Connect;
            uiManager.ConnectInterface.DisconnectButtonPressed  += () => Disconnect();
            uiManager.SettingsInterface.OnTeamRadioButtonChange += InternalChangeTeam;
            uiManager.SettingsInterface.OnSkinIdChange          += InternalChangeSkin;

            UiManager.InternalChatBox.ChatInputEvent += OnChatInput;

            netClient.ConnectEvent       += response => uiManager.OnSuccessfulConnect();
            netClient.ConnectFailedEvent += uiManager.OnFailedConnect;

            // Register the Hero Controller Start, which is when the local player spawns
            On.HeroController.Start += (orig, self) => {
                // Execute the original method
                orig(self);
                // If we are connect to a server, add a username to the player object
                if (netClient.IsConnected)
                {
                    _playerManager.AddNameToPlayer(
                        HeroController.instance.gameObject,
                        _username,
                        _playerManager.LocalPlayerTeam
                        );
                }
            };

            // Register handlers for scene change and player update
            UnityEngine.SceneManagement.SceneManager.activeSceneChanged += OnSceneChange;
            On.HeroController.Update += OnPlayerUpdate;

            // Register client connect and timeout handler
            netClient.ConnectEvent += OnClientConnect;
            netClient.TimeoutEvent += OnTimeout;

            // Register application quit handler
            ModHooks.ApplicationQuitHook += OnApplicationQuit;
        }