예제 #1
0
    public ThinClient()
    {
        m_StateMachine = new StateMachine <ClientState>();
        m_StateMachine.Add(ClientState.Browsing, EnterBrowsingState, UpdateBrowsingState, LeaveBrowsingState);
        m_StateMachine.Add(ClientState.Connecting, EnterConnectingState, UpdateConnectingState, null);
        m_StateMachine.Add(ClientState.Loading, EnterLoadingState, UpdateLoadingState, null);
        m_StateMachine.Add(ClientState.Playing, EnterPlayingState, UpdatePlayingState, LeavePlayingState);
        m_StateMachine.SwitchTo(ClientState.Browsing);

        m_GameWorld = new GameWorld("ClientWorld");

        m_Transport = new SocketTransport();

        m_NetworkClient = new NetworkClient(m_Transport);

        if (Application.isEditor || Game.game.buildId == "AutoBuild")
        {
            NetworkClient.clientVerifyProtocol.Value = "0";
        }

        m_NetworkClient.UpdateClientConfig();
        m_NetworkStatistics = new NetworkStatisticsClient(m_NetworkClient);
        m_ChatSystem        = new ChatSystemClient(m_NetworkClient);

        GameDebug.Log("Network client initialized");

        m_requestedPlayerSettings.playerName = ClientGameLoop.clientPlayerName.Value;
        m_requestedPlayerSettings.teamId     = -1;
    }
예제 #2
0
    public bool Init(string[] args)
    {
        m_StateMachine = new StateMachine <ClientState>();
        m_StateMachine.Add(ClientState.Browsing, EnterBrowsingState, UpdateBrowsingState, LeaveBrowsingState);
        m_StateMachine.Add(ClientState.Connecting, EnterConnectingState, UpdateConnectingState, null);
        m_StateMachine.Add(ClientState.Loading, EnterLoadingState, UpdateLoadingState, null);
        m_StateMachine.Add(ClientState.Playing, EnterPlayingState, UpdatePlayingState, LeavePlayingState);

#if UNITY_EDITOR
        Game.game.levelManager.UnloadLevel();
        World.DisposeAllWorlds();
#endif
        m_GameWorld = new GameWorld("ClientWorld");

        m_NetworkTransport = new SocketTransport();
        m_NetworkClient    = new NetworkClient(m_NetworkTransport);

        if (Application.isEditor || Game.game.buildId == "AutoBuild")
        {
            NetworkClient.clientVerifyProtocol.Value = "0";
        }

        m_NetworkClient.UpdateClientConfig();
        m_NetworkStatistics = new NetworkStatisticsClient(m_NetworkClient);
        m_ChatSystem        = new ChatSystemClient(m_NetworkClient);

        GameDebug.Log("Network client initialized");

        m_requestedPlayerSettings.playerName = clientPlayerName.Value;
        m_requestedPlayerSettings.teamId     = -1;

        Console.AddCommand("disconnect", CmdDisconnect, "Disconnect from server if connected", this.GetHashCode());
        Console.AddCommand("prediction", CmdTogglePrediction, "Toggle prediction", this.GetHashCode());
        Console.AddCommand("runatserver", CmdRunAtServer, "Run command at server", this.GetHashCode());
        Console.AddCommand("respawn", CmdRespawn, "Force a respawn", this.GetHashCode());
        Console.AddCommand("nextchar", CmdNextChar, "Select next character", this.GetHashCode());
        Console.AddCommand("nc", CmdNextChar, "short version of nextchar", this.GetHashCode());
        Console.AddCommand("nextteam", CmdNextTeam, "Select next team", this.GetHashCode());
        Console.AddCommand("spectator", CmdSpectator, "Select spectator cam", this.GetHashCode());
        Console.AddCommand("matchmake", CmdMatchmake, "matchmake <hostname[:port]/{projectid}>: Find and join a server", this.GetHashCode());

        if (args.Length > 0)
        {
            targetServer = args[0];
            m_StateMachine.SwitchTo(ClientState.Connecting);
        }
        else
        {
            m_StateMachine.SwitchTo(ClientState.Browsing);
        }

        GameDebug.Log("Client initialized");

        return(true);
    }
예제 #3
0
    public ThinClient()
    {
        m_StateMachine = new StateMachine <ClientState>();
        m_StateMachine.Add(ClientState.Browsing, EnterBrowsingState, UpdateBrowsingState, LeaveBrowsingState);
        m_StateMachine.Add(ClientState.Connecting, EnterConnectingState, UpdateConnectingState, null);
        m_StateMachine.Add(ClientState.Loading, EnterLoadingState, UpdateLoadingState, null);
        m_StateMachine.Add(ClientState.Playing, EnterPlayingState, UpdatePlayingState, LeavePlayingState);
        m_StateMachine.SwitchTo(m_GameWorld, ClientState.Browsing);

#pragma warning disable 618
        // we're keeping World.Active until we can properly remove them all
        // TODO (timj) not compatible with dots netcode
        m_GameWorld = World.Active;
        World.Active.CreateSystem <GameTimeSystem>();
#pragma warning restore 618



        m_Transport = new SocketTransport();

        m_NetworkClient = new NetworkClient(m_Transport);

        if (Application.isEditor || Game.game.buildId == "AutoBuild")
        {
            NetworkClient.clientVerifyProtocol.Value = "0";
        }

        m_NetworkClient.UpdateClientConfig();
        m_NetworkStatistics = new NetworkStatisticsClient(m_NetworkClient);
        m_ChatSystem        = new ChatSystemClient();

        GameDebug.Log("Network client initialized");

        m_requestedPlayerSettings.playerName = ClientGameLoop.clientPlayerName.Value;
        m_requestedPlayerSettings.teamId     = -1;
    }
예제 #4
0
    public void LateUpdate(ChatSystemClient chatSystem, float frameDuration)
    {
        m_GameWorld.worldTime = m_RenderTime;
        m_HitCollisionModule.StoreColliderState();


        m_ragdollSystem.Update();

        m_TranslateScaleSystem.Schedule();
        var twistSystemHandle = m_TwistSystem.Schedule();

        m_FanSystem.Schedule(twistSystemHandle);



        var  teamId         = -1;
        bool showScorePanel = false;

        if (m_localPlayer != null && m_localPlayer.playerState != null && m_localPlayer.playerState.controlledEntity != Entity.Null)
        {
            teamId = m_localPlayer.playerState.teamIndex;

            if (m_GameWorld.GetEntityManager().HasComponent <CharacterPredictedState>(m_localPlayer.playerState.controlledEntity))
            {
                var character = m_GameWorld.GetEntityManager()
                                .GetComponentObject <Character>(m_localPlayer.playerState.controlledEntity);

                // Only show score board when alive
                showScorePanel = character.healthState.health <= 0;
            }
        }
        // TODO (petera) fix this hack
        chatSystem.UpdateLocalTeamIndex(teamId);


        m_ItemModule.Update();


        m_CharacterModule.CameraUpdate();
        m_PlayerModule.CameraUpdate();

        m_CharacterModule.LateUpdate();

        m_GameWorld.worldTime = m_RenderTime;
        m_ProjectileModule.UpdateClientProjectilesNonPredicted();

        m_GameWorld.worldTime = m_PredictedTime;
        m_ProjectileModule.UpdateClientProjectilesPredicted();

        m_ApplyGrenadePresentation.Update();

        m_EffectModule.ClientUpdate();

        m_UpdateNamePlates.Update();

        m_ClientFrontendUpdate.Update();
        Game.game.clientFrontend.SetShowScorePanel(showScorePanel);

        m_DebugPrimitiveModule.DrawPrimitives();

        m_TranslateScaleSystem.Complete();
        m_FanSystem.Complete();
    }
예제 #5
0
    public void Tick(ChatSystemClient chatSystem)
    {
        // Handle outgoing messages
        foreach (var l in m_ChatLinesToSend)
        {
            if (chatSystem != null)
            {
                chatSystem.SendMessage(l);
            }
            else
            {
                AddLine(l);
            }
        }
        m_ChatLinesToSend.Clear();

        // Handle incoming messages
        if (chatSystem != null)
        {
            while (chatSystem.incomingMessages.Count > 0)
            {
                var message = chatSystem.incomingMessages.Dequeue();
                AddLine(message);
            }
        }

        if (m_MoveToEnd)
        {
            field.MoveTextEnd(true);
            m_MoveToEnd = false;
        }
        if (!m_IsOpen && GatedInput.GetKeyDown(activationKey))
        {
            field.textComponent.enabled = true;
            field.interactable          = true;

            field.ActivateInputField();
            m_MoveToEnd = true;

            m_IsOpen = true;
            GatedInput.SetBlock(GatedInput.Blocker.Chat, true);

            FadeBackgrounds(1.0f, 0.2f);

            foreach (var line in m_Lines)
            {
                line.Show();
            }
        }
        else if (m_IsOpen && !field.isFocused)
        {
            m_IsOpen = false;
            GatedInput.SetBlock(GatedInput.Blocker.Chat, false);
            field.interactable = false;

            FadeBackgrounds(0.0f, 0.7f);

            foreach (var line in m_Lines)
            {
                line.changeTime = Time.time;
            }
        }
        else if (m_IsOpen && Input.GetKeyDown(KeyCode.Tab))
        {
            var text = field.text;
            for (int i = 0, l = messagePrefixes.Length; i < l; ++i)
            {
                var prefixMatch = text.PrefixMatch(messagePrefixes[i]);
                if (prefixMatch > 1)
                {
                    var oldCaretReverse = field.text.Length - field.caretPosition;
                    defaultPrefix       = messagePrefixes[(i + 1) % l];
                    field.text          = defaultPrefix + text.Substring(prefixMatch);
                    field.caretPosition = field.text.Length - oldCaretReverse;
                    break;
                }
            }
        }

        if (!m_IsOpen)
        {
            // Fade out old lines
            foreach (var line in m_Lines)
            {
                if (Time.time - line.changeTime > 4.0f)
                {
                    line.Hide();
                }
            }
            field.textComponent.enabled = false;
        }
    }
예제 #6
0
 public void UpdateChat(ChatSystemClient chatSystem)
 {
     chatPanel.Tick(chatSystem);
 }
예제 #7
0
    public bool Init(string[] args)
    {
        m_StateMachine = new StateMachine <ClientState>();
        m_StateMachine.Add(ClientState.Browsing, EnterBrowsingState, UpdateBrowsingState, LeaveBrowsingState);
        m_StateMachine.Add(ClientState.Connecting, EnterConnectingState, UpdateConnectingState, null);
        m_StateMachine.Add(ClientState.Loading, EnterLoadingState, UpdateLoadingState, null);
        m_StateMachine.Add(ClientState.Playing, EnterPlayingState, UpdatePlayingState, LeavePlayingState);

#if UNITY_EDITOR
        Game.game.levelManager.UnloadLevel();
#endif
        m_GameWorld = new GameWorld("ClientWorld");

        m_NetworkTransport = new SocketTransport();
        m_NetworkClient    = new NetworkClient(m_NetworkTransport);

        if (Application.isEditor || Game.game.buildId == "AutoBuild")
        {
            NetworkClient.clientVerifyProtocol.Value = "0";
        }

        m_NetworkClient.UpdateClientConfig();
        m_NetworkStatistics = new NetworkStatisticsClient(m_NetworkClient);
        m_ChatSystem        = new ChatSystemClient(m_NetworkClient);

        GameDebug.Log("Network client initialized");

        m_requestedPlayerSettings.playerName = clientPlayerName.Value;
        m_requestedPlayerSettings.teamId     = -1;

        Console.AddCommand("disconnect", CmdDisconnect, "Disconnect from server if connected", this.GetHashCode());
        Console.AddCommand("prediction", CmdTogglePrediction, "Toggle prediction", this.GetHashCode());
        Console.AddCommand("runatserver", CmdRunAtServer, "Run command at server", this.GetHashCode());
        Console.AddCommand("respawn", CmdRespawn, "Force a respawn", this.GetHashCode());
        Console.AddCommand("nextchar", CmdNextChar, "Select next character", this.GetHashCode());
        Console.AddCommand("nextteam", CmdNextTeam, "Select next character", this.GetHashCode());
        Console.AddCommand("spectator", CmdSpectator, "Select spectator cam", this.GetHashCode());
        Console.AddCommand("matchmake", CmdMatchmake, "matchmake <hostname[:port]/{projectid}>: Find and join a server", this.GetHashCode());

        if (args.Length > 0)
        {
            targetServer = args[0];
            m_StateMachine.SwitchTo(ClientState.Connecting);
        }
        else
        {
            m_StateMachine.SwitchTo(ClientState.Browsing);
        }

        ReplicatedPrefabMgr.Initialize();

        ClientServerSystemManager.InitClientSystems();
        World.Active.GetExistingSystem <TickClientSimulationSystem>().Enabled   = true;
        World.Active.GetExistingSystem <TickClientPresentationSystem>().Enabled = true;
        Unity.Networking.Transport.NetworkEndPoint ep = Unity.Networking.Transport.NetworkEndPoint.Parse(targetServer, (ushort)NetworkConfig.netcodeServerPort);
        World         clientWorld = ClientServerSystemManager.clientWorld;
        EntityManager em          = clientWorld.EntityManager;
        Entity        ent         = clientWorld.GetExistingSystem <NetworkStreamReceiveSystem>().Connect(ep);
        em.AddComponentData(ent, new NetworkStreamInGame());

        GameDebug.Log("Client initialized");

        return(true);
    }
예제 #8
0
 public void LateUpdate(ChatSystemClient chatSystem, float frameDuration)
 {
 }