/// <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); }
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); } } } }