Ejemplo n.º 1
0
        private void UnregisterClient(Guid clientId)
        {
            m_registeredClients.Remove(clientId);

            Dictionary <Guid, Player> disconnectedPlayers;

            if (m_clientIdToPlayers.TryGetValue(clientId, out disconnectedPlayers))
            {
                foreach (Guid playerId in disconnectedPlayers.Keys)
                {
                    int playerIndex = m_room.Players.IndexOf(playerId);

                    Cmd cmd = new Cmd(CmdCode.LeaveRoom, -1);

                    if (m_initialized)
                    {
                        m_engine.Submit(playerIndex, cmd);
                    }
                    else
                    {
                        m_preInitCommands.Enqueue(new PlayerCmd(playerIndex, cmd));
                    }

                    m_playerToClientId.Remove(playerId);
                }

                m_readyToPlayClients.Remove(clientId);
                m_clientIdToPlayers.Remove(clientId);
            }
        }
Ejemplo n.º 2
0
 public virtual void Tick(IMatchEngine engine, long tick)
 {
     while (m_ticks.Count > 0 && m_ticks.Peek() == tick)
     {
         Cmd cmd         = m_commands.Dequeue();
         int playerIndex = m_playerIndices.Dequeue();
         m_ticks.Dequeue();
         engine.Submit(playerIndex, cmd);
     }
 }
Ejemplo n.º 3
0
        public void Submit(Guid clientId, int playerIndex, Cmd cmd, ServerEventHandler <Cmd> callback)
        {
            cmd = m_serializer.DeepClone(cmd);

            Error error = new Error();

            error.Code = StatusCode.OK;

            if (cmd.Code == CmdCode.LeaveRoom)
            {
                error.Code    = StatusCode.NotAllowed;
                error.Message = "Use LeaveRoom method instead";
            }
            else
            {
                if (!m_initialized)
                {
                    error.Code    = StatusCode.NotAllowed;
                    error.Message = "Match is not initialized";
                }
                else if (!enabled)
                {
                    error.Code    = StatusCode.Paused;
                    error.Message = "Match is paused";
                }
                else
                {
                    m_replay.Record(playerIndex, cmd, m_tick);
                    m_engine.Submit(playerIndex, cmd); // if I will use RTT Ticks then it will be possible to reverse order of commands sent by client (which is BAD!)
                }
            }

            if (m_lag == 0)
            {
                callback(error, cmd);
            }
            else
            {
                m_job.Submit(() => { Thread.Sleep(m_lag); return(null); }, result => callback(error, cmd));
            }
        }