Exemple #1
0
    /// <summary>
    /// 把外部控制消息转发给技能实例
    /// 包括 硬件输入消息, 网络消息
    /// </summary>
    /// <param name="skillID"></param>
    /// <param name="controlEvent"></param>
    private void SendEventToSkill(int skillID, SkillControlEvent controlEvent, SkillEventParam param)
    {
        // 当技能释放失败时, 报错. 这种时候也不检查客户端是否有对应技能, 不过按理说请求都发给服务器了, 报错, 应该客户端还在释放这个技能.
        if (controlEvent == SkillControlEvent.ServerMsg_OnFail)
        {
            // UNDONE 打印报错提示

            if (!IsReleasingSkill(skillID))
            {
                // 可能有我没考虑到的逻辑
                Assert.IsTrue(false, skillID.ToString());
            }
            else
            {
                StopSkill(skillID, false);
            }
        }

        // 如果找不到服务器要求释放的技能, 表明这个技能已经结束了或者从来没有创建过
        // 已知在如下情况下会出现这种情况
        // 1. 开启了客户端预言. 等释放技能的消息回来, 技能已经结束了
        // 2. 客户端和服务器某种状态或者数据不一致. 客户端没有成功创建技能
        if (!IsReleasingSkill(skillID))
        {
            //Assert.IsTrue(false, skillID.ToString()); // 处理非预言情况
            return;
        }

        m_State = m_IDToSkill[skillID].HandleEvent(controlEvent, param);
        m_Property.SetCurrentSkillState(m_State);
    }
Exemple #2
0
    private void OnSkillHotkeyImplementation(SkillCastEvent skillCast)
    {
        PlayerSkillVO skillVO;

        if (skillCast.IsWeaponSkill)
        {
            if (m_SkillProxy.UsingReformer())
            {
                skillVO = m_SkillProxy.GetReformerSkill();
            }
            else
            {
                skillVO = m_SkillProxy.GetCurrentWeaponSkill();
                if (skillVO != null && !m_CfgSkillProxy.IsWeaponSkill(skillVO.GetID()))
                {
                    Debug.LogErrorFormat("技能 {0} 被配置在武器上, 但它并不是一个武器技能! 找策划确认一下技能表和武器表", skillVO.GetID());
                }
            }
        }
        else
        {
            skillVO = m_SkillProxy.GetSkillByIndex(skillCast.SkillIndex);
            if (skillVO != null && m_CfgSkillProxy.IsWeaponSkill(skillVO.GetID()))
            {
                Debug.LogErrorFormat("技能 {0} 被配置在飞船上, 但它其实是一个武器技能! 找策划确认一下技能表和武器表", skillVO.GetID());
            }
        }

        if (skillVO != null)
        {
            int skillID = skillVO.GetID();

            bool keyPressed = skillCast.KeyPressed;

            if (keyPressed && !IsReleasingSkill(skillID))
            {
                // 释放Trigger技能的过程中, 可以释放非Trigger技能. 此时Trigger技能中断, 等非Trigger技能结束后继续放
                // 不是Trigger技能的话, 每次技能按键按下, 只能释放一次
                if ((m_CfgSkillProxy.IsTriggerSkill(skillID) && !OneOfReleasingSkillsIsNotTriggerSkill()) ||
                    (!m_CfgSkillProxy.IsTriggerSkill(skillID) && !SkillHasReleasedDuringPress(skillID)))
                {
                    ReleaseSkillByClientInput(skillID);
                    SetSkillReleaseDuringPress(skillID, true);

                    if (m_CfgSkillProxy.IsTriggerSkill(skillID))
                    {
                        m_Property.SetTriggerSkillID(skillID);
                        m_Property.SetReleasingTriggerSkill(true);
                    }
                }
            }
            else
            {
                SkillControlEvent skillEvent = keyPressed ? SkillControlEvent.Event_SkillButtonPress : SkillControlEvent.Event_SkillButtonRelease;
                SendEventToSkill(skillID, skillEvent, null);

                if (!keyPressed)
                {
                    SetSkillReleaseDuringPress(skillID, false);
                    m_Property.SetReleasingTriggerSkill(false);
                    m_Property.SetTriggerSkillID(-1);
                }
            }
        }
    }