// 进入状态 public override void Enter(object param) { totalTime = 0; skillPart = m_SkillPart; if (skillPart.GetSkillPartType() == SkillPartType.SKILL_PLAYERPART) { PlayerSkillPart playerSkill = skillPart as PlayerSkillPart; if (playerSkill.AttackAnimState != null) { // playerSkill.PlaySkillAnim("Skill005", false); //收招 string aniName = playerSkill.AttackAnimState.name + "_over"; if (playerSkill.Master.GetAnimationState(aniName) != null) { playerSkill.PlaySkillAnim(aniName, false); } } else { //Engine.Utility.Log.Trace("SkillOverState.Enter {0}技能收招动作为空!", playerSkill.GetMaster().GetName()); } playerSkill.Master.SendMessage(EntityMessage.EntityCommond_IgnoreMoveAction, false); if (playerSkill.IsMainPlayer()) { stNextSkill st = new stNextSkill(); IControllerSystem cs = playerSkill.GetCtrollerSys(); if (cs == null) { Log.Error("ExecuteCmd: ControllerSystem is null"); return; } if (cs.GetCombatRobot().Status == CombatRobotStatus.RUNNING) { if (playerSkill.IsCombo(playerSkill.CurSkillID)) {//挂机连击 st.curSkillID = playerSkill.CurSkillID; SkillDoubleHitDataBase db = GameTableManager.Instance.GetTableItem <SkillDoubleHitDataBase>((uint)playerSkill.CurSkillID); if (db != null) { st.nextSkillID = db.nextskillid; if (db.nextskillid == db.beginskillid) {//挂机第三招要收招 st.nextSkillID = 0; } EventEngine.Instance().DispatchEvent((int)GameEventID.SKILLSYSTEM_STIFFTIMEOVER, st); } } } else {//非挂机时 插入其他技能 st.nextSkillID = 0; EventEngine.Instance().DispatchEvent((int)GameEventID.SKILLSYSTEM_STIFFTIMEOVER, st); } } } }
/// <summary> /// 通过[技能ID]二分快速查表 /// </summary> /// <param name="skillid">技能ID</param> /// <returns></returns> public static SkillDoubleHitDataBase Query(this List <SkillDoubleHitDataBase> sorted, uint skillid) { var key = new SkillDoubleHitDataBase() { skillid = skillid }; var comparer = new Comparer1(); var index = sorted.BinarySearch(key, comparer); return(index >= 0 ? sorted[index] : default(SkillDoubleHitDataBase)); }
void DoCastSkill(uint skill_id) { if (skillPart.GetSkillPartType() == SkillPartType.SKILL_PLAYERPART) { PlayerSkillPart playerSkill = skillPart as PlayerSkillPart; SkillEffectProp skillEffectProp; if (playerSkill.SkillEffectDic.TryGetValue((int)skill_id, out skillEffectProp) == false) { return; } IEntity target = skillPart.GetSkillTarget(); // 朝向目标 if (target != null) { if (m_skillDatabase != null) { if (m_skillDatabase.targetType != (int)SkillTargetType.TargetForwardPoint) { skillPart.GetMaster().SendMessage(EntityMessage.EntityCommand_LookTarget, target.GetPos()); } } } else { Engine.Utility.Log.LogGroup("ZCX", "朝向 目标 为空"); } playerSkill.NextSkillID = 0; playerSkill.CurSkillID = skill_id; m_skillDoubleDb = GameTableManager.Instance.GetTableItem <SkillDoubleHitDataBase>(playerSkill.CurSkillID); m_skillDatabase = GameTableManager.Instance.GetTableItem <SkillDatabase>(playerSkill.CurSkillID, 1); // m_attackState = SkillState.Attack //切换连招时AttackAnimState = null 会导致动作结束判断错误 //playerSkill.AttackAnimState = null; SkillEffect skillEffect = m_caster.CreateSkillEffect(skillEffectProp); m_caster.Cast(skillEffect, skill_id); } }
//释放者技能动作 public void PlaySkillAnim(string name, bool isAttackStateAni, int loopCount = 1, float speed = 1.0f, float offset = 0.0f) { // AttackAnimState = null; float blendTime = 0; SkillDoubleHitDataBase db = GameTableManager.Instance.GetTableItem <SkillDoubleHitDataBase>(CurSkillID); if (db != null) { blendTime = db.blendTime; } AttackAnimState = m_Master.GetAnimationState(name); if (AttackAnimState == null) { Log.Trace("animate is null aniname is {0} ", name); return; } AttackAnimState.wrapMode = WrapMode.ClampForever; PlayAni anim_param = new PlayAni(); anim_param.strAcionName = name; anim_param.fSpeed = speed; anim_param.nStartFrame = Mathf.RoundToInt(offset * 30); anim_param.nLoop = loopCount; anim_param.fBlendTime = blendTime; IsAttackStateEnd = false; if (isAttackStateAni) { anim_param.aniCallback = OnSkillAttackStateEndCallBack; anim_param.callbackParam = (object)name; } m_Master.SendMessage(EntityMessage.EntityCommand_PlayAni, anim_param); }
// 进入状态 public override void Enter(object param) { Engine.Utility.EventEngine.Instance().AddEventListener((int)Client.GameEventID.ENTITYSYSTEM_ENTITYSTOPMOVE, OnEvent); Engine.Utility.EventEngine.Instance().AddEventListener((int)Client.GameEventID.ENTITYSYSTEM_ENTITYBEGINMOVE, OnEvent); m_skillDoubleDb = null; m_fTotalTime = 0; skillPart = m_SkillPart; // m_skillDatabase = skillPart.GetCurSkillDataBase(); if (skillPart.GetSkillPartType() == SkillPartType.SKILL_PLAYERPART) { PlayerSkillPart playerSkill = skillPart as PlayerSkillPart; //m_nDoubleHitSkillId = (uint)playerSkill.NextSkillID; if (playerSkill.IsMainPlayer()) { Log.LogGroup("ZDY", "mainpalyer enter skillattackstate================"); } m_skillDatabase = GameTableManager.Instance.GetTableItem <SkillDatabase>(playerSkill.CurSkillID, 1); if (m_skillDatabase == null) { m_Statemachine.ChangeState((int)SkillState.None, null); return; } m_uDbJiangzhiTime = m_skillDatabase.wdStiffTime; playerSkill.SkillStiffTime = 0; m_skillDoubleDb = GameTableManager.Instance.GetTableItem <SkillDoubleHitDataBase>(playerSkill.CurSkillID); if (IsMainPlayer()) { Engine.Utility.EventEngine.Instance().DispatchEvent((int)GameEventID.SKILLSYSTEM_USESKILL, playerSkill.CurSkillID); } if (m_skillDatabase.dwMoveType == (uint)SkillMoveType.FastMove) { //处理位移技能 Move move = new Move(); Vector3 targePos = playerSkill.Master.GetPos(); if (playerSkill.GetSkillTarget() != null) { targePos = playerSkill.GetSkillTarget().GetPos(); Vector3 dir = targePos - playerSkill.Master.GetPos(); targePos = targePos - dir.normalized * 1f; move.m_target = targePos; // Vector3 lookat = playerSkill.GetSkillTarget().GetNode().GetTransForm().forward; } else { m_Statemachine.ChangeState((int)SkillState.None, playerSkill); Log.LogGroup("ZDY", "skilltarget is null"); return; } move.m_ignoreStand = true; if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Log.LogGroup("ZDY", "冲锋 目标位置 " + targePos); } AnimationState ani = playerSkill.AttackAnimState; if (ani == null) { m_Statemachine.ChangeState((int)SkillState.None, playerSkill); Log.LogGroup("ZDY", "ani is null"); return; } move.strRunAct = ani.name; int curSpeed = playerSkill.Master.GetProp((int)WorldObjProp.MoveSpeed); uint flySpeed = m_skillDatabase.flyspeed; float speedFact = 1; if (flySpeed != 0) { speedFact = flySpeed * 1.0f / curSpeed; } Log.LogGroup("ZDY", "冲锋倍数 " + speedFact); playerSkill.Master.SendMessage(EntityMessage.EntityCommond_IgnoreMoveAction, true); playerSkill.Master.SendMessage(EntityMessage.EntityCommand_ChangeMoveSpeedFact, (object)speedFact); float dis = Vector3.Distance(targePos, playerSkill.Master.GetPos()); if (dis > 1) { Log.LogGroup("ZDY", " send moveto "); playerSkill.Master.SendMessage(EntityMessage.EntityCommand_MoveTo, (object)move); } playerSkill.gotoPos = targePos; } else { playerSkill.Master.SendMessage(EntityMessage.EntityCommand_ChangeMoveSpeedFact, (object)1f); } if (m_skillDatabase.useSkillType == (int)UseSkillType.GuideNoSlider) { if (m_skillDatabase.dwMoveType == (int)SkillMoveType.SkillOverMove) { playerSkill.Master.SendMessage(EntityMessage.EntityCommand_SetVisible, false); } if (m_skillDatabase.wdStiffTime == 0) {//狂扫八方的技能 playerSkill.Master.SendMessage(EntityMessage.EntityCommond_IgnoreMoveAction, true); } } else if (m_skillDatabase.useSkillType == (int)UseSkillType.GuideSlider) { if (playerSkill.IsMainPlayer()) { Client.stUninterruptMagic evenparam = new Client.stUninterruptMagic(); evenparam.time = m_skillDatabase.dwGuideTime; evenparam.type = GameCmd.UninterruptActionType.UninterruptActionType_SkillCJ; evenparam.uid = SkillSystem.GetClientGlobal().MainPlayer.GetUID(); EventEngine.Instance().DispatchEvent((int)GameEventID.SKILLGUIDE_PROGRESSSTART, evenparam); } playerSkill.Master.SendMessage(EntityMessage.EntityCommond_IgnoreMoveAction, true); } // if (m_skillDatabase.dwUseMethod == (int)UseMethod.ContinueLock) { playerSkill.Master.SendMessage(EntityMessage.EntityCommand_SetVisible, false); } INPC npc = playerSkill.Master as INPC; if (npc != null) { int masterID = npc.GetProp((int)NPCProp.Masterid); if (masterID == PlayerSkillPart.m_ClientGlobal.MainPlayer.GetID()) { /* Engine.Utility.EventEngine.Instance().DispatchEvent((int)GameEventID.SKILLCD_BEGIN, playerSkill.CurSkillID);*/ } } } }
public override void Update(float dt) { IEntity casetr = skillPart.GetMaster(); if (m_caster == null) { m_Statemachine.ChangeState((int)SkillState.Over, null); return; } m_caster.Update(dt); m_fTotalTime += dt; if (skillPart.GetSkillPartType() == SkillPartType.SKILL_PLAYERPART) { PlayerSkillPart playerSkill = skillPart as PlayerSkillPart; // if (m_caster.IsCasting == false) { if (m_skillDatabase.useSkillType == (int)UseSkillType.GuideSlider || m_skillDatabase.useSkillType == (int)UseSkillType.GuideNoSlider) { if (m_skillDatabase.dwGuideTime > 0) { if (m_fTotalTime * 1000 > m_skillDatabase.dwGuideTime) { //接收招动作 m_Statemachine.ChangeState((int)SkillState.Over, playerSkill); } return; } else { Log.LogGroup("ZDY", "引导类型技能 {0} 的引导时间为0", m_skillDatabase.wdID); } } float tmeptime = Time.realtimeSinceStartup; float delta = tmeptime - playerSkill.SkillStartPlayTime; uint skillPlaytime = (uint)(delta * 1000); uint skillRunJiangzhiTime = (uint)(playerSkill.SkillStiffTime * 1000); IEntity target = skillPart.GetSkillTarget(); if (target == null) { if (skillRunJiangzhiTime > m_uDbJiangzhiTime) // 播放时间大于僵直时间 { m_Statemachine.ChangeState((int)SkillState.Over, playerSkill); } return; } if (target.GetCurState() == CreatureState.Dead) { Log.LogGroup("ZDY", "target dead 去除连击时无法切换状态的bug "); m_Statemachine.ChangeState((int)SkillState.Over, null); return; } playerSkill.OnDoLongPressNextSkillID(); if ((playerSkill.NextSkillID != 0)) { //CurSkillID // m_skillDoubleDb = GameTableManager.Instance.GetTableItem<SkillDoubleHitDataBase>(playerSkill.CurSkillID); SkillDoubleHitDataBase db = m_skillDoubleDb; if (db != null) { // if (playerSkill.NextSkillID == 101) // { // Log.Error("连击 nextskillid " + playerSkill.NextSkillID.ToString() + " skillPlay time is " + skillPlaytime + //" db.beginChangeTime " + db.beginChangeTime + " db.doublehitend " + db.doublehitend); // } if (skillPlaytime >= db.beginChangeTime && skillPlaytime <= db.doublehitend) { //大于僵直时间 并且小于连击生效时间可以变招 SkillEffect skillEffect = m_caster.EffectNode; if (skillEffect != null) { // skillEffect.Stop(); } // Log.LogGroup("ZDY", "连击 nextskillid " + playerSkill.NextSkillID.ToString()); playerSkill.SkillStiffTime = 0; //如果已经触发连击,接着播放连击技能 DoCastSkill((uint)playerSkill.NextSkillID); playerSkill.SkillStartPlayTime = Time.realtimeSinceStartup; playerSkill.SyncSkill((uint)playerSkill.CurSkillID, target, Vector3.zero); SkillDatabase curDataBase = m_skillDatabase;// GameTableManager.Instance.GetTableItem<SkillDatabase>(playerSkill.CurSkillID, 1); if (curDataBase != null) { m_uDbJiangzhiTime = curDataBase.wdStiffTime; } else { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Log.LogGroup("ZDY", "curdatabase is null skill id is " + playerSkill.CurSkillID); } } //普攻没有cd 不需要派发 Engine.Utility.EventEngine.Instance().DispatchEvent((int)GameEventID.SKILLSYSTEM_USESKILL, playerSkill.CurSkillID); } else { if (skillPlaytime > db.doublehitend) // 播放时间大于连击生效时间 { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Log.LogGroup("ZDY", "播放时间大于连击生效时间 切换到over skillPlaytime is " + skillPlaytime + " 连击生效时间 " + db.doublehitend); } //接收招动作 m_Statemachine.ChangeState((int)SkillState.Over, playerSkill); } } } } else { if (skillRunJiangzhiTime > m_uDbJiangzhiTime) // 大于僵直时间 { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Log.LogGroup("ZDY", "达到僵直时间切换到over runjiangzhitime is " + skillRunJiangzhiTime); } //接收招动作 m_Statemachine.ChangeState((int)SkillState.Over, playerSkill); } else {//连击不要在这里触发 // m_skillDoubleDb = GameTableManager.Instance.GetTableItem<SkillDoubleHitDataBase>(playerSkill.CurSkillID); /* if (m_skillDoubleDb != null && IsMainPlayer()) * { * IControllerSystem cs = playerSkill.GetCtrollerSys(); * if (cs == null) * { * Log.Error("ExecuteCmd: ControllerSystem is null"); * return; * } * * if (cs.GetCombatRobot().Status != CombatRobotStatus.STOP) * { * // Log.LogGroup("ZDY", "======================= skillPlaytime is " + skillPlaytime + " start " + m_skillDoubleDb.doublehitBegin + " end " + m_skillDoubleDb.doublehitend); * if (skillPlaytime >= m_skillDoubleDb.doublehitBegin && skillPlaytime <= m_skillDoubleDb.doublehitend && m_bSendDoubleHitCmd == false) * { * m_bSendDoubleHitCmd = true; * Engine.Utility.Log.LogGroup("ZCX", "连击{0} next ", playerSkill.CurSkillID, playerSkill.NextSkillID); * SkillDoubleHitDataBase skilldoubleDb = m_skillDoubleDb;// GameTableManager.Instance.GetTableItem<SkillDoubleHitDataBase>(playerSkill.CurSkillID); * * if (skilldoubleDb != null) * { * stSkillDoubleHit skillDhHit = new stSkillDoubleHit(); * skillDhHit.doubleHitEnd = skilldoubleDb.beginskillid == skilldoubleDb.nextskillid; * skillDhHit.skillID = skilldoubleDb.nextskillid; * Engine.Utility.EventEngine.Instance().DispatchEvent((int)GameEventID.ROBOTCOMBAT_NEXTCMD, skillDhHit); * } * } * } * * }*/ } } } //else //{ //} } }