Exemple #1
0
        public void Update()
        {
            if (self.DistanceToActor(target) <= ai.GetCurrentCastRange(target) || self.Status.CastingSkill)
            {
                DateTime now = DateTime.Now;
                if (!self.Status.CastingSkill)
                {
                    if (now > self.Status.SkillCooldownEnd && self.BaseData.Skill.Count > 0)
                    {
                        if (DateTime.Now < nextTime)
                        {
                            return;
                        }

                        nextTime = DateTime.Now.AddMilliseconds(self.BaseData.CombatThinkPeriod);

                        self.Dir = self.DirectionFromTarget(target);
                        curSkill = ChooseSkill(target);
                        if (curSkill == null)
                        {
                            return;
                        }

                        SkillArg arg = new SkillArg()
                        {
                            Caster       = self,
                            Dir          = self.Dir,
                            Target       = (curSkill.BaseData.SkillType == SkillType.NoTarget || curSkill.BaseData.SkillType == SkillType.Self) ? self : target,
                            Skill        = curSkill,
                            SkillSession = (byte)Global.Random.Next(0, 255)
                        };
                        Skills.SkillManager.Instance.SkillCast(arg);
                    }
                }
            }
            else
            {
                Finish();
            }
        }
Exemple #2
0
 public void Update()
 {
     if (currentPath == null)
     {
         ReCalculatePath();
     }
     if (self.DistanceToActor(target) > ai.GetCurrentCastRange(target) * 0.75f)
     {
         if (target.DistanceToPoint(x, y, z) > 100)
         {
             ReCalculatePath();
         }
         if (currentPath.Count > curPathIdx)
         {
             PathNode node = currentPath[curPathIdx++];
             if (curPathIdx % 2 == 0)
             {
                 MoveArgument arg = new MoveArgument()
                 {
                     X = node.X,
                     Y = node.Y,
                     Z = map.HeightMapBuilder.GetZ((short)node.X, (short)node.Y, (short)node.Z)
                 };
                 if (arg.Z == 0)
                 {
                     status = CommandStatus.Finished;
                     return;
                 }
                 arg.Dir         = self.DirectionFromTarget(node.X, node.Y);
                 arg.Speed       = (ushort)(500 * ((float)500 / self.Speed));
                 arg.DashID      = 0;
                 arg.DashUnknown = 0;
                 arg.BNSMoveType = MoveType.Run;
                 map.MoveActor(self, arg);
             }
         }
         else
         {
             if (curPathIdx % 2 == 1)
             {
                 PathNode     node = currentPath[curPathIdx - 1];
                 MoveArgument arg  = new MoveArgument()
                 {
                     X = node.X,
                     Y = node.Y,
                     Z = map.HeightMapBuilder.GetZ((short)node.X, (short)node.Y, (short)node.Z)
                 };
                 if (arg.Z == 0)
                 {
                     status = CommandStatus.Finished;
                     return;
                 }
                 arg.Dir         = self.DirectionFromTarget(node.X, node.Y);
                 arg.Speed       = self.Speed;
                 arg.DashID      = 0;
                 arg.DashUnknown = 0;
                 arg.BNSMoveType = MoveType.Run;
                 map.MoveActor(self, arg);
             }
             status = CommandStatus.Finished;
         }
     }
     else
     {
         status = CommandStatus.Finished;
     }
 }
Exemple #3
0
        private void DoNormal()
        {
            currentTarget = GetCurrentTarget();
            if (currentTarget != null && (npc.DistanceToActor(currentTarget) > 500 || (currentTarget.Status.Dead && !currentTarget.Status.Recovering)))
            {
                hateTable.TryRemove(currentTarget.ActorID, out int removed);
                currentTarget = null;
            }
            if (currentCommand == null)
            {
                if (currentTarget == null)
                {
                    period = 1000;
                    if (!HasVisiblePlayer())
                    {
                        sleepCounter++;
                        if (sleepCounter > 100)
                        {
                            Deactivate();
                            sleepCounter = 0;
                        }
                    }
                    else
                    {
                        sleepCounter = 0;
                    }

                    CheckAggro();
                    if (npc.MoveRange > 0 || (npc.DistanceToPoint(npc.X_Ori, npc.Y_Ori, npc.Z_Ori) > npc.MoveRange && npc.MoveRange > 0))
                    {
                        if (Global.Random.Next(0, 99) < 30)
                        {
                            Vec3 vec            = Vec3.Zero;
                            int  shouldDistance = 75;
                            int  dis            = npc.DistanceToPoint(npc.X_Ori, npc.Y_Ori, npc.Z_Ori);
                            if (dis > npc.MoveRange)
                            {
                                int   deltaX   = npc.X_Ori - npc.X;
                                int   deltaY   = npc.Y_Ori - npc.Y;
                                float distance = (float)(Math.Sqrt(deltaX * deltaX + deltaY * deltaY));
                                vec.X = deltaX / distance;
                                vec.Y = deltaY / distance;
                                if (dis < shouldDistance)
                                {
                                    shouldDistance = dis;
                                }
                            }
                            else
                            {
                                ushort dir = (ushort)Global.Random.Next(0, 359);
                                vec = dir.DirectionToVector();
                            }
                            if (shouldDistance > 15)
                            {
                                vec   *= shouldDistance;
                                vec.X += npc.X;
                                vec.Y += npc.Y;
                                var points = from p in map.HeightMapBuilder.GetZ((short)vec.X, (short)vec.Y)
                                             orderby Math.Abs(npc.Z - p.Key)
                                             select p;

                                currentCommand = new Move(this, npc, (short)vec.X, (short)vec.Y, points.FirstOrDefault().Key);
                            }
                        }
                    }
                }
                else
                {
                    period = 400;
                    if (npc.DistanceToActor(currentTarget) <= GetCurrentCastRange(currentTarget))
                    {
                        currentCommand = new Attack(this, npc, currentTarget);
                    }
                    else
                    {
                        currentCommand = new Chase(this, npc, currentTarget);
                    }
                }
            }
            else
            {
                if (currentTarget == null)
                {
                    CheckAggro();
                }

                currentCommand.Target = currentTarget;
                if (currentCommand.Status == CommandStatus.Running)
                {
                    currentCommand.Update();
                }
                else
                {
                    currentCommand = null;
                }
            }
        }