public void BeginSkill() { int firstStageID = -1; for (int i = 0; i < mSkillInfo.stages.Length; ++i) { int stageID = mSkillInfo.stages[i]; excel_skill_stage stageInfo = excel_skill_stage.Find(stageID); if (stageInfo == null) { Debug.LogErrorFormat("Error: 找不到技能段{0},技能ID:{1}", stageID, mSkillInfo.id); continue; } if (SkillStage.IsStageTrait(SkillStageTrait.FirstStage, stageInfo)) { firstStageID = stageInfo.id; break; } } if (firstStageID < 0) { Debug.LogErrorFormat("Error: 找不到初始技能段,技能ID:{0}", mSkillInfo.id); return; } SetStage(firstStageID); if (mCurStage == null) { mSkillState = SkillState.Break; return; } Character skillTarget = mSkillContext.SkillTarget; if (mSkillInfo.targetType != (int)SkillTargetType.All && skillTarget != null) { Vector3 dir = skillTarget.Position - Owner.Position; Owner.Direction = dir; } if (!SkillStage.IsStageTrait(SkillStageTrait.AllowMove, mCurStage.mStageInfo) || SkillStage.IsStageTrait(SkillStageTrait.MoveBreak, mCurStage.mStageInfo)) { //Owner.StopMove(false); } mSkillState = SkillState.Using; // 自己客户端放技能通知服务器开始放技能; if (GameController.IsConntrller(Owner)) { SkillBegin req = new SkillBegin(); req.uid = Owner.gid; req.skillID = mSkillInfo.id; req.position = Vector3Packat.FromVector3(Owner.Position); req.direction = Vector3Packat.FromVector3(Owner.Direction); NetWork.SendPacket(CTS.CTS_SkillBegin, req, null); } }
public void Exit() { if (!IsBreak()) { DoEvent(this, SkillEventTriggerType.NormalEnd); } DoEvent(this, SkillEventTriggerType.FinalEnd); if (!SkillStage.IsStageTrait(SkillStageTrait.AllowMove, mStageInfo)) { Owner.SetCannotFlag(CannotFlag.CannotControl, OptType.Skill, false); Owner.SetCannotFlag(CannotFlag.CannotMove, OptType.Skill, false); } }
public void Enter() { mVanish = false; mJumpType = SkillJumpType.None; mJumpID = 0; mJumpTick = 0; mBreak = 0; if (!SkillStage.IsStageTrait(SkillStageTrait.AllowMove, mStageInfo)) { Owner.SetCannotFlag(CannotFlag.CannotControl, OptType.Skill, true); Owner.SetCannotFlag(CannotFlag.CannotMove, OptType.Skill, true); } mTick = 0; DoEvent(this, SkillEventTriggerType.StageBegin); }
public void OnMove() { if (mCurStage != null) { if (SkillStage.IsStageTrait(SkillStageTrait.MoveBreak, mCurStage.mStageInfo)) { mCurStage.SetBreak(SkillBreakType.Move, true); } } else { if (mSkillState == SkillState.TrackEnemy) { Owner.StopMove(); } mSkillState = SkillState.Break; } }
public void BeginSkill() { int firstStageID = -1; for (int i = 0; i < mSkillInfo.stages.Length; ++i) { int stageID = mSkillInfo.stages[i]; excel_skill_stage stageInfo = excel_skill_stage.Find(stageID); if (stageInfo == null) { Debug.LogError("Error: 找不到技能段{0},技能ID:{1}", stageID, mSkillInfo.id); continue; } if (SkillStage.IsStageTrait(SkillStageTrait.FirstStage, stageInfo)) { firstStageID = stageInfo.id; break; } } if (firstStageID < 0) { Debug.LogError("Error: 找不到初始技能段,技能ID:{0}", mSkillInfo.id); return; } SetStage(firstStageID); if (mCurStage == null) { mSkillState = SkillState.Break; return; } Character skillTarget = mSkillContext.SkillTarget; if (mSkillInfo.targetType != (int)SkillTargetType.All && skillTarget != null) { Vector3 dir = skillTarget.Position - Owner.Position; Owner.Direction = dir; } if (!SkillStage.IsStageTrait(SkillStageTrait.AllowMove, mCurStage.mStageInfo) || SkillStage.IsStageTrait(SkillStageTrait.MoveBreak, mCurStage.mStageInfo)) { Owner.StopMove(false); } mSkillState = SkillState.Using; SkillBegin msg = new SkillBegin(); msg.uid = Owner.gid; msg.skillID = SkillID; msg.position = Vector3Packat.FromVector3(Owner.Position); msg.direction = Vector3Packat.FromVector3(Owner.Direction); Scene scn = Owner.mScene; for (int i = 0; i < scn.GetPlayerCount(); ++i) { Player player = scn.GetPlayerByIndex(i); if (player == Owner) { continue; } NetWork.NotifyMessage(player.UserID, STC.STC_SkillBegin, msg); } }
public static SkillResult UseSkill(SkillHandle handle) { if (handle.caster == null || handle.caster.IsCannotFlag(CannotFlag.CannotSkill)) { return(SkillResult.InvalidCaster); } Skill lastSkill = handle.caster.GetSkill(); if (lastSkill != null) { SkillStage stage = lastSkill.mCurStage; if (stage != null) { if (SkillStage.IsStageTrait(SkillStageTrait.WaitBreakStage, stage.mStageInfo)) { if (stage.mStageEnd == null) { WaitBreakStage onStageEnd = new WaitBreakStage(); onStageEnd.nextSkillHandle = handle; stage.SetBreak(SkillBreakType.OtherSkill, false, onStageEnd.OnStageEnd); } return(SkillResult.CannotBreak); } if (!SkillStage.IsStageTrait(SkillStageTrait.BreakSelf, stage.mStageInfo) && lastSkill.SkillID == handle.skillID) { return(SkillResult.CannotBreak); } if (!SkillStage.IsStageTrait(SkillStageTrait.SkillBreak, stage.mStageInfo)) { return(SkillResult.CannotBreak); } } } excel_skill_list skillExcel = excel_skill_list.Find(handle.skillID); if (skillExcel == null) { return(SkillResult.ExcelNotExist); } Character target = handle.caster.mScene.FindCharacter(handle.skillTargetID); SkillTargetType targetType = (SkillTargetType)skillExcel.targetType; if (targetType != SkillTargetType.All) { if (target == null) { return(SkillResult.InvalidTarget); } if (targetType == SkillTargetType.Enemy && !CampSystem.IsEnemy(handle.caster, target)) { return(SkillResult.InvalidTarget); } if (targetType == SkillTargetType.Friend && !CampSystem.IsFriend(handle.caster, target)) { return(SkillResult.InvalidTarget); } } if (target == null && skillExcel.maxDistance > 0.0f) { return(SkillResult.InvalidTarget); } SkillContext context = new SkillContext(); context.mSkillID = handle.skillID; context.mOwner = handle.caster; context.SkillTargetID = handle.skillTargetID; if (!handle.autoTargetPos) { context.TargetPos = handle.targetPos; } else { context.TargetPos = target == null ? Vector3.zero : target.Position; } Skill skill = new Skill(handle.skillID, context); handle.caster.SetSkill(skill); skill.mSkillEnd = handle.skillEndMethod; ReqSkill notifyMsg = new ReqSkill(); notifyMsg.skillID = handle.skillID; notifyMsg.casterID = handle.caster.gid; notifyMsg.targetID = handle.skillTargetID; notifyMsg.autoTargetPos = handle.autoTargetPos; notifyMsg.targetPos = Vector3Packat.FromVector3(handle.targetPos); notifyMsg.position = Vector3Packat.FromVector3(handle.caster.Position); notifyMsg.direction = Vector3Packat.FromVector3(handle.caster.Direction); for (int i = 0; i < handle.caster.mScene.GetPlayerCount(); ++i) { Player player = handle.caster.mScene.GetPlayerByIndex(i); NetWork.NotifyMessage(player.UserID, STC.STC_SkillNotify, notifyMsg); } return(SkillResult.Success); }