// -------------------------------------------

        /*
         * Set a binary data from a client
         */
        public void SetBinaryDataFromClientsToServer(int _idConnection, byte[] _binaryData)
        {
            PlayerConnectionData playerConnection = GetConnection((int)_idConnection);

            if (playerConnection != null)
            {
                playerConnection.SetBinaryData(_binaryData);
            }
        }
        // -------------------------------------------

        /*
         * A message from the clients has been received
         */
        public void MessageFromClientsToServer(int _idConnection, string _messageData)
        {
            PlayerConnectionData playerConnection = GetConnection(_idConnection);

            if (playerConnection != null)
            {
                Debug.Log("PlayersConnectionController::MessageFromClients::MESSAGE FROM CLIENT[" + _idConnection + "]=" + _messageData);
                Dictionary <string, object> message = DeserializeJSON(_messageData);
                playerConnection.PushMessage(message);
                m_displayMessages.Add(message);
                UIEventController.Instance.DispatchUIEvent(UIEventController.EVENT_SCREENMAINCOMMANDCENTER_REGISTER_LOG, _messageData);
            }
        }
        // -------------------------------------------

        /*
         * New client has been connected
         */
        public void ClientNewConnection(int _idConnection, GameObject _reference)
        {
            PlayerConnectionData newPlayerConnectionData = new PlayerConnectionData(_idConnection, _reference);

            if (!m_playersConnections.Contains(newPlayerConnectionData))
            {
                m_playersConnections.Add(newPlayerConnectionData);
                m_currentProcessedClient = 0;
                string eventConnected = CreateJSONMessage(_idConnection, MESSAGE_TYPE_NEW_CONNECTION);
                m_displayMessages.Add(DeserializeJSON(eventConnected));
                Debug.Log(eventConnected);
                UIEventController.Instance.DispatchUIEvent(UIEventController.EVENT_SCREENMAINCOMMANDCENTER_LIST_USERS, m_playersConnections);
                UIEventController.Instance.DispatchUIEvent(UIEventController.EVENT_SCREENMAINCOMMANDCENTER_REGISTER_LOG, eventConnected);
            }
        }
        // -------------------------------------------

        /*
         * New client has been connected
         */
        public bool ClientNewConnection(int _idConnection)
        {
            PlayerConnectionData newPlayerConnection = new PlayerConnectionData(_idConnection, null);

            if (!m_playersConnections.Contains(newPlayerConnection))
            {
                m_playersConnections.Add(newPlayerConnection);
                string eventConnected = CommunicationsController.CreateJSONMessage(_idConnection, CommunicationsController.MESSAGE_TYPE_NEW_CONNECTION);
                Debug.Log(eventConnected);
                UIEventController.Instance.DispatchUIEvent(UIEventController.EVENT_SCREENMAINCOMMANDCENTER_LIST_USERS, m_playersConnections);
                UIEventController.Instance.DispatchUIEvent(UIEventController.EVENT_SCREENMAINCOMMANDCENTER_REGISTER_LOG, eventConnected);
                return(true);
            }
            else
            {
                return(false);
            }
        }
        // -------------------------------------------

        /*
         * Process a single message
         */
        private void ProcessMessage(Dictionary <string, object> _message)
        {
            long   networkOriginId = (long)_message[DATAFIELD_UID];
            string typeMessage     = (string)_message[DATAFIELD_TYPE];

            switch (typeMessage)
            {
            case MESSAGE_TYPE_INFORMATION:
                string dataInformationMessage = _message[DATAFIELD_DATA].ToString();
                Debug.Log("MESSAGE_TYPE_INFORMATION::FROM[" + networkOriginId + "];DATA=" + dataInformationMessage);
                break;

            case MESSAGE_TYPE_REGISTER_PREFAB:
                if (!m_isServer)
                {
                    Debug.Log("MESSAGE_TYPE_REGISTER_PREFAB::FROM[" + networkOriginId + "];DATA=" + _message[DATAFIELD_DATA].ToString());
                    string[] prefabData = _message[DATAFIELD_DATA].ToString().Split(new string[] { TOKEN_PARAMETER_SEPARATOR }, StringSplitOptions.None);
                    NetworkEventController.Instance.DispatchLocalEvent(NetworkEventController.EVENT_COMMUNICATIONSCONTROLLER_REGISTER_PREFAB, prefabData[0], int.Parse(prefabData[1]));
                }
                break;

            case MESSAGE_TYPE_CREATE_OBJECT:
                if (m_isServer)
                {
                    string[] objectData   = _message[DATAFIELD_DATA].ToString().Split(new string[] { TOKEN_PARAMETER_SEPARATOR }, StringSplitOptions.None);
                    string[] positionData = _message[DATAFIELD_POSITION].ToString().Split(new string[] { TOKEN_PARAMETER_SEPARATOR }, StringSplitOptions.None);
                    Vector3  position     = new Vector3(float.Parse(positionData[0]), float.Parse(positionData[1]), float.Parse(positionData[2]));
                    NetworkEventController.Instance.DispatchLocalEvent(NetworkEventController.EVENT_COMMUNICATIONSCONTROLLER_REQUEST_TO_CREATE_NETWORK_OBJECT, objectData[0], objectData[1], objectData[2], position, objectData[3], bool.Parse(objectData[4]), bool.Parse(objectData[5]));
                }
                break;

            case MESSAGE_TYPE_IP_ADDRESS:
                if (m_isServer)
                {
                    PlayerConnectionData client = GetConnection((int)networkOriginId);
                    if (client != null)
                    {
                        /*
                         *                          for (int i = 0; i < NetworkServer.connections.Count; i ++)
                         *                          {
                         *                                  Debug.Log("NetworkServer.connections["+i+"]=" + NetworkServer.connections[i].address);
                         *                          }
                         */
#if !DISABLE_UNET_COMMS && !ENABLE_MIRROR
                        string ip4 = NetworkServer.connections[NetworkServer.connections.Count - 1].address;
                        client.NetworkAddress = ip4.Substring(ip4.LastIndexOf(':') + 1, ip4.Length - ip4.LastIndexOf(':') - 1);
                        Debug.Log("NETWORK ADDRESS RECEIVED::client.NetworkAddress=" + client.NetworkAddress);
#endif
                    }
                }
                break;

            case MESSAGE_TYPE_EVENT:
                string   nameEvent          = _message[DATAFIELD_EVENT].ToString();
                int      idOriginConnection = int.Parse(_message[DATAFIELD_ORIGIN_ID].ToString());
                int      idTargetConnection = int.Parse(_message[DATAFIELD_TARGET_ID].ToString());
                string[] dataEvent          = _message[DATAFIELD_DATA].ToString().Split(new string[] { TOKEN_PARAMETER_SEPARATOR }, StringSplitOptions.None);

                // IF OTHER MACHINES, DISPATCH EVENT LOCALLY
                if ((m_networkID != idOriginConnection) &&                                                               // NOT ORIGIN
                    ((idTargetConnection == -1) || ((idTargetConnection != -1) && (m_networkID == idTargetConnection)))) // IS TARGET OR IT'S FOR ALL
                {
                    NetworkEventController.Instance.DispatchCustomNetworkEvent(nameEvent, true, idOriginConnection, idTargetConnection, dataEvent);
                }

                // IF SERVER, BROADCAST RECEIVED MESSAGE ON ALL THE CLIENTS
                if (m_isServer)
                {
                    string messageNetworkEvent = MessageEvent(m_networkID, nameEvent, idOriginConnection, idTargetConnection, dataEvent);
                    if (messageNetworkEvent != null)
                    {
                        NetworkEventController.Instance.DispatchLocalEvent(NetworkEventController.EVENT_PLAYERCONNECTIONCONTROLLER_RPC_MESSAGE, idTargetConnection, idOriginConnection, messageNetworkEvent);
                    }
                }
                break;
            }
        }