private void MoveHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { return; } UserAiStateInfo info = user.GetAiStateInfo(); AiData_UserSelf_General data = GetAiData(user); Vector3 targetPos = info.TargetPos; Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); if (null != data && !IsReached(srcPos, targetPos)) { if (info.IsTargetPosChanged) { info.IsTargetPosChanged = false; data.FoundPath.Clear(); } PathToTargetPro(user, data.FoundPath, targetPos, deltaTime); } else { user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; info.Target = 0; info.TargetPos = Vector3.Zero; data.Time = 0; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Idle); } }
private void InteractObject(int key_code, int what) { UserInfo myself = WorldSystem.Instance.GetPlayerSelf(); if (myself != null && myself.IsDead()) { } WorldSystem.Instance.InteractObject(); }
private void MoveUser(UserInfo obj, long deltaTime) { MovementStateInfo msi = obj.GetMovementStateInfo(); if (null != obj.ControlledObject) { MovementStateInfo ctrlMsi = obj.ControlledObject.GetMovementStateInfo(); ctrlMsi.IsMoving = msi.IsMoving; ctrlMsi.SetFaceDir(msi.GetFaceDir()); ctrlMsi.SetMoveDir(msi.GetMoveDir()); } if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep) || obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition)) { return; } //玩家移动中忽略阻挡,由客户端与AI来规划路径。 if (!obj.IsDead() && msi.IsMoving && !msi.IsSkillMoving && !msi.IsMoveMeetObstacle) { Vector3 pos = msi.GetPosition3D(); float speed = (float)obj.GetRealControlledObject().GetActualProperty().MoveSpeed *(float)obj.VelocityCoefficient; float distance = (speed * (float)(int)deltaTime) / 1000.0f; //LogSystem.Debug("MovementSystem user:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance); float x = 0, y = 0; Vector2 newPos = new Vector2(); if (obj.GetAiStateInfo().CurState != (int)AiStateId.Invalid && msi.CalcDistancSquareToTarget() < distance * distance) { x = msi.TargetPosition.X; y = msi.TargetPosition.Z; AdjustPosition(obj.SpatialSystem, ref x, ref y); newPos = new Vector2(x, y); msi.SetPosition2D(newPos); } else { float cosV = (float)msi.MoveDirCosAngle; float sinV = (float)msi.MoveDirSinAngle; y = pos.Z + distance * cosV; x = pos.X + distance * sinV; AdjustPosition(obj.SpatialSystem, ref x, ref y); newPos = new Vector2(x, y); msi.SetPosition2D(newPos); } if (null != obj.ControlledObject) { obj.ControlledObject.GetMovementStateInfo().SetPosition2D(newPos); } } }
private void FindPath(Vector3 targetpos) { UserInfo playerself = WorldSystem.Instance.GetPlayerSelf(); if (playerself != null && !playerself.IsDead()) { if (Vector3.Zero == targetpos) { return; } UserAiStateInfo aiInfo = playerself.GetAiStateInfo(); if (null != aiInfo) { StopFindPath(playerself, aiInfo); } aiInfo.TargetPos = targetpos; aiInfo.ChangeToState((int)AiStateId.Move); } }
private void IdleHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { return; } UserAiStateInfo info = user.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; CharacterInfo target = null; if (info.IsAttacked && m_AttackRangeLast > 0) { if (info.Target > 0 /* || info.TargetPos != Vector3.Zero*/) { target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(user, info.Target); if (null == target) { info.Target = 0; target = AiLogicUtility.GetNearstTargetHelper(user, CharacterRelation.RELATION_ENEMY); } } if (null != target) { info.Time = 0; info.Target = target.GetId(); info.IsAttacked = false; info.AttackRange = m_AttackRangeLast; m_AttackRangeLast = 0; ChangeToState(user, (int)AiStateId.Combat); } } } }
internal void Update(bool move_enable) { UserInfo playerself = WorldSystem.Instance.GetPlayerSelf(); if (playerself == null || playerself.IsDead()) { return; } KeyHit kh = KeyHit.None; if (move_enable) { if (ArkCrossEngineSpatial.SpatialObjType.kNPC == playerself.GetRealControlledObject().SpaceObject.GetObjType()) { NpcInfo npcInfo = playerself.GetRealControlledObject().CastNpcInfo(); if (null != npcInfo) { if (!npcInfo.CanMove) { return; } } } if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.W))) { kh |= KeyHit.Up; } if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.A))) { kh |= KeyHit.Left; } if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.S))) { kh |= KeyHit.Down; } if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.D))) { kh |= KeyHit.Right; } } Motion m = kh == KeyHit.None ? Motion.Stop : Motion.Moving; MotionChanged = MotionStatus != m || last_key_hit_ != kh; if (MotionChanged) { //GfxSystem.GfxLog("MotionChanged:{0}!={1} || {2}!={3}", MotionStatus, m, last_key_hit_, kh); } last_key_hit_ = kh; MotionStatus = m; MoveDir = CalcMoveDir(kh); if (MoveDir < 0) { MotionStatus = Motion.Stop; } if (MotionChanged) { //GfxSystem.GfxLog("InputMoveDir:{0} Pos:{1}", MoveDir, playerself.GetMovementStateInfo().GetPosition3D().ToString()); } }
private void CombatHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { return; } UserAiStateInfo info = user.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { AiData_UserSelf_General data = GetAiData(user); if (null != data) { data.Time += info.Time; info.Time = 0; //info.IsAttacked = false; CharacterInfo target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(user, info.Target); Vector3 targetPos = Vector3.Zero; float dist = info.AttackRange; if (null != target) { targetPos = target.GetMovementStateInfo().GetPosition3D(); } else { targetPos = info.TargetPos; } Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); if (!info.IsAttacked) { if (powDist < dist * dist) { data.Time = 0; m_AttackRangeLast = info.AttackRange; info.AttackRange = 0; info.IsAttacked = true; float dir = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); user.GetMovementStateInfo().SetFaceDir(dir); user.GetMovementStateInfo().SetMoveDir(dir); if (null != target) { if (null != OnUserStartAttack) { OnUserStartAttack(user, targetPos.X, targetPos.Y, targetPos.Z); } } else { NotifyUserSkill(user, 1); info.IsAttacked = false; } /// user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Idle); } else { user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; info.IsAttacked = false; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Pursuit); } } } else { info.Time = 0; } } }
private void PursuitHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { return; } UserAiStateInfo info = user.GetAiStateInfo(); AiData_UserSelf_General data = GetAiData(user); if (null != data) { if (info.Target > 0) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(user, info.Target); if (null != target) { float dist = info.AttackRange - 1.0f; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); if (powDist < dist * dist) { user.GetMovementStateInfo().IsMoving = false; info.Time = 0; data.Time = 0; ChangeToState(user, (int)AiStateId.Combat); NotifyUserMove(user); } else { info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; CharacterInfo target2 = GetCanAttackUserTarget(user); if (null == target2) { AiLogicUtility.GetNearstTargetHelper(user, CharacterRelation.RELATION_ENEMY); } if (null == target2 || target == target2) { PathToTargetPro(user, data.FoundPath, targetPos, deltaTime); } else { info.Target = target2.GetId(); return; } } } } else { user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; data.Time = 0; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Idle); } } else { float dist = info.AttackRange; Vector3 targetPos = info.TargetPos; Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); if (powDist < dist * dist) { user.GetMovementStateInfo().IsMoving = false; info.Time = 0; data.Time = 0; ChangeToState(user, (int)AiStateId.Combat); NotifyUserMove(user); } else { info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; PathToTargetPro(user, data.FoundPath, targetPos, deltaTime); } } } } }
private void PursuitHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { user.GetMovementStateInfo().IsMoving = false; return; } if (user.IsUnderControl()) { user.GetMovementStateInfo().IsMoving = false; return; } if (user.GetSkillStateInfo().IsSkillActivated()) { user.GetMovementStateInfo().IsMoving = false; return; } UserAiStateInfo info = user.GetAiStateInfo(); AiData_UserSelf_General data = GetAiData(user); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(user, info.Target); if (null != target) { float dist = (float)user.GetActualProperty().AttackRange; float distGoHome = (float)user.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); TryCastSkill(user, target, powDist); // 大于攻击距离 跑向目标 if (powDist > m_AttackRange * m_AttackRange) { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; if (!user.UnityPathFinding) { AiLogicUtility.PathToTargetWithoutObstacle(user, data.FoundPath, targetPos, m_IntervalTime, true, this); } else { if (info.PreviousState != (int)AiStateId.PathFinding) { user.PathFindingFinished = false; GfxSystem.UserSelfGeneralPathToTarget(user, targetPos); ChangeToState(user, (int)AiStateId.PathFinding); } else { AiLogicUtility.PathToTargetWithoutObstacle(user, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } } else { user.GetMovementStateInfo().IsMoving = false; NotifyUserMove(user); } } else { user.GetMovementStateInfo().IsMoving = false; NotifyUserMove(user); info.Time = 0; ChangeToState(user, (int)AiStateId.Idle); } } }