Esempio n. 1
0
        void Regular(Entities.Monster mob)
        {
            #region Poison
            if (mob.ContainsFlag1(Enums.Effect1.Poisoned))
            {
                if (DateTime.Now >= mob.LastPoison.AddMilliseconds(3000))
                {
                    mob.LastPoison = DateTime.Now;
                    if (mob.PoisonEffect > 0)
                    {
                        uint damage = (uint)((mob.HP / 100) * mob.PoisonEffect);
                        if (mob.HP > damage)
                        {
                            Packets.Interaction.Battle.Combat.HitDamage(null, mob, damage);
                            using (var interact = new Packets.InteractionPacket())
                            {
                                interact.Action    = Enums.InteractAction.Attack;
                                interact.EntityUID = mob.EntityUID;
                                interact.TargetUID = mob.EntityUID;
                                interact.UnPacked  = true;
                                interact.X         = mob.X;
                                interact.Y         = mob.Y;
                                interact.Data      = damage;
                                mob.Screen.UpdateScreen(interact, false);
                            }
                        }
                        else
                        {
                            mob.RemoveFlag1(Enums.Effect1.Poisoned);
                        }
                    }
                }
            }
            #endregion

            if (mob.Target != null)
            {
                if (mob.Target.Alive)
                {
                    if (mob.Screen.MapObjects.ContainsKey(mob.Target.EntityUID))
                    {
                        if (Core.Screen.GetDistance(mob.X, mob.Y, mob.Target.X, mob.Target.Y) <= mob.AttackRange &&
                            DateTime.Now >= mob.AttackTime)
                        {
                            mob.AttackTime = DateTime.Now.AddMilliseconds(
                                ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(
                                    mob.AttackSpeed, mob.AttackSpeed * 3));

                            #region physical attack
                            using (var interact = new Packets.InteractionPacket())
                            {
                                interact.Action    = Enums.InteractAction.Attack;
                                interact.EntityUID = mob.EntityUID;
                                interact.TargetUID = mob.Target.EntityUID;
                                interact.UnPacked  = true;
                                interact.X         = mob.Target.X;
                                interact.Y         = mob.Target.Y;
                                Packets.Interaction.Battle.Physical.Handle(mob, interact);
                            }
                            #endregion

                            return;
                        }
                    }
                }
            }

            mob.Target = null;
            foreach (Maps.IMapObject obj in mob.Screen.MapObjects.Values)
            {
                if (obj is Entities.GameClient)
                {
                    if ((obj as Entities.GameClient).ContainsFlag1(Enums.Effect1.PartiallyInvisible))
                    {
                        continue;
                    }
                    mob.Target = obj as Entities.IEntity;
                    if (!mob.Target.Alive)
                    {
                        mob.Target = null;
                        continue;
                    }
                    break;
                }
            }
        }