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); } } }
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 PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead() || npc.GetSkillStateInfo().IsSkillActivated()) { 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) { if (npc.IsUnderControl()) { data.ControlTime += deltaTime; if (data.ControlTime > m_MaxControlTime && npc.CanDisControl()) { data.ControlTime = 0; NotifyNpcAddImpact(npc, m_SuperArmorImpact); } 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 <= 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; } // 大于攻击距离 跑向目标 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; 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); 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); 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.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 PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_BossHulun 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()) { NotifyNpcAddImpact(npc, m_SuperArmorImpactId); data.ControlTime = 0; NotifyNpcSkill(npc, 380308); } } 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 (npc.GetSkillStateInfo().IsSkillActivated()) { SkillInfo curSkill = npc.GetSkillStateInfo().GetCurSkillInfo(); if (null != curSkill && curSkill.SkillId == data.ChaseTargetSkill) { NotifyNpcRun(npc); AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, deltaTime, true, this); data.IsUsingChaseSkill = true; } return; } else if (data.IsUsingChaseSkill) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); data.IsUsingChaseSkill = false; } if (1 == data.CurStage) { if (npc.Hp < npc.GetActualProperty().HpMax *data.StageTwoLimit) { data.CurStage = 2; NotifyNpcSkill(npc, data.EnterStageTwoSkill); data.CurSkillCombo = null; data.CurSkillComboIndex = 0; return; } else { if (null == data.CurSkillCombo) { data.CurSkillCombo = data.m_StageOneSkillCombo; data.CurSkillComboIndex = 0; } } } else if (2 == data.CurStage) { if (npc.Hp < npc.GetActualProperty().HpMax *data.StageThreeLimit) { data.CurStage = 3; NotifyNpcSkill(npc, data.EnterStageTwoSkill); data.CurSkillCombo = null; data.CurSkillComboIndex = 0; return; } else { if (null == data.CurSkillCombo) { data.CurSkillCombo = data.m_StageTwoSkillCombo; data.CurSkillComboIndex = 0; } } } else if (3 == data.CurStage) { if (null == data.CurSkillCombo) { data.CurSkillCombo = data.m_StageThreeSkillCombo; data.CurSkillComboIndex = 0; } } if (null != data.CurSkillCombo) { if (data.CurSkillCombo.Length > data.CurSkillComboIndex) { if (TryCastSkill(npc, data.CurSkillCombo[data.CurSkillComboIndex], target)) { data.CurSkillComboIndex = data.CurSkillComboIndex + 1; return; } } else { data.CurSkillCombo = null; data.CurSkillComboIndex = 0; } } // 大于攻击距离 跑向目标 info.Time += deltaTime; if (info.Time > m_IntervalTime) { NotifyNpcRun(npc); 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); } } }