public override void Update(IM.Number fDeltaTime)
    {
        base.Update(fDeltaTime);

        if (m_player.m_defenseTarget != null)
        {
            if (m_player.m_AOD.GetStateByPos(m_player.m_defenseTarget.position) != AOD.Zone.eInvalid)
            {
                bool crossed = false;
                if (m_player.m_defenseTarget.moveDirection != IM.Vector3.zero)
                {
                    IM.Number angle = IM.Vector3.FromToAngle(dirToBasket, m_player.m_defenseTarget.moveDirection);
                    if (new IM.Number(45) < angle && angle < new IM.Number(135) && isTurnLeft)
                    {
                        crossed = true;
                    }
                    else if (new IM.Number(225) < angle && angle < new IM.Number(315) && !isTurnLeft)
                    {
                        crossed = true;
                    }
                }
                if (crossed)
                {
                    PlayerState_Crossed state = m_player.m_defenseTarget.m_StateMachine.GetState(PlayerState.State.eCrossed) as PlayerState_Crossed;
                    state.left       = !isTurnLeft;
                    state.m_animType = state.left ? AnimType.N_TYPE_0 : AnimType.N_TYPE_1;
                    m_player.m_defenseTarget.m_StateMachine.SetState(state);
                }
            }
        }
    }
    static int OnEnter(IntPtr L)
    {
        LuaScriptMgr.CheckArgsCount(L, 2);
        PlayerState_Crossed obj  = (PlayerState_Crossed)LuaScriptMgr.GetNetObjectSelf(L, 1, "PlayerState_Crossed");
        PlayerState         arg0 = (PlayerState)LuaScriptMgr.GetNetObject(L, 2, typeof(PlayerState));

        obj.OnEnter(arg0);
        return(0);
    }
    static int _CreatePlayerState_Crossed(IntPtr L)
    {
        int count = LuaDLL.lua_gettop(L);

        if (count == 2)
        {
            PlayerStateMachine  arg0 = (PlayerStateMachine)LuaScriptMgr.GetNetObject(L, 1, typeof(PlayerStateMachine));
            GameMatch           arg1 = (GameMatch)LuaScriptMgr.GetNetObject(L, 2, typeof(GameMatch));
            PlayerState_Crossed obj  = new PlayerState_Crossed(arg0, arg1);
            LuaScriptMgr.PushObject(L, obj);
            return(1);
        }
        else
        {
            LuaDLL.luaL_error(L, "invalid arguments to method: PlayerState_Crossed.New");
        }

        return(0);
    }
    static int set_left(IntPtr L)
    {
        object o = LuaScriptMgr.GetLuaObject(L, 1);
        PlayerState_Crossed obj = (PlayerState_Crossed)o;

        if (obj == null)
        {
            LuaTypes types = LuaDLL.lua_type(L, 1);

            if (types == LuaTypes.LUA_TTABLE)
            {
                LuaDLL.luaL_error(L, "unknown member name left");
            }
            else
            {
                LuaDLL.luaL_error(L, "attempt to index left on a nil value");
            }
        }

        obj.left = LuaScriptMgr.GetBoolean(L, 3);
        return(0);
    }
    public override void Update(IM.Number fDeltaTime)
    {
        base.Update(fDeltaTime);

        m_player.m_blockable.Update(m_time);

        if (m_player.m_blockable.tooEarly)
        {
            return;
        }

        if (!m_bDefenderOp)
        {
            Player defender = m_player.m_defenseTarget;
            if (m_player.m_blockable.blockable && !m_bChecked)
            {
                if (_ValidDefender(defender) && defender.m_curInputDir != -1)
                {
                    IM.Vector3 vDefenderDir = IM.Quaternion.Euler(IM.Number.zero, defender.m_curInputDir * MoveController.ANGLE_PER_DIR, IM.Number.zero) * IM.Vector3.forward;
                    IM.Number  fAngleToDir  = IM.Vector3.Angle(vDefenderDir, m_crossDir == CrossDir.Left ?m_player.right : -m_player.right);
                    bool       bMiss        = fAngleToDir < new IM.Number(90);
                    if (bMiss)
                    {
                        PlayerState_Crossed state = defender.m_StateMachine.GetState(State.eCrossed) as PlayerState_Crossed;
                        state.left       = (m_crossDir == CrossDir.Right);
                        state.m_animType = state.left ? AnimType.N_TYPE_0 : AnimType.N_TYPE_1;
                        defender.m_StateMachine.SetState(state);
                        ++m_player.mStatistics.data.success_cross_times;
                        m_player.mStatistics.SkillUsageSuccess(m_curExecSkill.skill.id, true);

                        m_bDefenderOp = true;
                    }
                    else if (m_match.AdjustCrossRate(m_player, defender, IM.Number.zero) != IM.Number.one)
                    {
                        if (fAngleToDir > new IM.Number(90))
                        {
                            _DoDefenseCross(defender);
                            Debug.Log("match defense cross.");
                        }
                    }

                    m_bChecked = true;
                }
            }
            else
            {
                Debug.Log("match defense cross not in blockable range.");
            }

            if (m_crossDir != CrossDir.None && m_player.m_blockable.tooLate)
            {
                if (_ValidDefender(defender))
                {
                    IM.Number crossRate = CalcCrossRate(m_player, defender);
                    crossRate = m_match.AdjustCrossRate(m_player, defender, crossRate);
                    IM.Number crossValue = IM.Random.value;
                    crossed       = crossValue < crossRate;
                    m_bDefenderOp = true;
                    Debugger.Instance.m_steamer.message = "Cross succeed: " + crossed + " Rate: " + crossRate + " Value: " + crossValue;
                    //should use sendmessage
                    if (crossed)
                    {
                        PlayerState_Crossed state = defender.m_StateMachine.GetState(State.eCrossed) as PlayerState_Crossed;
                        state.left       = (m_crossDir == CrossDir.Right);
                        state.m_animType = state.left ? AnimType.N_TYPE_0 : AnimType.N_TYPE_1;
                        defender.m_StateMachine.SetState(state);
                        ++m_player.mStatistics.data.success_cross_times;
                        m_player.mStatistics.SkillUsageSuccess(m_curExecSkill.skill.id, true);
                    }
                    //else
                    //	_DoDefenseCross(defender);
                }
            }
        }
    }