internal static void PlayCardCallback(object[] data)
    {
        string who = (string)data[0];
        PlayerObjectBehaviour forPlayer = LocalPlayer;

        if (who.Equals(EnemyPlayer.PlayerName))
        {
            forPlayer = EnemyPlayer;
        }
        int guid = (int)data[1];
        int mana = (int)data[2];
        CardObjectBehaviour cob = CardObjectBehaviour.GetCOB(guid);

        forPlayer.Hob.RemoveCard(cob.gameObject);
        forPlayer.UpdateMana(mana);
        cob.gameObject.GetComponent <DragHandCard>().CanDrag = false;

        cob.AddDoTweens(() =>
        {
            // Move card to neutral position and play effects
            Vector3 spellEffectPos = NeutralBattlePoint.transform.position;
            cob.AddEffectParticle();
            cob.SetTweening(true);
            Sequence s = DOTween.Sequence();
            s.Insert(0f, cob.gameObject.transform.DOMove(new Vector3(spellEffectPos.x, spellEffectPos.y, -3f), GameConfig.F("SPELL_CARD_FLY_TIME")));
            s.Insert(0f, cob.gameObject.transform.DOScale(GameConfig.F("SPELL_CARD_SCALE"), GameConfig.F("SPELL_CARD_FLY_TIME")));
            s.AppendInterval(GameConfig.F("SPELL_CARD_FLY_TIME") + GameConfig.F("SPELL_CARD_DISPLAY_TIME"));
            s.OnComplete(() =>
            {
                cob.SetTweening(false);
            });
        });
    }
    internal static void UpdatePlayerMana(object[] data)
    {
        string who  = (string)data[0];
        int    mana = (int)data[1];
        PlayerObjectBehaviour forPlayer = LocalPlayer;

        if (who.Equals(EnemyPlayer.PlayerName))
        {
            forPlayer = EnemyPlayer;
        }
        forPlayer.UpdateMana(mana);
    }
    internal static void FirstLoadDataCallback(object[] data)
    {
        JSONObject firstLoadData = (JSONObject)data[0];

        JSONObject p1     = firstLoadData.GetField("players").GetField("p1");
        string     p1Name = p1.GetField("name").str;
        int        p1Hp   = (int)p1.GetField("hp").n;
        int        p1Mp   = (int)p1.GetField("mp").n;

        JSONObject p2     = firstLoadData.GetField("players").GetField("p2");
        string     p2Name = p2.GetField("name").str;
        int        p2Hp   = (int)p2.GetField("hp").n;
        int        p2Mp   = (int)p2.GetField("mp").n;

        if (p1Name.Equals(LocalPlayerName))
        {
            LocalPlayer.PlayerName = p1Name;
            LocalPlayer.UpdateHealth(p1Hp);
            LocalPlayer.UpdateMana(p1Mp);

            EnemyPlayer.PlayerName = p2Name;
            EnemyPlayer.UpdateHealth(p2Hp);
            EnemyPlayer.UpdateMana(p2Mp);
        }
        else if (p2Name.Equals(LocalPlayerName))
        {
            EnemyPlayer.PlayerName = p1Name;
            EnemyPlayer.UpdateHealth(p1Hp);
            EnemyPlayer.UpdateMana(p1Mp);

            LocalPlayer.PlayerName = p2Name;
            LocalPlayer.UpdateHealth(p2Hp);
            LocalPlayer.UpdateMana(p2Mp);
        }
        else
        {
            throw new Exception("[UpdateStartUI]Neither player name match local names");
        }
    }