public void ReplaceNormalAttackControl(MatchDataNormalAttackControl newValue)
    {
        var index     = GameComponentsLookup.NormalAttackControl;
        var component = (NormalAttackControlComponent)CreateComponent(index, typeof(NormalAttackControlComponent));

        component.value = newValue;
        ReplaceComponent(index, component);
    }
    public void Execute()
    {
        if (_context.hasBattleOver)
        {
            return;
        }

        if (_context.currentScene.name != "BattleScene")
        {
            return;
        }
        if (_context.isReplaying)
        {
            return;
        }
        if (_context.key.value.TaijutsuAttack)
        {
            if (_context.isTaijutsuAttackFreezing)
            {
                return;
            }
            _context.isTaijutsuAttackFreezing = true;

            var currentPlayer = _context.GetEntityWithId(_context.currentPlayerId.value);
            if (currentPlayer == null)
            {
                return;
            }
            if (currentPlayer.isDead)
            {
                return;
            }
            if (!currentPlayer.onTheGround.value || currentPlayer.isJumping || currentPlayer.isMakingYin)
            {
                return;
            }

            if (!currentPlayer.isNormalAttacking)
            {
                if (currentPlayer.hasCurrentWeapon)
                {
//                    currentPlayer.ReplaceAnimation("attack_" + _context.characterBaseAttributes.dic[currentPlayer.name.text].taijutsuAttackWithWeapon, false);
                    var newNormalAttack = new MatchDataNormalAttackControl
                    {
                        matchId     = _context.currentMatchData.value.customMatchId,
                        userId      = _context.currentPlayerId.value,
                        position    = currentPlayer.position.value,
                        attackIndex = _context.characterBaseAttributes.dic[currentPlayer.name.text]
                                      .taijutsuAttackWithWeapon,
                        immediately = true
                    };
                    _context.CreateEntity().ReplaceSendMatchData(1004, Utilities.ToJson(newNormalAttack));
                }
                else
                {
                    var newNormalAttack = new MatchDataNormalAttackControl
                    {
                        matchId     = _context.currentMatchData.value.customMatchId,
                        userId      = _context.currentPlayerId.value,
                        position    = currentPlayer.position.value,
                        attackIndex = 1,
                        immediately = true
                    };
                    _context.CreateEntity().ReplaceSendMatchData(1004, Utilities.ToJson(newNormalAttack));
                }
            }
            else
            {
                if (currentPlayer.hasCurrentWeapon)
                {
                    return;
                }

                var currentAttackAnimationName = currentPlayer.animation.name;
                if (!currentAttackAnimationName.StartsWith("attack_"))
                {
                    return;
                }

                var _index             = currentAttackAnimationName.LastIndexOf('_');
                var currentAttackIndex = int.Parse(currentAttackAnimationName.Substring(_index + 1));

                if (currentAttackIndex >= _context.characterBaseAttributes.dic[currentPlayer.name.text].taijutsuAttackNum)
                {
                    return;
                }

                var newNormalAttack = new MatchDataNormalAttackControl
                {
                    matchId     = _context.currentMatchData.value.customMatchId,
                    userId      = _context.currentPlayerId.value,
                    position    = currentPlayer.position.value,
                    attackIndex = currentAttackIndex + 1,
                    immediately = false
                };
                _context.CreateEntity().ReplaceSendMatchData(1004, Utilities.ToJson(newNormalAttack));
                //                currentPlayer.ReplaceNextAnimation("attack_" + (currentAttackIndex + 1), false);
            }
        }
        else
        {
            if (_context.isTaijutsuAttackFreezing)
            {
                _context.isTaijutsuAttackFreezing = false;
            }
        }
    }