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(); } }
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; } }
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; } } }