public void OnNotify(Firebase.Database.DataSnapshot dataSnapShot)
    {
        try {
            Dictionary <string, System.Object> rpcReceive = (Dictionary <string, System.Object>)dataSnapShot.Value;
            if (rpcReceive.ContainsKey(MyConst.RPC_DATA_PARAM))
            {
                bool userHome = (bool)rpcReceive [MyConst.RPC_DATA_USERHOME];

                Dictionary <string, System.Object> param = (Dictionary <string, System.Object>)rpcReceive [MyConst.RPC_DATA_PARAM];
                if (param.ContainsKey(MyConst.RPC_DATA_CHARACTER))
                {
                    CharacterModelList     characterList         = JsonUtility.FromJson <CharacterModelList> (param [MyConst.RPC_DATA_CHARACTER].ToString());
                    Queue <CharacterModel> characterReceiveQueue = new Queue <CharacterModel> ();

                    for (int i = 0; i < characterList.list.Count; i++)
                    {
                        if (characterList.list [i].iD != 0)
                        {
                            characterReceiveQueue.Enqueue(characterList.list [i]);
                        }
                    }


                    if (characterReceiveQueue.Count > 0)
                    {
                        if (userHome.Equals(GameManager.isHost))
                        {
                            playerCharacterQueue = characterReceiveQueue;
                        }
                        else
                        {
                            enemyCharacterQueue = characterReceiveQueue;
                        }
                    }

                    BattleManager.CountCharacters();
                }
            }
        } catch (System.Exception e) {
            //do something with exception in future
        }
    }
    //send characters used to firebase
    public static void StartCharacters()
    {
        List <CharacterModel> charactersToSend = new List <CharacterModel> ();
        Dictionary <int, int> result           = new Dictionary <int, int> ();

        for (int i = 0; i < currentCharacterInEquip.Length; i++)
        {
            //if gp is enough, send character to firebase and remove from equip
            PlayerManager.SetIsPlayer(true);
            bool isCardValid = false;


            ScreenBattleController.Instance.partCharacter.GetCharCards() [i].CheckCard(delegate(bool arg1, int arg2) {
                if (arg1)
                {
                    isCardValid = true;
                    result.Add(arg2, i);
                }
                else
                {
                    isCardValid = false;
                }
            });

            if (isCardValid == false)
            {
                continue;
            }
        }

        //sort result according to priority number of character in equip
        if (result.Count > 0)
        {
            var list = result.Keys.ToList();
            list.Sort();

            foreach (var key in list)
            {
                if (PlayerManager.Player.gp >= currentCharacterInEquip [result[key]].gpCost)
                {
                    Debug.Log("SENDING TO FIREBASE CHARACTER " + currentCharacterInEquip [result[key]].name);
                    PlayerManager.Player.gp -= currentCharacterInEquip [result[key]].gpCost;
                    charactersToSend.Add(currentCharacterInEquip [result[key]]);
                    ActivateCharacterUI(result[key]);
                    PlayerManager.UpdateStateUI(true);
                }
                else
                {
                    Debug.Log("NOT ENOUGH GP FOR CHARACTER " + currentCharacterInEquip [result[key]].name);
                }
            }
        }



        CharacterModelList characterList = new CharacterModelList();

        characterList.list = charactersToSend;

        SystemFirebaseDBController.Instance.SetParam(MyConst.RPC_DATA_CHARACTER, (characterList));

        //reset card used effect
        for (int i = 0; i < ScreenBattleController.Instance.partCharacter.GetCharCards().Length; i++)
        {
            ScreenBattleController.Instance.partCharacter.GetCharCards() [i].ResetCardUsed();
        }
    }