Пример #1
0
        public void OnDown(CmdFspSendSkill cmd)
        {
            if (m_casterObject == null || m_casterObject.GetEnt() == null)
            {
                return;
            }

            m_casterObject.StartRotate(cmd.m_dir.ToVector3(), 0.11f);

            BattleEntity ent     = m_casterObject.GetEnt() as BattleEntity;
            int          animaId = m_casterData.animaName;

            if (m_casterObject.m_state == CmdFspEnum.eFspMove || m_casterObject.m_state == CmdFspEnum.eFspAutoMove)
            {
                // 施法方向和移动方向一致时
                float dot = Vector2.Dot(cmd.m_dir.ToVector2(), m_casterObject.m_moveInfo.m_dir.ToVector2());
                if (dot > 0)
                {
                    animaId = m_casterData.forwardAnimaId;
                }
                else
                {
                    animaId = m_casterData.backAnimaId;
                }
            }

            ent.PlayAnima(animaId);

            // 表现层,玩家不发生移动转向,而是直接设置方向
            m_casterObject.m_bRotate = false;
        }
Пример #2
0
        public static bool SendSkill(CCreature m_creature, BtDatabase m_dataBase, bool bDown = false)
        {
            int targetUid = m_dataBase.GetData <int>((int)eAIParam.INT_TARGET_UID);

            if (targetUid == m_creature.GetUid())
            {
                return(false);
            }
            CCreature targetCc = CCreatureMgr.Get(targetUid);

            if (targetCc != null)
            {
                Vector2d dir = (targetCc.GetPos() - m_creature.GetPos());
                dir.Normalize();
                //if (dir == Vector2.zero)
                //{
                //    dir = m_creature.GetDir();
                //}
                int selectSkillUid = m_dataBase.GetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX);

                CSkillInfo skillInfo = m_creature.GetSkillByIndex(selectSkillUid);



                CmdFspSendSkill cmd = new CmdFspSendSkill();
                cmd.m_casterUid  = (int)m_creature.GetUid();
                cmd.m_skillIndex = selectSkillUid;

                if (skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.Self)
                {
                }
                else if (skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.Dir ||
                         skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.SectorDir)
                {
                    cmd.m_dir = dir;
                }
                else if (skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.Pos)
                {
                    cmd.m_dir    = dir;
                    cmd.m_endPos = targetCc.GetPos();
                }
                cmd.m_bDown = bDown;

                if (m_creature.m_aiType == eAIType.Player)
                {
                    m_creature.SendFspCmd(cmd);
                }
                else
                {
                    m_creature.PushCommand(cmd);
                }

                // 进入公共CD
                m_dataBase.SetData <int>((int)eAIParam.INT_SKILL_INTERVAL, GetSkillCastCd(m_creature, m_dataBase));
                // 清空当前发送的技能
                m_dataBase.SetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX, -1);
                return(true);
            }
            return(false);
        }
Пример #3
0
        /// <summary>
        /// 指令对象转消息内容并发送
        /// </summary>
        /// <param name="cmd"></param>
        public void SendFspCmd(IFspCmdType cmd)
        {
            // 如果本地单机测试
            if (Client.Inst().isSingleTest)
            {
                PushCommand(cmd);
                return;
            }

            CmdFspEnum  type = cmd.GetCmdType();
            FspMsgFrame msg  = (FspMsgFrame)NetManager.Inst.GetMessage(eNetMessageID.FspMsgFrame);
            FspVKey     key  = new FspVKey();

            key.vkey     = (int)type;
            key.playerId = (uint)GetUid();
            switch (type)
            {
            case CmdFspEnum.eFspStopMove:
                msg.m_frameData.vkeys.Add(key);
                break;

            case CmdFspEnum.eFspMove:
                CmdFspMove moveCmd = cmd as CmdFspMove;
                key.args    = new int[2];
                key.args[0] = (int)(moveCmd.m_dir.x * 100);
                key.args[1] = (int)(moveCmd.m_dir.y * 100);
                msg.m_frameData.vkeys.Add(key);
                break;

            case CmdFspEnum.eFspAutoMove:
                CmdFspAutoMove amoveCmd = cmd as CmdFspAutoMove;
                key.args    = new int[2];
                key.args[0] = (int)(amoveCmd.m_pos.x * 100);
                key.args[1] = (int)(amoveCmd.m_pos.y * 100);
                Debug.Log("send :" + key.args[0] + "  " + key.args[1]);
                msg.m_frameData.vkeys.Add(key);
                break;

            case CmdFspEnum.eFspSendSkill:
                CmdFspSendSkill skill = cmd as CmdFspSendSkill;
                key.args    = new int[7];
                key.args[0] = (int)skill.m_casterUid;
                key.args[1] = (int)skill.m_skillIndex;
                key.args[2] = (int)skill.m_targetId;

                key.args[3] = (int)(skill.m_dir.x * 100);
                key.args[4] = (int)(skill.m_dir.y * 100);

                key.args[5] = (int)(skill.m_endPos.x * 100);
                key.args[6] = (int)(skill.m_endPos.y * 100);

                msg.m_frameData.vkeys.Add(key);
                break;
            }
            FspNetRunTime.Inst.SendMessage(msg);
        }
Пример #4
0
        public void OnUp(CmdFspSendSkill cmd)
        {
            if (m_casterObject == null || m_casterObject.GetEnt() == null)
            {
                return;
            }

            m_casterObject.StartRotate(cmd.m_dir.ToVector3(), 0.1f);
            m_casterObject.m_bRotate = true;
        }
Пример #5
0
 public virtual void PushCommand(IFspCmdType cmd)
 {
     switch (cmd.GetCmdType())
     {
     case CmdFspEnum.eFspSendSkill:
         m_curSkillCmd = cmd as CmdFspSendSkill;
         Init();
         break;
     }
 }
Пример #6
0
        public void PushCommand(IFspCmdType cmd)
        {
            switch (cmd.GetCmdType())
            {
            case CmdFspEnum.eFspSendSkill:
                m_curSkillCmd = cmd as CmdFspSendSkill;
                Start();

                m_vSkill.PushCommand(cmd);
                break;
            }
        }
Пример #7
0
        public static void SendSkill(CCreature m_creature, BtDatabase m_dataBase)
        {
            int             selectSkillUid = m_dataBase.GetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX);
            CmdFspSendSkill cmd            = new CmdFspSendSkill();

            cmd.m_casterUid  = (int)m_creature.GetUid();
            cmd.m_skillIndex = selectSkillUid;
            cmd.m_bDown      = false;
            m_creature.PushCommand(cmd);

            // 进入公共CD
            m_dataBase.SetData <int>((int)eAIParam.INT_SKILL_INTERVAL, GetSkillCastCd(m_creature, m_dataBase));
            // 清空当前发送的技能
            m_dataBase.SetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX, 0);
        }
Пример #8
0
        /// <summary>
        /// 消息内容转指令对象
        /// </summary>
        private void HandleServerCmd(FspVKey cmd)
        {
            CmdFspEnum type = (CmdFspEnum)cmd.vkey;
            uint       uid  = cmd.playerId;

            if (uid == 0)
            {
                return;
            }
            CCreature   player   = CCreatureMgr.Get(uid);
            IFspCmdType logicCmd = null;

            switch (type)
            {
            case CmdFspEnum.eFspStopMove:
                //Debug.Log(uid + " 停止移动");
                logicCmd = new CmdFspStopMove();
                break;

            case CmdFspEnum.eFspMove:
                //Debug.Log(uid + " 客户端调用移动命令 " + cmd.args[0] + " " + cmd.args[1]);
                Vector2d v = new Vector2d(cmd.args[0] * 0.01f, cmd.args[1] * 0.01f);
                logicCmd = new CmdFspMove(ref v);
                break;

            case CmdFspEnum.eFspAutoMove:
                Vector2d v1 = new Vector2d(cmd.args[0] * 0.01f, cmd.args[1] * 0.01f);
                logicCmd = new CmdFspAutoMove(ref v1);
                break;

            case CmdFspEnum.eFspSendSkill:
                //Debug.Log(uid + " 客户端调用技能 " + cmd.args[0] + " " + cmd.args[1]);

                CmdFspSendSkill skill = new CmdFspSendSkill();
                skill.m_casterUid  = cmd.args[0];
                skill.m_skillIndex = cmd.args[1];
                skill.m_targetId   = cmd.args[2];
                Vector2d dir    = new Vector2d(cmd.args[3] * 0.01f, cmd.args[4] * 0.01f);
                Vector2d endPos = new Vector2d(cmd.args[5] * 0.01f, cmd.args[6] * 0.01f);
                skill.m_dir    = dir;
                skill.m_endPos = endPos;
                logicCmd       = skill;
                break;
            }
            player.PushCommand(logicCmd);
        }
Пример #9
0
        public void SetCmd(CmdFspSendSkill cmd)
        {
            if (m_noLaunchUp)
            {
                return;
            }

            //Debug.Log("cmd :" + cmd.m_bDown + " launch:" +m_bLaunch);
            m_curSkillCmd = cmd;

            if (cmd.m_bDown)
            {
                OnDown();
            }
            else
            {
                if (m_bLaunching)   // 如果还在前摇状态中就终止了
                {
                    m_noLaunchUp = true;
                    return;
                }
                OnUp();
            }
        }
Пример #10
0
        /// <summary>
        /// 摇杆的场景指示器也只能主角自己有,并且是操作完成才发送指令
        /// </summary>
        private void OnSkillEvent(int index, eJoyStickEvent jsEvent, Vector2 m_delta, bool bCancel)
        {
            m_curSkillIndex    = index;
            m_curSkillJoyStick = jsEvent;
            CCreature master = CCreatureMgr.GetMaster();

            CSkillInfo sInfo = m_master.GetSkillByIndex(index);

            //if (sInfo == null || !sInfo.IsCanUse())
            //{
            //    Debug.Log(index + " 不可用" + jsEvent);
            //    return;
            //}


            if (jsEvent == eJoyStickEvent.Drag)
            {
                m_curSkillDir = new Vector3(m_delta.x, 0, m_delta.y);
                m_curSkillDir.Normalize();
            }

            if (jsEvent == eJoyStickEvent.Down)
            {
                m_bSkillCancel = false;

                skillInfo = sInfo.m_skillInfo;


                m_ui.m_cancelBtn.SetActiveNew(true);
                m_ui.SetColor(index, SKLL_BLUE);


                m_skillChose.gameObject.SetActiveNew(true);
                m_skillCenter.gameObject.SetActiveNew(true);
                m_skillDistance.gameObject.SetActiveNew(true);
                m_skillSectorDir.gameObject.SetActiveNew(false);
                m_skillDir.gameObject.SetActiveNew(false);
                m_skillPos.gameObject.SetActiveNew(false);

                m_skillDistance.localScale = new Vector3(skillInfo.distance, 0.01f, skillInfo.distance) * 2;
            }

            // 自己
            if (skillInfo.selectTargetType == (int)eSelectTargetType.Self)
            {
                m_curSkillDir = master.GetDir().ToVector3();
            }
            // 扇形方向
            else if (skillInfo.selectTargetType == (int)eSelectTargetType.SectorDir)
            {
                if (jsEvent == eJoyStickEvent.Down)
                {
                    m_curSkillDir = master.GetDir().ToVector3();
                    m_skillSectorDir.gameObject.SetActiveNew(true);
                    m_skillSectorDir.localScale = new Vector3(skillInfo.distance, 0.01f, skillInfo.distance);
                }
                else if (jsEvent == eJoyStickEvent.Drag)
                {
                }
                m_skillCenter.rotation = Quaternion.LookRotation(m_curSkillDir);  // 只用控制中心点的方向
            }
            // 直线方向
            else if (skillInfo.selectTargetType == (int)eSelectTargetType.Dir)
            {
                if (jsEvent == eJoyStickEvent.Down)
                {
                    int tUid = master.GetTarget(skillInfo.distance);
                    if (tUid == 0)
                    {
                        m_curSkillDir = master.GetDir().ToVector3();
                    }
                    else
                    {
                        CCreature cc = CCreatureMgr.Get(tUid);
                        if (cc != null)
                        {
                            m_curSkillDir = (cc.GetPos() - master.GetPos()).ToVector3().normalized;
                        }
                    }
                    m_skillDir.gameObject.SetActiveNew(true);
                    m_skillDir.localScale = new Vector3(skillInfo.distance, 0.01f, skillInfo.distance);
                }
                else if (jsEvent == eJoyStickEvent.Drag)
                {
                }
                m_skillCenter.rotation = Quaternion.LookRotation(m_curSkillDir);  // 只用控制中心点的方向
            }
            // 位置
            else if (skillInfo.selectTargetType == (int)eSelectTargetType.Pos)
            {
                if (jsEvent == eJoyStickEvent.Down)
                {
                    int tUid = master.GetTarget(skillInfo.distance);
                    if (tUid == 0)
                    {
                        m_curSkilPos = m_master.GetPos().ToVector3();
                    }
                    else
                    {
                        CCreature cc = CCreatureMgr.Get(tUid);
                        if (cc != null)
                        {
                            m_curSkilPos = cc.GetPos().ToVector3();
                        }
                    }
                    m_skillPos.gameObject.SetActiveNew(true);
                    m_skillPos.position   = m_curSkilPos;
                    m_skillPos.localScale = new Vector3(skillInfo.length, 0.001f, skillInfo.length);
                }
                else if (jsEvent == eJoyStickEvent.Drag)
                {
                    Vector3 atkOffset = m_curSkillDir * m_delta.magnitude * skillInfo.distance;
                    m_curSkilPos        = m_master.m_vCreature.GetEnt().GetPos() + atkOffset;
                    m_skillPos.position = m_curSkilPos;
                }
            }

            if (jsEvent == eJoyStickEvent.Up)
            {
                // 发送技能
                if (!m_bSkillCancel)
                {
                    m_bSkillCancel = true;
                    //Debug.Log("发送技能:" + skillInfo.id  + "dir:" + m_curSkillDir + " pos:" + m_curSkilPos);
                    CmdFspSendSkill cmd = new CmdFspSendSkill();
                    cmd.m_casterUid  = (int)m_master.GetUid();
                    cmd.m_skillIndex = m_curSkillIndex;
                    cmd.m_dir        = (new Vector2(m_curSkillDir.x, m_curSkillDir.z)).ToVector2d();
                    cmd.m_endPos     = (new Vector2(m_curSkilPos.x, m_curSkilPos.z)).ToVector2d();
                    master.SendFspCmd(cmd);

                    OnSkillSpeak(index);
                }
                // 还原指示器
                CancelSkill();

                m_skillChose.gameObject.SetActiveNew(false);
            }
        }