Exemplo n.º 1
0
        //根据技能力度,怪物体形获取受击动作,以及硬直时间
        public BehitInfo GetBeHitInfo(int resID, int skillID)
        {
            BehitInfo info = new BehitInfo();

            LuaTable skillDesc = ConfigManager.Instance.Skill.GetSkillConfig(skillID);

            if (skillDesc == null)
            {
                return(info);
            }
            //int body = m_actor.GetAttribteValue(RoleAttrType.CS_ID_BODY);
            int bodyType = m_actor.BodyType;

            int weight = skillDesc.Get <int>("skillweight");



            //技能力度纠正
            if (m_behitParame.damgageInfo.weight > 0)
            {
                weight = m_behitParame.damgageInfo.weight;
                //LogMgr.UnityLog(skillID+", reset weight=" + weight);
            }

            List <ActionAndTime> listRet = new List <ActionAndTime>();


            //获取技能受击反馈
            SkillBehitDisplayDesc behitDisplay = CoreEntry.gGameDBMgr.GetSkillBehitDisplayDesc(weight, bodyType);

            if (behitDisplay == null)
            {
                if ((m_actor.mActorType == ActorType.AT_BOSS || m_actor.mActorType == ActorType.AT_LOCAL_PLAYER || m_actor.mActorType == ActorType.AT_PVP_PLAYER) &&
                    (m_attack.mActorType == ActorType.AT_BOSS || m_attack.mActorType == ActorType.AT_LOCAL_PLAYER || m_attack.mActorType == ActorType.AT_PVP_PLAYER))
                {
                    //普通受击,只有一个
                    ActionAndTime data = new ActionAndTime();
                    data.strAction = "hit001";
                    data.needTime  = m_actor.GetActionLength(data.strAction);

                    listRet.Add(data);

                    info.hitDistance  = 0;
                    info.moveDistance = 0;
                    //if (creatureDesc != null)
                    //{
                    //    info.moveDistance = creatureDesc.behitMoveBase * skillDesc.hitMoveScale / 100f;
                    //}
                    //else
                    //{
                    //    LogMgr.WarningLog("The creatureDesc is null.");
                    //}
                    info.moveTime = 0.1f;//skillDesc.hitMoveTime / 1000f;


                    //保证动作播放完成
                    info.exitStateTime = data.needTime;
                }

                info.strActionArry = listRet.ToArray();
                return(info);
            }

            //BOSS强制不浮空,只击退
            //if (m_actor.mActorType == ActorType.AT_BOSS && m_actor.IsInQiJue())
            //{
            //    if (behitDisplay.behitType == BehitType.BT_HITSKY)
            //    {
            //        behitDisplay.behitType = BehitType.BT_HITBACK;
            //    }

            //}


            //硬直时间
            info.NonControlTime = behitDisplay.nonControlSet.keepTime * 0.001f;

            BehitType behitType = behitDisplay.behitType;

            //动作
            if (behitDisplay.behitType == BehitType.BT_NORMAL)
            {
                //普通受击,只有一个
                ActionAndTime data = new ActionAndTime();
                data.strAction = behitDisplay.actionList[0];
                data.needTime  = m_actor.GetActionLength(data.strAction);

                listRet.Add(data);

                info.hitDistance = 0;

                //   info.moveDistance = skillDesc.hitMoveDistance;
                //   info.moveTime = 0.1f;
                info.moveDistance = 0;
                //if (creatureDesc != null)
                //{
                //    info.moveDistance = creatureDesc.behitMoveBase * skillDesc.hitMoveScale / 100f;
                //}
                //else
                //{
                //    LogMgr.WarningLog("The creatureDesc is null.");
                //}

                info.moveTime = 0.5f;//skillDesc.hitMoveTime / 1000f;


                //保证动作播放完成
                info.exitStateTime = data.needTime;
                if (m_actor.mActorType == ActorType.AT_BOSS)
                {
                    StateParameter stateParm = new StateParameter();
                    stateParm.state = ACTOR_STATE.AS_BEHIT;

                    stateParm.skillID = skillID;
                    m_actor.m_AttackState.BreakSkill(stateParm);
                }
            }
            else if (behitDisplay.behitType == BehitType.BT_HITBACK)
            {
                //击退,带有位移
                ActionAndTime data = new ActionAndTime();
                data.strAction = behitDisplay.actionList[0];
                data.needTime  = m_actor.GetActionLength(data.strAction);

                listRet.Add(data);
                info.hitDistance = 0;
                //if(creatureDesc != null)
                //{
                //    info.hitDistance = skillDesc.hitBackScale / 100f * creatureDesc.behitBackBase;
                //}
                //else
                //{
                //    LogMgr.WarningLog("The creatureDesc is null.");
                //}


                //需要打断技能
                if (m_attack.mActorType == ActorType.AT_BOSS)
                {
                    LuaTable pSkillDesc = m_actor.GetCurSkillDesc(m_actor.curCastSkillID);
                    if (pSkillDesc != null)
                    {
                        if (pSkillDesc.Get <int>("showtype") == 2) //大招和合击不能打断
                        {
                            StateParameter stateParm = new StateParameter();
                            stateParm.state = ACTOR_STATE.AS_BEHIT;

                            stateParm.skillID = skillID;
                            m_actor.m_AttackState.BreakSkill(stateParm);
                        }
                    }
                }



                // info.hitDistance = 1;       //保证释放被击位移
                // if (m_behitParame.damgageInfo.isNotUseCurveMove)
                // {
                //     info.hitDistance = 0;
                //  }

                //保证动作播放完成
                info.exitStateTime = data.needTime;
            }
            //else if (behitDisplay.behitType == BehitType.BT_HITDOWN)
            //{
            //    //击到
            //    ActionAndTime data = new ActionAndTime();
            //    data.strAction = behitDisplay.actionList[0];
            //    data.needTime = m_actor.GetActionLength(data.strAction);

            //    listRet.Add(data);

            //    info.hitDistance = skillDesc.iHitFlyScale / 100f * creatureDesc.fBehitFlyBase;
            //    //保证动作播放完成
            //    info.exitStateTime = data.needTime;

            //    m_isHitDownState = true;
            //}
            //else if (behitDisplay.behitType == BehitType.BT_HITSKY)
            //{
            //    //浮空,接管被击的硬直保护,硬直,退出时间等
            //    if (m_gravityMotionBase != null)
            //    {
            //        m_gravityMotionBase.StartHitToSky(skillDesc.hitSkyOriginV, skillDesc.hitSkyAngle);

            //        //需要打断技能
            //        StateParameter stateParm = new StateParameter();
            //        stateParm.state = ACTOR_STATE.AS_BEHIT;

            //        stateParm.skillID = skillID;
            //        m_actor.m_AttackState.BreakSkill(stateParm);

            //        info.isInSky = true;
            //        return info;
            //    }

            //    //没有浮空动作,采用hitdown
            //    behitType = BehitType.BT_HITDOWN;
            //}

            //击倒处理
            if (behitType == BehitType.BT_HITDOWN)
            {
                ActionAndTime data = new ActionAndTime();
                data.strAction = behitDisplay.actionList[0];
                data.needTime  = m_actor.GetActionLength(data.strAction);

                listRet.Add(data);
                info.hitDistance = 0;
                //if (creatureDesc != null)
                //{
                //    info.hitDistance = skillDesc.hitFlyScale / 100f * creatureDesc.behitFlyBase;
                //}
                //else
                //{
                //    LogMgr.WarningLog("The creatureDesc is null.");
                //}


                // info.hitDistance = 1;       //保证释放被击位移
                //  if (m_behitParame.damgageInfo.isNotUseCurveMove)
                //   {
                //       info.hitDistance = 0;
                //   }

                //保证动作播放完成

                if (m_actor.mActorType == ActorType.AT_BOSS)
                {
                    info.exitStateTime = data.needTime - 0.5f;
                }
                else
                {
                    info.exitStateTime = data.needTime - 0.2f;
                }

                m_isHitDownState = true;
            }


            //硬直保护
            if (//behitDisplay.behitType == BehitType.BT_HITBACK ||
                behitType == BehitType.BT_HITDOWN)
            {
                if (m_actor.mActorType == ActorType.AT_BOSS ||
                    m_actor.mActorType == ActorType.AT_LOCAL_PLAYER)
                {
                    m_isNonControlProtect = true;
                }

                //取消目标

                if (m_attack.mActorType == ActorType.AT_LOCAL_PLAYER)
                {
                    //yy修改更换目标的BUG
                    //      actorObj.player.SelectTarget(null);
                }
            }

            //主角被击后,有位移
            if ((m_actor.mActorType == ActorType.AT_LOCAL_PLAYER || m_actor.mActorType == ActorType.AT_PVP_PLAYER) &&
                (info.hitDistance > 0 || info.moveDistance > 0))
            {
                //只旋转Y轴
                Vector3 lookPos = new Vector3(m_attack.transform.position.x,
                                              m_transform.position.y, m_attack.transform.position.z);

                m_transform.LookAt(lookPos);
            }

            //采用动作时间
            if (behitDisplay.nonControlSet.canReset)
            {
                foreach (ActionAndTime action in listRet)
                {
                    info.NonControlTime += action.needTime;
                }
            }


            info.strActionArry = listRet.ToArray();

            return(info);
        }
Exemplo n.º 2
0
        void DoBehitEx()
        {
            BehitInfo info = GetBeHitInfo(m_actor.resid, m_curSkillID);

            if (m_behitParame != null)
            {
                //buff伤害不产生位移效果
                if (m_behitParame.displayType == DamageDisplayType.DDT_BUFF)
                {
                    return;
                }

                //声音
                if (m_behitParame != null)
                {
                    LuaTable desc = ConfigManager.Instance.Skill.GetSkillConfig(m_curSkillID);
                    PlayBehitSound(m_behitParame.damgageInfo.behitActor, m_behitParame.damgageInfo.attackActor, desc);
                }
            }


            //使用动作时间
            exitStateTime = m_actor.GetActionLength("hit001");
            m_actor.StopAll();
            m_actor.PlayAction("hit001", false);

            if (m_actor.mActorType == ActorType.AT_MONSTER)
            {
                m_actor.StopMove(true);
            }
            //      PlayBehitSound(m_behitParame.damgageInfo.behitActor, m_behitParame.damgageInfo.attackActor, desc);

            //没有硬直
            if (exitStateTime <= 0)
            {
                Invoke("ExitBehitState", 0.1f);
                return;
            }

            //2,硬直处理
            isNonControl = false;
            //主角
            //if (info.NonControlTime > 0.001f)
            //{
            //    isNonControl = true;
            //    Invoke("NonControlEnd", info.NonControlTime);
            //}

            //BOSS
            //if (info.NonControlTime == 0f && m_actor.mActorType == ActorType.AT_BOSS && m_actor.IsInQiJue())
            //{
            //    isNonControl = true;
            //    Invoke("NonControlEnd", 0.3f);
            //}



            //3, 位移
            if (info.hitDistance > 0.01f)
            {
                //曲线位移
                OnBehitCurve(m_curPlayAction, info.hitDistance);
            }
            //else if (info.moveDistance > 0.001f)
            //{
            //    //程序位移
            //    OnBehitMove(info.moveDistance, info.moveTime);
            //}

            //4,退出
            if (exitStateTime > 0.001f)
            {
                Invoke("ExitBehitState", exitStateTime);
            }
            else
            {
                ExitBehitState();
            }

            //5,被击特效
            //OnPlayBehitEfx();
        }