private void GoHomeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (!CanAiControl(npc)) { npc.GetMovementStateInfo().IsMoving = false; return; } ChangeToState(npc, (int)AiStateId.Idle); NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; AiData_Demo_Melee data = GetAiData(npc); if (null != data) { Vector3 targetPos = info.HomePos; Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); if (powDistToHome <= 1) { npc.GetMovementStateInfo().IsMoving = false; info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } else { AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, 100, true, this); } } } }
private void HandleRunAction(NpcInfo npc, CharacterInfo target, long deltaTime) { if (npc.GetSkillStateInfo().IsSkillActivated()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data && null != target) { Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); AiActionInfo aiActionInfo = data.ActiveAction; if (null != aiActionInfo) { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; NotifyNpcRun(npc); AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds())) { data.ActiveAction = null; aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds(); } } }
public void Execute(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.GetAIEnable()) { NpcAiStateInfo npcAi = npc.GetAiStateInfo(); if (npcAi.CommandQueue.Count <= 0) { int curState = npcAi.CurState; if (curState > (int)AiStateId.Invalid && curState < (int)AiStateId.MaxNum) { NpcAiStateHandler handler; if (m_Handlers.TryGetValue(curState, out handler)) { if (null != handler) { handler(npc, aiCmdDispatcher, deltaTime); } } else { LogSystem.Error("Illegal ai state: " + curState + " npc:" + npc.GetId()); } } else { OnStateLogicInit(npc, aiCmdDispatcher, deltaTime); ChangeToState(npc, (int)AiStateId.Idle); } } ExecuteCommandQueue(npc, deltaTime); } }
private AiActionInfo GetFitAiAction(NpcInfo npc) { NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float dist = Geometry.Distance(srcPos, targetPos); for (int i = 0; i < data.Actions.Count; i++) { if (IsAiActionSatify(npc, target, data.Actions[i])) { return(data.Actions[i]); } } /* * foreach(AiActionInfo aiActionInfo in data.Actions){ * if(IsAiActionSatify(npc, target, aiActionInfo)){ * return aiActionInfo; * } * }*/ } } return(null); }
private void HandleTauntAction(NpcInfo npc, CharacterInfo target, long deltaTime) { if (npc.GetSkillStateInfo().IsSkillActivated()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data && null != target) { Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); AiActionInfo aiActionInfo = data.ActiveAction; if (null != aiActionInfo) { npc.GetMovementStateInfo().IsMoving = false; npc.IsTaunt = true; TrySeeTarget(npc, target); } if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds())) { npc.IsTaunt = false; data.ActiveAction = null; aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds(); } } }
private void ActionDriveHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { npc.GetMovementStateInfo().IsMoving = false; return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float dist = Geometry.Distance(srcPos, targetPos); if (data.LastGfxState != npc.GfxStateFlag) { if (data.LastGfxState == (int)GfxCharacterState_Type.KnockDown && npc.GfxStateFlag == (int)GfxCharacterState_Type.GetUp) { // 起身 OnEvent(npc, (int)AiEventEnum.GET_UP, target, deltaTime); } data.LastGfxState = npc.GfxStateFlag; } if (npc.IsUnderControl()) { data.ControlTime += deltaTime; if (data.ControlTime > data.MaxControlTime && npc.CanDisControl()) { data.ControlTime = 0; OnEvent(npc, (int)AiEventEnum.CONTROL_TIME_OVERFLOW, target, deltaTime); } return; } ExecAiAction(npc, target, deltaTime); } else { if (null != data.ActiveAction) { AiActionInfo aiActionInfo = data.ActiveAction; AiActionForceStopDelegate handler = GetAiActionForceStopHandler(aiActionInfo.Config.AiActionType); if (null != handler) { handler(npc, target); } } else { npc.GetMovementStateInfo().IsMoving = false; } ChangeToState(npc, (int)AiStateId.Pursuit); } } }
protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time = 0; npc.GetMovementStateInfo().IsMoving = false; info.HomePos = npc.GetMovementStateInfo().GetPosition3D(); info.Target = 0; }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (!CanAiControl(npc)) { npc.GetMovementStateInfo().IsMoving = false; return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); // 遇敌是播放特效, 逗留两秒。 if (data.WaitTime <= npc.MeetEnemyStayTime) { if (!data.HasMeetEnemy) { NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack); data.HasMeetEnemy = true; } TrySeeTarget(npc, target); data.WaitTime += deltaTime; return; } // 走向目标1.5秒 if (data.MeetEnemyWalkTime < npc.MeetEnemyWalkTime) { data.MeetEnemyWalkTime += deltaTime; NotifyNpcWalk(npc); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } return; } ChangeToState(npc, (int)AiStateId.ActionDrive); } else { ChangeToState(npc, (int)AiStateId.Idle); } } }
protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time = 0; npc.GetMovementStateInfo().IsMoving = false; info.Target = 0; BlackBoard_SmallMouse blackBoradInfo = GetBlackBorad(npc); blackBoradInfo.AddAliveNpc(npc.GetId()); }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (!CanAiControl(npc)) { npc.GetMovementStateInfo().IsMoving = false; return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; if (GetAiData(npc).HasPatrolData) { npc.GetMovementStateInfo().IsMoving = false; ChangeToState(npc, (int)AiStateId.PatrolCommand); } else { CharacterInfo target = null; if (info.IsExternalTarget) { target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(npc, info.Target); if (null == target) { target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY); if (null != target) { info.Target = target.GetId(); } } } else { target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY); if (null != target) { info.Target = target.GetId(); } } if (null != target) { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Pursuit); } } } }
private void NormalActionStartHandler(NpcInfo npc, CharacterInfo target) { NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data && null != target) { AiActionInfo aiActionInfo = data.ActiveAction; if (null != aiActionInfo) { //aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds(); aiActionInfo.StartTime = TimeUtility.GetServerMilliseconds(); } } }
private void PathFindingCommandHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { // Path has found. if (!npc.UnityPathFinding) { return; } if (npc.PathFindingFinished) { // npc.PathFindingFinished = false; NpcAiStateInfo info = npc.GetAiStateInfo(); ChangeToState(npc, info.PreviousState); } }
protected virtual void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time = 0; npc.GetMovementStateInfo().IsMoving = false; info.HomePos = npc.GetMovementStateInfo().GetPosition3D(); info.Target = 0; if (!string.IsNullOrEmpty(info.AiParam[0])) { if (int.Parse(info.AiParam[0]) == 1) { AiLogicUtility.InitPatrolData(npc, this); } } }
private void ExecuteCommandQueue(NpcInfo npc, long deltaTime) { NpcAiStateInfo npcAi = npc.GetAiStateInfo(); while (npcAi.CommandQueue.Count > 0) { IAiCommand cmd = npcAi.CommandQueue.Peek(); if (cmd.Execute(deltaTime)) { npcAi.CommandQueue.Dequeue(); } else { break; } } }
public void UpdateTarget(NpcInfo npc) { if (npc.GetAIEnable()) { NpcAiStateInfo npcAi = npc.GetAiStateInfo(); long curTime = TimeUtility.GetServerMilliseconds(); if (npcAi.Target > 0) { if (curTime > npcAi.LastChangeTargetTime + m_ChangeTargetCD && curTime > npc.GetCombatStatisticInfo().LastHitTime + m_MaxChaseTime) { npcAi.Target = 0; NotifyNpcTargetChange(npc); npcAi.LastChangeTargetTime = curTime; LogSystem.Debug("Npc {0} changed target", npc.GetId()); } } } }
private void NormalForceStopHandler(NpcInfo npc) { NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data) { npc.GetMovementStateInfo().IsMoving = false; npc.IsTaunt = false; NotifyNpcRun(npc); AiActionInfo aiActionInfo = data.ActiveAction; if (null != aiActionInfo) { data.ActiveAction = null; aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds(); } } }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (!CanAiControl(npc)) { npc.GetMovementStateInfo().IsMoving = false; return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Demo_Melee data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); if (powDist < dist * dist) { npc.GetMovementStateInfo().IsMoving = false; info.Time = 0; data.Time = 0; ChangeToState(npc, (int)AiStateId.Combat); NotifyNpcMove(npc); } else { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } } }
private void HandleSelfImpactAction(NpcInfo npc, CharacterInfo target, long deltaTime) { if (npc.GetSkillStateInfo().IsSkillActivated()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data && null != target) { Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); AiActionInfo aiActionInfo = data.ActiveAction; if (null != aiActionInfo && !String.IsNullOrEmpty(aiActionInfo.Config.ActionParam)) { NotifyNpcAddImpact(npc, int.Parse(aiActionInfo.Config.ActionParam)); } data.ActiveAction = null; aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds(); } }
private void ExecAiAction(NpcInfo npc, CharacterInfo target, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != info && null != data) { if (null != data.ActiveAction) { AiActionInfo aiActionInfo = data.ActiveAction; AiActionExcueteDelegate handler = GetAiActionExcuteHandler(aiActionInfo.Config.AiActionType); if (null != handler) { handler(npc, target, deltaTime); } } else { if (data.ActionStack.Count > 0) { data.ActiveAction = data.ActionStack.Pop(); } else { data.ActiveAction = GetFitAiAction(npc); } if (null != data.ActiveAction) { AiActionInfo aiActionInfo = data.ActiveAction; AiActionStartDelegate handler = GetAiActionStartHandler(aiActionInfo.Config.AiActionType); if (null != handler) { handler(npc, target); } } } } }
public virtual void StartImpact(CharacterInfo obj, int impactId) { if (null != obj) { ImpactInfo impactInfo = obj.GetSkillStateInfo().GetImpactInfoById(impactId); if (null != impactInfo) { if (impactInfo.ConfigData.BreakSuperArmor) { obj.SuperArmor = false; } } if (obj is NpcInfo) { NpcInfo npcObj = obj as NpcInfo; NpcAiStateInfo aiInfo = npcObj.GetAiStateInfo(); if (null != aiInfo && 0 == aiInfo.HateTarget) { aiInfo.HateTarget = impactInfo.m_ImpactSenderId; } } } }
private void HandleFleeAction(NpcInfo npc, CharacterInfo target, long deltaTime) { if (npc.GetSkillStateInfo().IsSkillActivated()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data && null != target) { Vector3 targetPos = Vector3.Zero; AiActionInfo aiActionInfo = data.ActiveAction; if (null != aiActionInfo) { float anglePlus = 0.0f; float.TryParse(aiActionInfo.Config.ActionParam, out anglePlus); if (GetEscapeTargetPos(npc, target, 3.0f, anglePlus, ref targetPos)) { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; NotifyNpcRun(npc); AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds())) { data.ActiveAction = null; npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds(); } } }
private void HandleStandAction(NpcInfo npc, CharacterInfo target, long delatTime) { if (npc.GetSkillStateInfo().IsSkillActivated()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_ActionDrive data = GetAiData(npc); if (null != data && null != target) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); AiActionInfo aiActionInfo = data.ActiveAction; if (null != aiActionInfo) { if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds())) { data.ActiveAction = null; aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds(); } } } }
public static void ExecObjMoveCommand(int objId, float x, float y, float z) { Vector3 pos = new Vector3(x, y, z); CharacterInfo obj = WorldSystem.Instance.GetCharacterById(objId); UserInfo user = obj as UserInfo; if (null != user) { if (!user.UnityPathFinding) { List <Vector3> waypoints = user.SpatialSystem.FindPath(user.GetMovementStateInfo().GetPosition3D(), pos, 1); waypoints.Add(pos); UserAiStateInfo aiInfo = user.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(waypoints); aiInfo.AiDatas.AddData(data); } data.WayPoints = waypoints; data.Index = 0; data.EstimateFinishTime = 0; data.IsFinish = false; aiInfo.ChangeToState((int)AiStateId.MoveCommand); } else { UserAiStateInfo aiInfo = user.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(null); aiInfo.AiDatas.AddData(data); } user.PathFindingFinished = false; user.GetAiStateInfo().ChangeToState((int)AiStateId.PathFinding); user.GetAiStateInfo().PreviousState = (int)AiStateId.MoveCommand; GfxSystem.ForMoveCommandPathToTarget(user, pos); } } else { NpcInfo npc = obj as NpcInfo; if (null != npc) { if (!npc.UnityPathFinding) { List <Vector3> waypoints = npc.SpatialSystem.FindPath(npc.GetMovementStateInfo().GetPosition3D(), pos, 1); waypoints.Add(pos); NpcAiStateInfo aiInfo = npc.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(waypoints); aiInfo.AiDatas.AddData(data); } data.WayPoints = waypoints; data.Index = 0; data.EstimateFinishTime = 0; data.IsFinish = false; aiInfo.ChangeToState((int)AiStateId.MoveCommand); } else { NpcAiStateInfo aiInfo = npc.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(null); aiInfo.AiDatas.AddData(data); } npc.PathFindingFinished = false; npc.GetAiStateInfo().ChangeToState((int)AiStateId.PathFinding); npc.GetAiStateInfo().PreviousState = (int)AiStateId.MoveCommand; GfxSystem.ForMoveCommandPathToTarget(npc, pos); } } } }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (!CanAiControl(npc)) { npc.GetMovementStateInfo().IsMoving = false; return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_CommonMelee data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); // 遇敌是播放特效, 逗留两秒。 if (data.WaitTime <= npc.MeetEnemyStayTime) { if (!data.HasMeetEnemy) { NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack); data.HasMeetEnemy = true; } TrySeeTarget(npc, target); data.WaitTime += deltaTime; return; } // 走向目标1.5秒 if (data.MeetEnemyWalkTime < npc.MeetEnemyWalkTime) { data.MeetEnemyWalkTime += deltaTime; NotifyNpcWalk(npc); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; if (!npc.UnityPathFinding) { AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } else { if (!npc.PathFindingFinished) { GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos); ChangeToState(npc, (int)AiStateId.PathFinding); } else { npc.PathFindingFinished = false; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } return; } // 大于攻击距离 跑向目标 if (powDist > m_AttackRange * m_AttackRange && 0 == data.CurAiAction) { npc.IsTaunt = false; NotifyNpcRun(npc); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; if (!npc.UnityPathFinding) { AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } else { if (!npc.PathFindingFinished) { GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos); ChangeToState(npc, (int)AiStateId.PathFinding); } else { npc.PathFindingFinished = false; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } } else { //小于攻击距离 if (data.CurAiAction == (int)AiAction.NONE) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); data.CurAiAction = (int)GetNextAction(); } switch (data.CurAiAction) { case (int)AiAction.SKILL: if (0 >= data.SkillToCast) { data.SkillToCast = GetCanCastSkillId(npc, (float)Math.Sqrt(powDist)); } if (0 >= data.SkillToCast || !AiLogicUtility.CanCastSkill(npc, data.SkillToCast, target)) { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; NotifyNpcRun(npc); if (!npc.UnityPathFinding) { AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } else { if (!npc.PathFindingFinished) { GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos); ChangeToState(npc, (int)AiStateId.PathFinding); } else { npc.PathFindingFinished = false; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } } else { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); if (TryCastSkill(npc, data.SkillToCast, target)) { data.CurAiAction = 0; data.SkillToCast = -1; } } break; case (int)AiAction.STAND: data.ChaseStandTime += deltaTime; TrySeeTarget(npc, target); if (data.ChaseStandTime > m_ChaseWalkMaxTime) { data.ChaseStandTime = 0; data.CurAiAction = 0; } break; case (int)AiAction.TAUNT: npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); npc.IsTaunt = true; data.TauntTime += deltaTime; TrySeeTarget(npc, target); if (data.TauntTime > m_TauntTime) { npc.IsTaunt = false; data.TauntTime = 0; data.CurAiAction = 0; } break; case (int)AiAction.WALK: data.ChaseWalkTime += deltaTime; info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; NotifyNpcWalk(npc); if (!npc.UnityPathFinding) { AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } else { if (!npc.PathFindingFinished) { GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos); ChangeToState(npc, (int)AiStateId.PathFinding); } else { npc.PathFindingFinished = false; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } if (data.ChaseWalkTime > m_ChaseStandMaxTime) { data.ChaseWalkTime = 0; data.CurAiAction = 0; } break; } } } else { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } } }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead() || npc.GetSkillStateInfo().IsSkillActivated()) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_BossDevilWarrior data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { if (npc.IsUnderControl()) { data.ControlTime += deltaTime; if (data.ControlTime >= m_MaxControlTime && npc.CanDisControl() && AiLogicUtility.CanCastSkill(npc, data.DecontrolSkill, target)) { NotifyNpcAddImpact(npc, m_DisControlImpact); data.ControlTime = 0; TryCastSkill(npc, data.DecontrolSkill, target, false); data.CurSkillCombo = data.DecontrolCombo; data.CurSkillComboIndex = 0; } return; } float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); // 遇敌是播放特效, 逗留两秒。 if (data.WaitTime <= m_ResponseTime) { if (!data.HasMeetEnemy) { NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack); data.HasMeetEnemy = true; } TrySeeTarget(npc, target); data.WaitTime += deltaTime; return; } if (null != data.CurSkillCombo) { if (data.CurSkillCombo.Length > data.CurSkillComboIndex) { TryCastSkill(npc, data.CurSkillCombo[data.CurSkillComboIndex], target); data.CurSkillComboIndex = data.CurSkillComboIndex + 1; } else { data.CurSkillCombo = null; data.CurSkillComboIndex = 0; } } // 大于攻击距离 跑向目标 if (powDist > m_AttackRange * m_AttackRange) { if ((int)GfxCharacterState_Type.HitFly == target.GfxStateFlag) { if (TryCastSkill(npc, data.FlyRangeSkill, target)) { return; } } else { if (TryCastSkill(npc, data.RangeSkill, target)) { return; } } info.Time += deltaTime; if (info.Time > m_IntervalTime) { NotifyNpcRun(npc); info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } else { if ((int)GfxCharacterState_Type.HitFly == target.GfxStateFlag) { if (TryCastSkill(npc, data.FlyMeeleSkill, target)) { return; } } else { if (TryCastSkill(npc, data.MeeleSkill, target)) { return; } } } } else { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } } }
private void EscapeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (!CanAiControl(npc)) { npc.GetMovementStateInfo().IsMoving = false; return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_Bluelf data = GetAiData(npc); if (null != data) { data.EscapeTime += deltaTime; CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); if (powDist < m_SafeRange * m_SafeRange) { Vector3 escapePos = Vector3.Zero; if (AiLogicUtility.GetEscapeTargetPos(npc, target, 3.0f, ref escapePos)) { info.Time += deltaTime; if (info.Time > m_IntervalTime) { NotifyNpcRun(npc); info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, escapePos, m_IntervalTime, true, this); } } else { LogSystem.Debug("Can't find WalkAble place"); } } else { TryCastSkill(npc, GetCanCastSkillId(npc, (float)Math.Sqrt(powDist)), target); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; data.EscapeTime = 0; ChangeToState(npc, (int)AiStateId.Pursuit); } } else { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } if (data.EscapeTime > m_MaxEscapeTime) { data.EscapeTime = 0; npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Pursuit); } } }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_CommonBoss data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { if (npc.GetSkillStateInfo().IsSkillActivated()) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); data.LastUseSkillTime = TimeUtility.GetServerMilliseconds(); return; } if (npc.IsUnderControl()) { data.ControlTime += deltaTime; if (data.ControlTime >= m_MaxControlTime && npc.CanDisControl() && AiLogicUtility.CanCastSkill(npc, m_DisControlSkillId, target)) { NotifyNpcAddImpact(npc, m_DisControlImpactId); data.ControlTime = 0; TryCastSkill(npc, m_DisControlSkillId, target, false); } return; } float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); // 遇敌是播放特效, 逗留两秒。 if (data.WaitTime <= m_ResponseTime) { if (!data.HasMeetEnemy) { NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack); data.HasMeetEnemy = true; } TrySeeTarget(npc, target); data.WaitTime += deltaTime; return; } int skillId = GetCanCastSkillId(npc, (float)Math.Sqrt(powDist)); long curTime = TimeUtility.GetServerMilliseconds(); if (-1 != skillId && curTime - data.LastUseSkillTime > m_SkillInterval && AiLogicUtility.CanCastSkill(npc, skillId, target)) { if (TryCastSkill(npc, skillId, target, true)) { NotifyNpcAddImpact(npc, m_SuperArmorImpactId); } } else { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } else { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } } }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; DropOutInfo dropInfo = npc.GetAiStateInfo().AiDatas.GetData <DropOutInfo>(); if (null != dropInfo) { if (npc.IsBorning) { Vector3 curPos = npc.GetMovementStateInfo().GetPosition3D(); if (dropInfo.BornTarget == Vector3.Zero) { double tempAngle = CrossEngineHelper.Random.NextFloat() * Math.PI; float length = CrossEngineHelper.Random.NextFloat() * 3.0f; dropInfo.BornTarget = curPos + new Vector3((float)Math.Cos(tempAngle), 0, (float)Math.Sin(tempAngle)) * length; dropInfo.BornAngle = (float)tempAngle; } //npc.GetMovementStateInfo().SetMoveDir(dropInfo.BornAngle); //npc.GetMovementStateInfo().IsMoving = true; //NotifyNpcWalk(npc); return; } else { if (!dropInfo.IsBornOver) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); } } } UserInfo target = null; target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_FRIEND, AiTargetType.USER) as UserInfo; if (null != target && !npc.NeedDelete) { Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); float dis = Geometry.Distance(srcPos, targetPos); float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); if (dis <= m_AttractRange && dis > m_PickUpRange) { // 吸取 float move = npc.GetActualProperty().MoveSpeed *m_IntervalTime / 1000; npc.GetMovementStateInfo().SetMoveDir(angle); //npc.GetMovementStateInfo().PositionY = targetPos.Y + (1 - dis / m_AttractRange) * m_Height; //npc.GetMovementStateInfo().SetPosition2D(srcPos.X + move * (float)Math.Cos(angle), srcPos.Z + move * (float)Math.Sin(angle)); npc.GetMovementStateInfo().IsMoving = true; NotifyNpcRun(npc); } else if (dis <= m_PickUpRange) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); string path = ""; if (null != dropInfo) { switch (dropInfo.DropType) { case DropOutType.GOLD: target.Money += dropInfo.Value; target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value); path = "ef_head"; break; case DropOutType.HP: int addHp = (int)(target.GetActualProperty().HpMax *dropInfo.Value / 100.0f); if (target.GetActualProperty().HpMax > addHp + target.Hp) { target.SetHp(Operate_Type.OT_Relative, addHp); } else { target.SetHp(Operate_Type.OT_Absolute, target.GetActualProperty().HpMax); } target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, addHp, 0); path = "Bone_Root"; break; case DropOutType.MP: int addEnergy = (int)(target.GetActualProperty().EnergyMax *dropInfo.Value / 100.0f); if (target.GetActualProperty().EnergyMax > addEnergy + target.Energy) { target.SetEnergy(Operate_Type.OT_Relative, addEnergy); } else { target.SetEnergy(Operate_Type.OT_Absolute, target.GetActualProperty().EnergyMax); } target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, 0, addEnergy); path = "Bone_Root"; break; case DropOutType.MULT_GOLD: target.Money += dropInfo.Value; target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value); path = "ef_head"; break; } if (null != OnDropoutPlayEffect) { OnDropoutPlayEffect(target, npc, dropInfo.Particle, path, (int)dropInfo.DropType, dropInfo.Value); } } npc.NeedDelete = true; } } } }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead() || npc.GetSkillStateInfo().IsSkillActivated()) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_Bluelf data = GetAiData(npc); if (null != data) { if (npc.IsUnderControl()) { data.ControlTime += deltaTime; if (data.ControlTime >= m_MaxControlTime && npc.CanDisControl()) { NotifyNpcAddImpact(npc, m_SuperAmorImpact); data.ControlTime = 0; } return; } CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); // 遇敌是播放特效, 短暂逗留。 if (data.WaitTime <= m_ResponseTime) { if (!data.HasMeetEnemy) { NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack); data.HasMeetEnemy = true; } TrySeeTarget(npc, target); data.WaitTime += deltaTime; return; } int randomNum = CrossEngineHelper.Random.Next(0, 10); // 大于攻击距离 跑向目标 if (powDist > m_AttackRange * m_AttackRange && 0 == data.CurAiAction) { if (randomNum < 8) { TryCastSkill(npc, m_DisSkill, target); return; } else if (randomNum < 9) { TryCastSkill(npc, m_CommonSkill, target); return; } npc.IsTaunt = false; NotifyNpcRun(npc); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } else { //小于攻击距离 if (data.CurAiAction == (int)AiAction.NONE) { if (randomNum < 7) { TryCastSkill(npc, m_CommonSkill, target); return; } npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); data.CurAiAction = (int)GetNextAction(); } switch (data.CurAiAction) { case (int)AiAction.SKILL: int skillId = GetCanCastSkillId(npc, (float)Math.Sqrt(powDist)); if (-1 == skillId) { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; NotifyNpcRun(npc); AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } else { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); if (TryCastSkill(npc, skillId, target)) { data.CurAiAction = 0; } } break; case (int)AiAction.STAND: data.ChaseStandTime += deltaTime; TrySeeTarget(npc, target); if (data.ChaseStandTime > m_ChaseWalkMaxTime) { data.ChaseStandTime = 0; data.CurAiAction = 0; } break; case (int)AiAction.TAUNT: npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); npc.IsTaunt = true; data.TauntTime += deltaTime; TrySeeTarget(npc, target); if (data.TauntTime > m_TauntTime) { npc.IsTaunt = false; data.TauntTime = 0; data.CurAiAction = 0; } break; case (int)AiAction.WALK: data.ChaseWalkTime += deltaTime; info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; NotifyNpcWalk(npc); AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } if (data.ChaseWalkTime > m_ChaseWalkMaxTime) { data.ChaseWalkTime = 0; data.CurAiAction = 0; } break; } } } else { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } } }
private void CombatHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (!CanAiControl(npc)) { npc.GetMovementStateInfo().IsMoving = false; return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > m_IntervalTime) { AiData_Demo_Melee data = GetAiData(npc); if (null != data) { data.Time += info.Time; info.Time = 0; CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); //CharacterInfo target = AiLogicUtility.GetInterestestTargetHelper(npc, CharacterRelation.RELATION_ENEMY, AiTargetType.USER); if (null != target) { float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); if (powDist < dist * dist) { float rps = npc.GetActualProperty().Rps; long curTime = TimeUtility.GetServerMilliseconds(); float dir = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); NotifyNpcFace(npc, dir); //if (rps > 0.001f && curTime - data.LastUseSkillTime > 1000 / rps) { data.Time = 0; data.LastUseSkillTime = curTime; List <SkillInfo> skillInfos = npc.GetSkillStateInfo().GetAllSkill(); if (skillInfos.Count > 0) { int index = CrossEngineHelper.Random.Next(skillInfos.Count); if (null != skillInfos[index]) { NotifyNpcSkill(npc, skillInfos[index].SkillId); } } //} } else { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; data.FoundPath.Clear(); ChangeToState(npc, (int)AiStateId.Pursuit); } } } else { info.Time = 0; } } }