Esempio n. 1
0
        public static bool Handle(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (!attacker.Alive)
            {
                return(false);
            }

            if (!(attacker is Entities.GameClient))
            {
                return(false);
            }

            if (!(attacker as Entities.GameClient).Equipments.Contains(Enums.ItemLocation.WeaponR))
            {
                return(false);
            }

            if (!(attacker as Entities.GameClient).Equipments[Enums.ItemLocation.WeaponR].IsBow())
            {
                return(false);
            }

            (attacker as Entities.GameClient).AddStatusEffect1(Enums.Effect1.Fly, 40000);

            return(true);
        }
Esempio n. 2
0
 public static bool FixTarget(Entities.IEntity attacker, Entities.IEntity target)
 {
     if (attacker is Entities.GameClient && target is Entities.GameClient)
     {
         if ((attacker as Entities.GameClient).PKMode == Enums.PKMode.Team)
         {
             if ((attacker as Entities.GameClient).Team != null)
             {
                 if ((attacker as Entities.GameClient).Team.Members.ContainsKey(target.EntityUID))
                 {
                     return(false);
                 }
             }
             else if ((attacker as Entities.GameClient).Guild != null)
             {
                 if ((attacker as Entities.GameClient).Guild.Members.Contains((target as Entities.GameClient).DatabaseUID))
                 {
                     return(false);
                 }
                 else if ((attacker as Entities.GameClient).Guild != null)
                 {
                     if ((attacker as Entities.GameClient).Guild.IsAllie((target as Entities.GameClient).Guild.Name))
                     {
                         return(false);
                     }
                 }
             }
         }
     }
     return(true);
 }
Esempio n. 3
0
        /// <summary>
        /// Gets the ranged damage.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="attacked">The attacked.</param>
        /// <returns>Returns the damage.</returns>
        public static uint GetRangedDamage(Entities.IEntity attacker, Entities.IEntity attacked)
        {
            double damage = 0;

            if (attacker is Entities.GameClient)
            {
                if (attacked is Entities.GameClient)
                {
                    damage = GetRangedDamage_PVP((attacker as Entities.GameClient), (attacked as Entities.GameClient));
                }
                if (attacked is Entities.Monster)
                {
                    damage = GetRangedDamage_PVM((attacker as Entities.GameClient), (attacked as Entities.Monster));
                }
            }
            if (damage > 1)
            {
                if (attacker.Level > (attacked.Level + 10))
                {
                    damage *= 1.25;
                }
                else if ((attacker.Level + 10) < attacked.Level)
                {
                    damage = (damage * 0.75);
                }
            }
            damage = (damage >= 1 ? damage : 1);
            if (damage > 1)
            {
                damage += ((damage / 2) * attacker.Reborns);
            }
            return((uint)damage);
        }
Esempio n. 4
0
        public async Task Process_CompleteWithError_WhenOutgoingLinkQueueNotFound()
        {
            const string     linkName        = "abcd";
            const string     entity          = "entity";
            ISecurityContext securityContext = Substitute.For <ISecurityContext>();
            IEntityLookup    entityLookup    = Substitute.For <IEntityLookup>();
            ILoggerProvider  loggerProvider  = Substitute.For <ILoggerProvider>();

            Entities.IEntity fakeEntity = Substitute.For <Entities.IEntity>();
            var linkProcessor           = new LinkProcessor(securityContext, entityLookup, loggerProvider);

            fakeEntity.DeliveryQueue.Returns((DeliveryQueue)null);
            entityLookup.Find(Arg.Any <string>()).Returns(fakeEntity);
            securityContext.IsAuthorized(Arg.Any <Connection>()).Returns(true);
            AmqpException exception = null;
            Session       session   = await TestAmqpHost.OpenAndLinkProcessorAsync(linkProcessor);

            try
            {
                var receiver = new ReceiverLink(session, linkName, entity);

                Func <Task> action = async() => await receiver.ReceiveAsync();

                linkProcessor.ShouldSatisfyAllConditions(
                    () => exception = action.ShouldThrow <AmqpException>(),
                    () => exception.Error.Condition.ShouldBe((Symbol)ErrorCode.NotFound),
                    () => exception.Error.Description.ShouldBe("Queue not found.")
                    );
            }
            finally
            {
                await session.Connection.CloseAsync();
            }
        }
Esempio n. 5
0
 public static bool Handle(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
 {
     damage = 0;
     if (!attacker.Alive)
     {
         return(false);
     }
     if (target == null)
     {
         return(false);
     }
     if (target.Alive)
     {
         return(false);
     }
     if (attacker.EntityUID == target.EntityUID)
     {
         return(false);
     }
     if (!(target is Entities.GameClient))
     {
         return(false);
     }
     Entities.GameClient TargetClient = (target as Entities.GameClient);
     TargetClient.ForceRevive();
     usespell.AddTarget(TargetClient.EntityUID, 0);
     return(true);
 }
Esempio n. 6
0
        public async Task Process_CompleteSuccessfully_WhenOutgoingLinkQueueFound()
        {
            const string     linkName        = "abcd";
            const string     entity          = "entity";
            ISecurityContext securityContext = Substitute.For <ISecurityContext>();
            IEntityLookup    entityLookup    = Substitute.For <IEntityLookup>();
            ILoggerProvider  loggerProvider  = Substitute.For <ILoggerProvider>();

            Entities.IEntity fakeEntity = Substitute.For <Entities.IEntity>();
            var deliveryQueue           = new DeliveryQueue();
            var linkProcessor           = new LinkProcessor(securityContext, entityLookup, loggerProvider);

            entityLookup.Find(Arg.Any <string>()).Returns(fakeEntity);
            securityContext.IsAuthorized(Arg.Any <Connection>()).Returns(true);
            fakeEntity.DeliveryQueue.Returns(deliveryQueue);
            Session session = await TestAmqpHost.OpenAndLinkProcessorAsync(linkProcessor);

            try
            {
                var receiver = new ReceiverLink(session, linkName, entity);
                deliveryQueue.Enqueue(new Delivery(new Message {
                    Properties = new Properties {
                        MessageId = "msgid6746"
                    }
                }));

                Message message = await receiver.ReceiveAsync();

                message.Properties.MessageId.ShouldBe("msgid6746");
            }
            finally
            {
                await session.Connection.CloseAsync();
            }
        }
Esempio n. 7
0
        protected override bool ConsisteInsertOrUpdate(Entities.IEntity entity, DbContext context)
        {
            var ticketContext = (SynsTicketContext)context;
            var usuarioEntity = (UsuarioEntity)entity;

            var usarioLoginIguais = from a in ticketContext.UsuarioEntity
                                    where a.UsuarioId != usuarioEntity.UsuarioId &&
                                    a.Login.Equals(usuarioEntity.Login)
                                    select a;

            var usarioEmailsIguais = from a in ticketContext.UsuarioEntity
                                     where a.UsuarioId != usuarioEntity.UsuarioId &&
                                     a.Email.Equals(usuarioEntity.Email)
                                     select a;

            if (usarioLoginIguais.Count() > 0)
            {
                this.Erros.Add(new TicketException("Campo Login está duplicado"));
            }
            if (usarioEmailsIguais.Count() > 0)
            {
                this.Erros.Add(new TicketException("Campo E-mail já Existe"));
            }

            return(base.ConsisteInsertOrUpdate(entity, context));
        }
Esempio n. 8
0
        protected override bool ConsisteInsertOrUpdate(Entities.IEntity entity, DbContext context)
        {
            var ticketAndamentoContext = (SynsTicketContext)context;
            var ticketAdamentoEntity   = (TicketAndamentoEntity)entity;


            return(base.ConsisteInsertOrUpdate(entity, context));
        }
Esempio n. 9
0
 public static void HitDamage(Entities.IEntity attacker, Entities.IEntity attacked, uint damage)
 {
     attacked.HP -= (int)damage;
     if (attacked.HP <= 0)
     {
         Kill(attacker, attacked, damage);
     }
 }
Esempio n. 10
0
        public void Add(T newItem)
        {
            Entities.IEntity newEntity = _mapper.CreateEntityFromDTO(newItem);

            Type entityType = newEntity.GetType();

            db.Set(entityType).Add(newEntity);

            db.SaveChanges();
        }
Esempio n. 11
0
        public DTO.IDTOEntity CreateDTOFromEntity(Entities.IEntity entity)
        {
            Entities.Expense expense = (Entities.Expense)entity;

            return(new DTO.Expense()
            {
                Amount = expense.Amount,
                ExpenseDate = expense.ExpenseDate,
                Description = expense.Description,
                ExpenseGroupId = expense.ExpenseGroupId
            });
        }
Esempio n. 12
0
        public static bool HandleSelf(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (target != null)
            {
                if (target is Entities.NPC)
                {
                    return(false);
                }

                if (target.EntityUID != attacker.EntityUID)
                {
                    return(false);
                }
            }
            if (attacker is Entities.GameClient)
            {
                Entities.GameClient client = (attacker as Entities.GameClient);
                if (!(DateTime.Now >= client.LastSmallLongSkill.AddMilliseconds(Core.TimeIntervals.SmallLongSkillInterval)) && client.AttackPacket == null)
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                        client.Send(fmsg);
                    return(false);
                }
                client.LastSmallLongSkill = DateTime.Now;
            }
            if (spell.ID == 1190 || spell.ID == 7016)
            {
                attacker.HP += spell.Power;
            }
            else
            {
                attacker.MP += spell.Power;
            }

            uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)spell.Power, (int)spell.Power * 2);

            if ((attacker is Entities.GameClient))
            {
                (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
            }

            usespell.AddTarget(attacker.EntityUID, spell.Power);

            return(true);
        }
Esempio n. 13
0
        protected override bool ConsisteInsertOrUpdate(Entities.IEntity entity, DbContext context)
        {
            var ticketContext     = (SynsTicketContext)context;
            var ticketAnexoEntity = (TicketAnexoEntity)entity;

            var usarioLoginIguais = from a in ticketContext.TicketAnexoEntity
                                    where a.TicketAnexoId != ticketAnexoEntity.TicketAnexoId &&
                                    a.CaminhoArquivo.Equals(ticketAnexoEntity.CaminhoArquivo)
                                    select a;



            //if (usarioLoginIguais.Count() > 0)
            //    this.Erros.Add(new TicketException("Anexo com problemas, id ou caminhos iguais a outro anexo"));


            return(base.ConsisteInsertOrUpdate(entity, context));
        }
Esempio n. 14
0
        public async Task Process_CompleteSuccessfully_WhenIncomingLinkEntityFound()
        {
            const string     linkName        = "abcd";
            const string     entity          = "myEntity";
            ISecurityContext securityContext = Substitute.For <ISecurityContext>();
            IEntityLookup    entityLookup    = Substitute.For <IEntityLookup>();
            ILoggerProvider  loggerProvider  = Substitute.For <ILoggerProvider>();

            Entities.IEntity fakeEntity = Substitute.For <Entities.IEntity>();
            var linkProcessor           = new LinkProcessor(securityContext, entityLookup, loggerProvider);

            entityLookup.Find(entity).Returns(fakeEntity);
            securityContext.IsAuthorized(Arg.Any <Connection>()).Returns(true);
            Session session = await TestAmqpHost.OpenAndLinkProcessorAsync(linkProcessor);

            try
            {
                var sender  = new SenderLink(session, linkName, entity);
                var message = new Message
                {
                    Properties = new Properties {
                        MessageId = "message173"
                    },
                    BodySection = new Data {
                        Binary = Encoding.UTF8.GetBytes("hello!")
                    }
                };

                await sender.SendAsync(message);

                fakeEntity
                .Received(1)
                .Post(Arg.Is <Message>(m => m.Properties.MessageId == "message173"));
            }
            finally
            {
                await session.Connection.CloseAsync();
            }
        }
Esempio n. 15
0
        public static void Handle(Entities.IEntity attacker, InteractionPacket interact)
        {
            if (interact == null)
            {
                return;
            }

            Maps.IMapObject attackermap = attacker as Maps.IMapObject;
            if (!attackermap.Screen.ContainsEntity(interact.TargetUID))
            {
                return;
            }

            Maps.IMapObject target = null;
            if (!attackermap.Screen.GetEntity(interact.TargetUID, out target))
            {
                return;
            }
            if (target is Entities.NPC)
            {
                return;
            }

            if (target is Entities.GameClient)
            {
                if (!(target as Entities.GameClient).LoggedIn)
                {
                    return;
                }

                if (target.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                {
                    return;
                }
                if (!(DateTime.Now >= (target as Entities.GameClient).LoginProtection.AddSeconds(10)))
                {
                    return;
                }


                if (!(DateTime.Now >= (target as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                {
                    return;
                }
            }


            Entities.IEntity targetentity = target as Entities.IEntity;
            if (targetentity is Entities.BossMonster)
            {
                if (!(targetentity as Entities.BossMonster).CanBeAttacked)
                {
                    return;
                }
            }
            if (!Combat.FixTarget(attacker, targetentity))
            {
                return;
            }

            if (!Core.Screen.ValidDistance(attackermap.X, attackermap.Y, target.X, target.Y))
            {
                return;
            }
            if (!attacker.Alive)
            {
                return;
            }
            if (!targetentity.Alive)
            {
                return;
            }
            if (attacker is Entities.GameClient)
            {
                if (!ProcessClient((attacker as Entities.GameClient), interact))
                {
                    return;
                }
            }

            uint damage = Calculations.Battle.GetRangedDamage(attacker, targetentity);

            Combat.ProcessDamage(attacker, targetentity, ref damage);
            interact.Data = damage;
            attacker.Screen.UpdateScreen(interact);
            if (attacker is Entities.GameClient)
            {
                Entities.GameClient attackerclient = attacker as Entities.GameClient;
                if (damage > 0)
                {
                    if (!(target is Entities.GameClient))
                    {
                        uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                        if (targetentity.Level > (attacker.Level + 10))
                        {
                            exp *= 2;
                        }
                        else if (attacker.Level > (targetentity.Level + 10))
                        {
                            exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(1, (int)targetentity.Level);
                        }

                        if (interact.WeaponTypeRight > 0)
                        {
                            attackerclient.AddProfExp(500, exp);                             // bow
                        }
                    }
                }
                Data.ItemInfo arrow = attackerclient.Equipments[Enums.ItemLocation.WeaponL];
                arrow.CurrentDura--;
                Database.CharacterDatabase.SaveEquipment(attackerclient, arrow, Enums.ItemLocation.WeaponL);
                arrow.SendPacket(attackerclient, 3);

                attackerclient.Send(interact);

                //interact.Data = 0;
                interact.ActivationType     = 0;
                interact.ActivationValue    = 0;
                attackerclient.AttackPacket = interact;
                attackerclient.UseAutoAttack(interact);
            }
        }
Esempio n. 16
0
        public static bool HandleSurrounding(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (target == null)
            {
                return(false);
            }
            if (target is Entities.NPC)
            {
                return(false);
            }
            if (target is Entities.Monster)
            {
                if (((byte)(target as Entities.Monster).Behaviour) >= 3)
                {
                    return(false);
                }
            }
            if (target is Entities.GameClient)
            {
                if (!(target as Entities.GameClient).LoggedIn)
                {
                    return(false);
                }
            }
            if (attacker is Entities.GameClient)
            {
                Entities.GameClient client = (attacker as Entities.GameClient);
                if (!(DateTime.Now >= client.LastSmallLongSkill.AddMilliseconds(Core.TimeIntervals.SmallLongSkillInterval)) && client.AttackPacket == null)
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                        client.Send(fmsg);
                    return(false);
                }
                client.LastSmallLongSkill = DateTime.Now;
            }

            target.HP += spell.Power;
            uint targetcount = 1;

            if (spell.SpellID == 1055)
            {
                foreach (Maps.IMapObject obj in target.Screen.MapObjects.Values)
                {
                    if (obj == null)
                    {
                        continue;
                    }
                    if (obj.EntityUID == attacker.EntityUID)
                    {
                        continue;
                    }
                    if (obj.EntityUID == target.EntityUID)
                    {
                        continue;
                    }
                    if (obj is Entities.NPC)
                    {
                        continue;
                    }
                    if (Core.Screen.GetDistance(obj.X, obj.Y, target.X, target.Y) > spell.Distance)
                    {
                        continue;
                    }
                    if (obj is Entities.Monster)
                    {
                        if (((byte)(obj as Entities.Monster).Behaviour) >= 3)
                        {
                            continue;
                        }
                    }
                    if (obj is Entities.GameClient)
                    {
                        if (!(obj as Entities.GameClient).LoggedIn)
                        {
                            continue;
                        }
                    }
                    (obj as Entities.IEntity).HP += spell.Power;
                    usespell.AddTarget(obj.EntityUID, spell.Power);
                    targetcount++;
                }
            }

            uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)spell.Power, (int)spell.Power * 2);

            exp *= targetcount;
            if ((attacker is Entities.GameClient))
            {
                (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
            }

            usespell.AddTarget(target.EntityUID, spell.Power);

            return(true);
        }
Esempio n. 17
0
        public static void Handle(Entities.IEntity attacker, InteractionPacket interact)
        {
            if (interact == null)
            {
                return;
            }

            Maps.IMapObject attackermap = attacker as Maps.IMapObject;
            if (!attackermap.Screen.ContainsEntity(interact.TargetUID))
            {
                return;
            }
            Maps.IMapObject target = null;
            if (!attackermap.Screen.GetEntity(interact.TargetUID, out target))
            {
                return;
            }
            if (target is Entities.NPC)
            {
                return;
            }
            if (target is Entities.GameClient)
            {
                if (!(target as Entities.GameClient).LoggedIn)
                {
                    return;
                }

                if ((target as Entities.GameClient).ContainsFlag1(Enums.Effect1.Fly))
                {
                    return;
                }

                if (target.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                {
                    return;
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).LoginProtection.AddSeconds(10)))
                {
                    return;
                }


                if (!(DateTime.Now >= (target as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                {
                    return;
                }
            }

            Entities.IEntity targetentity = target as Entities.IEntity;
            if (targetentity is Entities.BossMonster)
            {
                if (!(targetentity as Entities.BossMonster).CanBeAttacked)
                {
                    return;
                }
            }
            if (!Core.Screen.ValidDistance(attackermap.X, attackermap.Y, target.X, target.Y))
            {
                return;
            }
            if (!attacker.Alive)
            {
                return;
            }
            if (!targetentity.Alive)
            {
                return;
            }
            if (attacker is Entities.GameClient)
            {
                if (!ProcessClient((attacker as Entities.GameClient), interact))
                {
                    return;
                }
            }

            uint damage = Calculations.Battle.GetPhysicalDamage(attacker, targetentity);

            Combat.ProcessDamage(attacker, targetentity, ref damage);
            if (damage > 0)
            {
                if (attacker is Entities.GameClient && !(target is Entities.GameClient))
                {
                    Entities.GameClient client = attacker as Entities.GameClient;

                    uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                    if (targetentity.Level > (attacker.Level + 10))
                    {
                        exp *= 2;
                    }
                    else if (attacker.Level > (targetentity.Level + 10))
                    {
                        exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(1, (int)targetentity.Level);
                    }

                    if (interact.WeaponTypeRight > 0)
                    {
                        client.AddProfExp(interact.WeaponTypeRight, exp);
                    }
                    if (interact.WeaponTypeLeft > 0)
                    {
                        client.AddProfExp(interact.WeaponTypeLeft, exp);
                    }
                }
            }
            interact.Data = damage;
            attacker.Screen.UpdateScreen(interact);
            if (attacker is Entities.GameClient)
            {
                (attacker as Entities.GameClient).Send(interact);
            }
        }
Esempio n. 18
0
        public void BeginJumpBot(Entities.GameClient target)
        {
            Threads.BotThread.Bots.TryAdd(Original.EntityUID, this);

            Target = target;
        }
Esempio n. 19
0
        public static void Handle(Entities.IEntity attacker, InteractionPacket interact)
        {
            if (interact == null)
            {
                return;
            }
            ConcurrentBag <Entities.IEntity> targets = new ConcurrentBag <ProjectX_V3_Game.Entities.IEntity>();

            Maps.IMapObject attackermap = attacker as Maps.IMapObject;
            if (!Core.Screen.ValidDistance(attackermap.X, attackermap.Y, interact.X, interact.Y))
            {
                return;
            }
//			if (!attackermap.Screen.ContainsEntity(interact.TargetUID))
//			{
//				return;
//			}
//			Maps.IMapObject target = null;
//			if (!attackermap.Screen.GetEntity(interact.TargetUID, out target))
//			{
//				return;
//			}
//			Entities.IEntity targetentity = target as Entities.IEntity;
//			if (!Core.Screen.ValidDistance(attackermap.X, attackermap.Y, target.X, target.Y))
//			{
//				return;
//			}
            if (!attacker.Alive)
            {
                return;
            }

            Maps.IMapObject target = null;
            if (interact.TargetUID > 0)
            {
                if (!attackermap.Screen.GetEntity(interact.TargetUID, out target) && interact.TargetUID != attacker.EntityUID)
                {
                    return;                     // fail here
                }
            }
            if (target != null)
            {
                if (target is Entities.NPC)
                {
                    return;
                }
                if (target is Entities.GameClient)
                {
                    if (!(target as Entities.GameClient).LoggedIn)
                    {
                        return;
                    }

                    if (target.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                    {
                        if (interact.MagicType != 1045 && interact.MagicType != 1046)
                        {
                            return;
                        }
                    }
                    if (!(DateTime.Now >= (target as Entities.GameClient).LoginProtection.AddSeconds(10)))
                    {
                        return;
                    }

                    // check if revive skill here and above as well!
                    if (!(DateTime.Now >= (target as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                    {
                        return;
                    }
                }

                Entities.IEntity targetentity = target as Entities.IEntity;
                if (!Core.Screen.ValidDistance(attackermap.X, attackermap.Y, target.X, target.Y))
                {
                    return;
                }


                if (!Combat.FixTarget(attacker, targetentity))
                {
                    return;
                }

                if (!targetentity.Alive && interact.MagicType != 1100 && interact.MagicType != 1050)
                {
                    return;
                }
            }

            UseSpellPacket usespell = new UseSpellPacket();

            usespell.EntityUID  = attacker.EntityUID;
            usespell.SpellID    = interact.MagicType;
            usespell.SpellX     = interact.X;
            usespell.SpellY     = interact.Y;
            usespell.SpellLevel = 0;

            Data.Spell spell = null;
            if (attacker is Entities.GameClient)
            {
                if (!(attacker as Entities.GameClient).IsAIBot)
                {
                    if (!ProcessClient((attacker as Entities.GameClient), interact, usespell, out spell))
                    {
                        return;
                    }
                }
                else
                {
                    usespell.SpellLevel = interact.MagicLevel;
                    spell = Core.Kernel.SpellInfos[usespell.SpellID][(byte)usespell.SpellLevel];
                }
            }
            else if (attacker is Entities.Monster)
            {
                if (Core.Kernel.SpellInfos.ContainsKey(interact.MagicType))
                {
                    byte maxlevel = (byte)Core.Kernel.SpellInfos[interact.MagicType].Keys.Count;
                    maxlevel--;
                    if (Core.Kernel.SpellInfos[interact.MagicType].ContainsKey(maxlevel))
                    {
                        spell = Core.Kernel.SpellInfos[interact.MagicType][maxlevel];
                    }
                }
            }
            // AI
            // Guards
            // Mobs with skills ??
            if (spell == null)
            {
                return;
            }

            if (interact.EntityUID != attacker.EntityUID && target != null)
            {
                usespell.SpellX = target.X;
                usespell.SpellY = target.Y;
            }

            if (spell.UseEP > 0)
            {
                if (attacker is Entities.GameClient)
                {
                    if (!(attacker as Entities.GameClient).IsAIBot)
                    {
                        if (spell.ID == 7001)
                        {
                            if (!(attacker as Entities.GameClient).ContainsFlag1(Enums.Effect1.Riding))
                            {
                                if ((attacker as Entities.GameClient).Stamina < spell.UseEP)
                                {
                                    return;
                                }
                            }
                        }
                        else
                        if ((attacker as Entities.GameClient).Stamina < spell.UseEP)
                        {
                            return;
                        }
                    }
                }
            }

            if (spell.UseMP > 0)
            {
                if (attacker is Entities.Monster)
                {
                    if (attacker.MP < spell.UseMP && ((byte)(attacker as Entities.Monster).Behaviour) < 3)
                    {
                        return;
                    }
                }
                else if (attacker.MP < spell.UseMP)
                {
                    return;
                }
            }

            bool success = false;
            uint damage  = 0;

            if (attacker.Map == null)
            {
                return;
            }

            if (attacker.Map.MapType == Enums.MapType.Tournament)
            {
                if (interact.MagicType != 1045 && interact.MagicType != 1046)
                {
                    return;
                }
            }

            bool singleSkill = false;

            switch (interact.MagicType)
            {
                #region Line Skills
            case 1045:
            case 1046:
            case 11005:
            case 11000:
                success = Skills.LineSkills.Handle(attacker, targets, interact, usespell, spell, out damage);
                break;
                #endregion
                #region SectorSkills

                #region Physical
            case 1250:
            case 5050:
            case 5020:
            case 1300:
                success = Skills.SectoreSkills.HandlePhy(attacker, targets, interact, usespell, spell, out damage);
                break;

                #endregion
                #region Magic
            case 1165:
            case 7014:
                success = Skills.SectoreSkills.HandleMag(attacker, targets, interact, usespell, spell, out damage);
                break;
                #endregion

                #endregion
                #region Single
                #region Magic
            case 10310:
            case 1000:
            case 1001:
            case 1002:
            case 1150:
            case 1160:
            case 1180:
                if (target == null)
                {
                    return;
                }

                singleSkill = true;
                success     = Skills.Single.HandleMag(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region Physical
            case 1290:
            case 5030:
            case 5040:
            case 7000:
            case 7010:
            case 7030:
            case 7040:
                if (target == null)
                {
                    return;
                }

                singleSkill = true;
                success     = Skills.Single.HandlePhys(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;
                #endregion
                #endregion
                #region Circle

                #region Physical
            case 5010:
            case 7020:
            case 1115:                    //herc
                success = Skills.CircleSkills.HandlePhy(attacker, targets, interact, usespell, spell, out damage);
                break;

                #endregion
                #region Magic
            case 1010:                    //lightning tao
            case 1120:                    //fc
            case 1125:                    //volc
            case 3090:                    //pervade
            case 5001:                    //speed
            case 8030:                    //arrows
            case 7013:                    //flame shower
            case 30011:                   //small ice circle
            case 30012:                   //large ice circle
            case 10360:
            case 10361:
            case 10392:
            case 10308:
                success = Skills.CircleSkills.HandleMag(attacker, targets, interact, usespell, spell, out damage);
                break;
                #endregion

                #endregion
                #region MountSkill
            case 7001:
                singleSkill = true;
                if (attacker is Entities.GameClient)
                {
                    success = Skills.MountSkill.Handle((attacker as Entities.GameClient), usespell);
                }
                else
                {
                    success = false;
                }
                break;

                #endregion
                #region Buff
            case 1075:
            case 1085:
            case 1090:
            case 1095:
                if (target == null)
                {
                    return;
                }
                singleSkill = true;
                success     = Skills.BuffSkills.Handle(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region Revive
            case 1050:
            case 1100:
                if (target == null)
                {
                    return;
                }
                singleSkill = true;
                success     = Skills.ReviveSkills.Handle(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region Fly
            case 8002:
            case 8003:
                singleSkill = true;
                success     = Skills.FlySkill.Handle(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region Scatter
            case 8001:
                success = Skills.ScatterSkill.Handle(attacker, targets, interact, usespell, spell, out damage);
                break;
                #endregion
                #region Cure

                #region Self
            case 1190:
            case 1195:
            case 7016:
                if (target == null)
                {
                    return;
                }
                singleSkill = true;
                success     = Skills.CureSkills.HandleSelf(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region Surroundings
            case 1005:
            case 1055:
            case 1170:
            case 1175:
                if (target == null)
                {
                    return;
                }
                singleSkill = true;
                success     = Skills.CureSkills.HandleSurrounding(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;
                #endregion

                #endregion
                #region Archer
            case 10313:
            case 8000:
            case 9991:
            case 7012:
            case 7015:
            case 7017:
            case 1320:
                if (target == null)
                {
                    return;
                }

                singleSkill = true;
                success     = Skills.ArcherSkills.Handle(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region Ninja
                #region Toxic Fog
            case 6001:
                success = Skills.NinjaSkills.HandlePoison(attacker, targets, interact, usespell, spell, out damage);
                break;

                #endregion
                #region TwoFold
            case 6000:
                if (target == null)
                {
                    return;
                }

                singleSkill = true;
                success     = Skills.NinjaSkills.HandleTwoFold(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region PoisonStar
            case 6002:
                if (target == null)
                {
                    return;
                }

                singleSkill = true;
                success     = Skills.NinjaSkills.HandlePoisonStar(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;

                #endregion
                #region ArcherBane
            case 6004:
                if (target == null)
                {
                    return;
                }

                singleSkill = true;
                success     = Skills.NinjaSkills.HandleArcherBane(attacker, (target as Entities.IEntity), interact, usespell, spell, out damage);
                break;
                #endregion
                #endregion

            default:
                if (attacker is Entities.GameClient)
                {
                    Entities.GameClient client = (attacker as Entities.GameClient);
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.INVALID_SKILL))
                        client.Send(fmsg);
                }
                return;
            }
            if (success)
            {
                if (spell.UseEP > 0)
                {
                    if (attacker is Entities.GameClient)
                    {
                        if ((attacker as Entities.GameClient).Stamina >= spell.UseEP)
                        {
                            (attacker as Entities.GameClient).Stamina -= spell.UseEP;
                        }
                    }
                }

                if (spell.UseMP > 0)
                {
                    if (attacker.MP >= spell.UseMP)
                    {
                        attacker.MP -= spell.UseMP;
                    }
                }

//				if (spell.UseItemNum == 0) // fix
//				{
//					if (attacker is Entities.GameClient)
//					{
//						Entities.GameClient client = attacker as Entities.GameClient;
//						if (!client.Equipments.Contains(Enums.ItemLocation.WeaponL))
//							return;
//						if (!client.Equipments[Enums.ItemLocation.WeaponL].IsArrow())
//							return;
//						if (client.Equipments[Enums.ItemLocation.WeaponL].CurrentDura == 0)
//						{
//							uint arrowtype = client.Equipments[Enums.ItemLocation.WeaponL].ItemID;
//							if (client.Inventory.ContainsByID(arrowtype))
//							{
//								Data.ItemInfo arrow = client.Inventory.SearchForNonEmpty(arrowtype);
//								if (arrow != null)
//								{
//									if (!client.Equipments.Equip(arrow, Enums.ItemLocation.WeaponL, true))
//									{
//										using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.AUTO_RELOAD_ARROW_FAIL))
//											client.Send(fmsg);
//										return;
//									}
//								}
//								else
//									return;
//							}
//							else if (!client.Equipments.Unequip(Enums.ItemLocation.WeaponL))
//							{
//								using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.EMPTY_ARROWS))
//									client.Send(fmsg);
//								return;
//							}
//							else
//								return; // no more arrows in inventory
//						}
//					}
//				}
//
                attacker.Screen.UpdateScreen(usespell);
                Entities.IEntity targetentity = target as Entities.IEntity;

                if (targetentity != null && singleSkill)
                {
                    if (targetentity.EntityUID != attacker.EntityUID)
                    {
                        Combat.HitDamage(attacker, targetentity, damage);
                    }
                    else if (targets.Count > 0)
                    {
                        foreach (Entities.IEntity targete in targets)
                        {
                            Combat.HitDamage(attacker, targete, damage);
                        }
                    }
                }
                else if (targets.Count > 0)
                {
                    foreach (Entities.IEntity targete in targets)
                    {
                        Combat.HitDamage(attacker, targete, damage);
                    }
                }

                if (attacker is Entities.GameClient)
                {
                    Entities.GameClient attackerclient = attacker as Entities.GameClient;
                    attackerclient.Send(usespell);

                    if (usespell.SpellID >= 1000 && usespell.SpellID <= 1002)
                    {
                        //interact.Data = 0;
                        interact.ActivationType     = 0;
                        interact.ActivationValue    = 0;
                        attackerclient.AttackPacket = interact;
                        attackerclient.UseAutoAttack(interact);
                    }
                }
            }
        }
Esempio n. 20
0
        /// <summary>
        /// Kills an entity.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="attacked">The attacked.</param>
        public static void Kill(Entities.IEntity attacker, Entities.IEntity attacked, uint damage = 0)
        {
            attacked.HP    = 0;
            attacked.Alive = false;

            if (attacked is Entities.Monster)
            {
                (attacked as Entities.Monster).Kill(attacker, damage);
                if (attacker is Entities.GameClient)
                {
                    if ((attacker as Entities.GameClient).Battle != null)
                    {
                        (attacker as Entities.GameClient).Battle.KillMob((attacker as Entities.GameClient), attacked.EntityUID);
                    }
                }
            }

            using (var killpacket = new Packets.InteractionPacket())
            {
                killpacket.Action    = Enums.InteractAction.Kill;
                killpacket.TargetUID = attacked.EntityUID;
                killpacket.X         = attacked.X;
                killpacket.Y         = attacked.Y;
                killpacket.Data      = 1;

                if (attacker != null)
                {
                    killpacket.EntityUID = attacker.EntityUID;

                    attacker.Screen.UpdateScreen(killpacket);
                    if (attacker is Entities.GameClient)
                    {
                        (attacker as Entities.GameClient).Send(killpacket);
                    }
                }
                else
                {
                    killpacket.EntityUID = 0;
                    attacked.Screen.UpdateScreen(killpacket);
                    if (attacked is Entities.GameClient)
                    {
                        (attacked as Entities.GameClient).Send(killpacket);
                    }
                }
            }

            if (attacked is Entities.GameClient)
            {
                Entities.GameClient attackedclient = attacked as Entities.GameClient;
                attackedclient.RemoveFlag1(Enums.Effect1.Fly);
                attackedclient.RemoveFlag1(Enums.Effect1.Invisible);

                if (attacker != null)
                {
                    if (attacked.EntityUID != attacker.EntityUID)
                    {
                        if (attacker is Entities.GameClient)
                        {
                            if ((attacker as Entities.GameClient).Battle != null)
                            {
                                if (!(attacker as Entities.GameClient).Battle.HandleDeath((attacker as Entities.GameClient), attackedclient))
                                {
                                    return;
                                }
                            }
                            else if (attacked.Map.GotKillCons())
                            {
                                Entities.GameClient attackerclient = attacker as Entities.GameClient;
                                if (attackedclient.Guild != null && attackerclient.Guild != null)
                                {
                                    if (attackerclient.Guild.IsEnemy(attackedclient.Guild.Name))
                                    {
                                        attackerclient.PKPoints += 3;
                                    }
                                    else
                                    {
                                        attackerclient.PKPoints += 10;
                                    }
                                }
                                else
                                {
                                    attackerclient.PKPoints += 10;
                                }
                            }
                        }
                    }
                }
                attackedclient.AttackPacket = null;
                attackedclient.ReviveTime   = DateTime.Now.AddSeconds(20);
                attackedclient.AddStatusEffect1(Enums.Effect1.Dead);
                attackedclient.AddStatusEffect1(Enums.Effect1.Ghost);
                attackedclient.RemoveFlag1(Enums.Effect1.BlueName);
                attackedclient.Stamina = 0;

                attackedclient.Transformation = Calculations.BasicCalculations.GetGhostTransform(attackedclient.Model);
            }

            if (attacked is Entities.BossCreature)
            {
                Entities.BossCreature creature = attacked as Entities.BossCreature;
                creature.Abort();
            }
            else if (attacked is Entities.BossMonster)
            {
                Entities.BossMonster boss = attacked as Entities.BossMonster;
                boss.AbortBoss(false);
                if (attacker is Entities.GameClient)
                {
                    boss.ON_DEATH(attacker as Entities.GameClient);
                }
            }
        }
Esempio n. 21
0
        private void Jump_Action()
        {
            if (Original.WasInArena)
            {
                Original.WasInArena = false;
                Target = null;
                Dispose();
                return;
            }
            if (Target == null)
            {
                return;
            }
            if (!Original.Alive)
            {
                Original.Revive();
                return;
            }
            bool CanFB = true;

            //if (Calculations.BasicCalculations.ChanceSuccess(95))
            //{
            if (Core.Screen.GetDistance(Original.X, Original.Y, Target.X, Target.Y) > 15)
            {
                Enums.ConquerAngle angle = Core.Screen.GetFacing(Core.Screen.GetAngle(Original.X, Original.Y, Target.X, Target.Y));
                ushort             size  = (ushort)Core.Screen.GetDistance(Target.X, Target.Y, Original.X, Original.Y);
                size /= 3;
                CanFB = false;
                Jump(size, angle);
            }
            else
            {
                ushort             size  = (ushort)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(10);
                Enums.ConquerAngle angle = (Enums.ConquerAngle)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(8);
                Jump(size, angle);
            }

            /*}
             * else
             * {
             *      Packets.GeneralDataPacket general = new ProjectX_V3_Game.Packets.GeneralDataPacket(Enums.DataAction.ChangeAction);
             *      general.Id = Original.EntityUID;
             *      general.Data1 = (uint)Enums.ActionType.Sit;
             *      general.Timestamp = ProjectX_V3_Lib.Native.Winmm.timeGetTime();
             *      Original.SendToScreen(general, false, false);
             * }*/
            if (Original.ArenaMatch != null)
            {
                if (!Original.ArenaMatch.MatchStarted)
                {
                    CanFB = false;
                }
            }
            if (Calculations.BasicCalculations.ChanceSuccess(ShootChance) && CanFB)
            {
                if (Core.Screen.GetDistance(Original.X, Original.Y, Target.X, Target.Y) <= 10)
                {
                    #region fb / ss
                    Shoot(Accuracy);
                    #endregion
                }
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Handles the twofold attack skills.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="target">The target.</param>
        /// <param name="interaction">The interaction packet.</param>
        /// <param name="usespell">The usespell packet.</param>
        /// <param name="spell">The spell.</param>
        /// <param name="damage">The damage.</param>
        /// <returns>Returns true if the skill was used successfully.</returns>
        public static bool HandleTwoFold(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (attacker.EntityUID == target.EntityUID)
            {
                return(false);
            }
            if (target is Entities.NPC)
            {
                return(false);
            }

            if (target is Entities.BossMonster)
            {
                if (!(target as Entities.BossMonster).CanBeAttacked)
                {
                    return(false);
                }
            }

            if (target is Entities.Monster)
            {
                if (((byte)(target as Entities.Monster).Behaviour) >= 3)
                {
                    return(false);
                }
            }

            if (Core.Screen.GetDistance(target.X, target.Y, attacker.X, attacker.Y) > spell.Distance)
            {
                return(false);
            }



            if (target is Entities.GameClient)
            {
                if (!(target as Entities.GameClient).LoggedIn)
                {
                    return(false);
                }
                if ((target as Entities.GameClient).ContainsFlag1(Enums.Effect1.Fly))
                {
                    return(false);
                }

                if (target.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).LoginProtection.AddSeconds(10)))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                {
                    return(false);
                }

                if (!Combat.FixTarget(attacker, target))
                {
                    return(false);
                }
            }

            damage = Calculations.Battle.GetPhysicalMagicDamage(attacker, target, spell);
            damage = (uint)((damage / 100) * (spell.Power - 30000));
            Combat.ProcessDamage(attacker, target, ref damage, false);
            if (damage > 0)
            {
                if (!(target is Entities.GameClient))
                {
                    uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                    if (target.Level > (attacker.Level + 10))
                    {
                        exp *= 2;
                    }
                    if ((attacker is Entities.GameClient))
                    {
                        (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
                    }
                }
                usespell.AddTarget(target.EntityUID, damage);
            }
            return(true);
        }
Esempio n. 23
0
        public static bool Handle(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (!attacker.Alive)
            {
                return(false);
            }
            if (target == null)
            {
                return(false);
            }
            if (!target.Alive)
            {
                return(false);
            }
            if (!(target is Entities.GameClient))
            {
                return(false);
            }
            if (attacker is Entities.GameClient)
            {
                Entities.GameClient client = (attacker as Entities.GameClient);
                if (!(DateTime.Now >= client.LastSmallLongSkill.AddMilliseconds(Core.TimeIntervals.SmallLongSkillInterval)) && client.AttackPacket == null)
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                        client.Send(fmsg);
                    return(false);
                }
                client.LastSmallLongSkill = DateTime.Now;
            }

            Entities.GameClient TargetClient = (target as Entities.GameClient);
            if (!TargetClient.LoggedIn)
            {
                return(false);
            }

            switch (spell.SpellID)
            {
            case 1075:
                TargetClient.AddStatusEffect1(Enums.Effect1.PartiallyInvisible, spell.Duration * 1000);
                break;

            case 1085:
                TargetClient.AddStatusEffect1(Enums.Effect1.StarOfAccuracy, spell.Duration * 1000);
                break;

            case 1090:
                TargetClient.AddStatusEffect1(Enums.Effect1.Shield, spell.Duration * 1000);
                break;

            case 1095:
                TargetClient.AddStatusEffect1(Enums.Effect1.Stig, spell.Duration * 1000);
                break;

            default:
                return(false);
            }
            byte level_target = (byte)(TargetClient.Level > 50 ? 50 : TargetClient.Level);
            uint exp          = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)level_target, (int)level_target * 2);

            if ((attacker is Entities.GameClient))
            {
                (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
            }

            usespell.AddTarget(TargetClient.EntityUID, damage);

            return(true);
        }
Esempio n. 24
0
        /// <summary>
        /// Handles the sector skills.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="targets">The targets. [not set yet]</param>
        /// <param name="interaction">The interaction packet.</param>
        /// <param name="usespell">The usespell packet.</param>
        /// <param name="spell">The spell.</param>
        /// <param name="damage">The damage.</param>
        /// <returns>Returns true if the skill was used successfully.</returns>
        public static bool HandlePhy(Entities.IEntity attacker, ConcurrentBag <Entities.IEntity> targets, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            bool self = (interaction.TargetUID == attacker.EntityUID);

            if (self)
            {
                return(false);
            }

            /*Calculations.InLineAlgorithm ila = new ProjectX_V3_Game.Calculations.InLineAlgorithm(
             *      attacker.X, interaction.X, attacker.Y, interaction.Y,
             *      (byte)spell.Range, Calculations.InLineAlgorithm.Algorithm.DDA);*/

            Calculations.Sector sector = new ProjectX_V3_Game.Calculations.Sector(attacker.X, attacker.Y, interaction.X, interaction.Y);
            sector.Arrange(spell.Sector, spell.Range);

            byte count    = 0;
            bool bluename = false;

            foreach (Maps.IMapObject obj in attacker.Screen.MapObjects.Values)
            {
                if (count > 28)
                {
                    return(true);
                }

                if (!(obj as Entities.IEntity).Alive)
                {
                    continue;
                }

                if (obj is Entities.NPC)
                {
                    continue;
                }

                if (obj.EntityUID == attacker.EntityUID)
                {
                    continue;
                }

                if (obj is Entities.BossMonster)
                {
                    if (!(obj as Entities.BossMonster).CanBeAttacked)
                    {
                        continue;
                    }
                }

                if (obj is Entities.Monster)
                {
                    if (((byte)(obj as Entities.Monster).Behaviour) >= 3)
                    {
                        continue;
                    }
                }

                if (obj is Entities.GameClient)
                {
                    if (!(obj as Entities.GameClient).LoggedIn)
                    {
                        continue;
                    }

                    if ((obj as Entities.GameClient).ContainsFlag1(Enums.Effect1.Fly))
                    {
                        continue;
                    }

                    if (obj.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                    {
                        continue;
                    }

                    if (attacker is Entities.GameClient)
                    {
                        if ((attacker as Entities.GameClient).PKMode != Enums.PKMode.PK)
                        {
                            continue;
                        }

                        if (!Combat.FixTarget(attacker, obj as Entities.IEntity))
                        {
                            continue;
                        }
                    }

                    if (!(DateTime.Now >= (obj as Entities.GameClient).LoginProtection.AddSeconds(10)))
                    {
                        continue;
                    }

                    if (!(DateTime.Now >= (obj as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                    {
                        continue;
                    }

                    if (!Combat.FixTarget(attacker, (obj as Entities.GameClient)))
                    {
                        continue;
                    }


                    if ((obj as Entities.GameClient).ContainsFlag1(Enums.Effect1.BlueName))
                    {
                        bluename = true;
                    }
                }

                //if (!ila.InLine(obj.X, obj.Y))
                //	continue;

                if (!sector.Inside(obj.X, obj.Y))
                {
                    continue;
                }

                Entities.IEntity targetentity = obj as Entities.IEntity;
                damage = Calculations.Battle.GetPhysicalDamage(attacker, targetentity);
                Combat.ProcessDamage(attacker, targetentity, ref damage, false);
                if (damage > 0)
                {
                    if (!(targetentity is Entities.GameClient))
                    {
                        uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                        if (targetentity.Level > (attacker.Level + 10))
                        {
                            exp *= 2;
                        }
                        if ((attacker is Entities.GameClient))
                        {
                            (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
                        }
                    }
                    usespell.AddTarget(targetentity.EntityUID, damage);
                    targets.Add(targetentity);
                }
                count++;
            }
            if (attacker is Entities.GameClient && bluename)
            {
                (attacker as Entities.GameClient).AddStatusEffect1(Enums.Effect1.BlueName, 10000);
            }
            return(true);
        }
Esempio n. 25
0
        /// <summary>
        /// Handles the archerbane attack skills.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="target">The target.</param>
        /// <param name="interaction">The interaction packet.</param>
        /// <param name="usespell">The usespell packet.</param>
        /// <param name="spell">The spell.</param>
        /// <param name="damage">The damage.</param>
        /// <returns>Returns true if the skill was used successfully.</returns>
        public static bool HandleArcherBane(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (attacker.EntityUID == target.EntityUID)
            {
                return(false);
            }
            if (!(target is Entities.GameClient))
            {
                return(false);
            }
            if (!(target as Entities.GameClient).ContainsFlag1(Enums.Effect1.Fly))
            {
                return(false);
            }

            if (target is Entities.GameClient)
            {
                if (!(target as Entities.GameClient).LoggedIn)
                {
                    return(false);
                }

                if (target.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).LoginProtection.AddSeconds(10)))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                {
                    return(false);
                }

                if (!Combat.FixTarget(attacker, target))
                {
                    return(false);
                }
            }

            (target as Entities.GameClient).RemoveFlag1(Enums.Effect1.Fly);

            //damage = Calculations.Battle.GetPhysicalMagicDamage(attacker, target, spell);
            damage = (uint)(target.HP / 10);
            Combat.ProcessDamage(attacker, target, ref damage, false);
            if (damage > 0)
            {
                if (!(target is Entities.GameClient))
                {
                    uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                    if (target.Level > (attacker.Level + 10))
                    {
                        exp *= 2;
                    }
                    if ((attacker is Entities.GameClient))
                    {
                        (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
                    }
                }
            }
            usespell.AddTarget(target.EntityUID, damage);
            return(true);
        }
Esempio n. 26
0
        /// <summary>
        /// Handles the poisonstar attack skills.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="target">The target.</param>
        /// <param name="interaction">The interaction packet.</param>
        /// <param name="usespell">The usespell packet.</param>
        /// <param name="spell">The spell.</param>
        /// <param name="damage">The damage.</param>
        /// <returns>Returns true if the skill was used successfully.</returns>
        public static bool HandlePoisonStar(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (attacker.EntityUID == target.EntityUID)
            {
                return(false);
            }
            if (!(target is Entities.GameClient))
            {
                return(false);
            }
            if ((target as Entities.GameClient).ContainsFlag1(Enums.Effect1.Fly))
            {
                return(false);
            }

            if (Core.Screen.GetDistance(target.X, target.Y, attacker.X, attacker.Y) > spell.Distance)
            {
                return(false);
            }

            if (attacker is Entities.GameClient)
            {
                Entities.GameClient client = (attacker as Entities.GameClient);
                if (!(DateTime.Now >= client.LastSmallLongSkill.AddMilliseconds(Core.TimeIntervals.SmallLongSkillInterval)) && client.AttackPacket == null)
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                        client.Send(fmsg);
                    return(false);
                }
                client.LastSmallLongSkill = DateTime.Now;
            }

            if (target is Entities.GameClient)
            {
                if (!(target as Entities.GameClient).LoggedIn)
                {
                    return(false);
                }

                if (target.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).LoginProtection.AddSeconds(10)))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                {
                    return(false);
                }

                if (!Combat.FixTarget(attacker, target))
                {
                    return(false);
                }
            }

            (target as Entities.GameClient).AddStatusEffect1(Enums.Effect1.NoPotion, (5000 * (spell.Level + 1)));

            uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)target.Level, (int)target.Level * 2);

            if ((attacker is Entities.GameClient))
            {
                (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
            }

            usespell.AddTarget(target.EntityUID, 0);

            return(true);
        }
Esempio n. 27
0
        /// <summary>
        /// Handles the single attack skills.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="target">The target.</param>
        /// <param name="interaction">The interaction packet.</param>
        /// <param name="usespell">The usespell packet.</param>
        /// <param name="spell">The spell.</param>
        /// <param name="damage">The damage.</param>
        /// <returns>Returns true if the skill was used successfully.</returns>
        public static bool Handle(Entities.IEntity attacker, Entities.IEntity target, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage)
        {
            damage = 0;
            if (attacker is Entities.GameClient)
            {
                if (!Ranged.ProcessClient(attacker as Entities.GameClient, interaction, true))
                {
                    return(false);
                }
            }
            if (attacker.EntityUID == target.EntityUID)
            {
                return(false);
            }
            if (target is Entities.NPC)
            {
                return(false);
            }

            if (target is Entities.BossMonster)
            {
                if (!(target as Entities.BossMonster).CanBeAttacked)
                {
                    return(false);
                }
            }

            if (target is Entities.Monster)
            {
                if (((byte)(target as Entities.Monster).Behaviour) >= 3)
                {
                    return(false);
                }
            }

            if (target is Entities.GameClient)
            {
                if (!(target as Entities.GameClient).LoggedIn)
                {
                    return(false);
                }

                if (target.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).LoginProtection.AddSeconds(10)))
                {
                    return(false);
                }

                if (!(DateTime.Now >= (target as Entities.GameClient).ReviveProtection.AddSeconds(5)))
                {
                    return(false);
                }

                if (!Combat.FixTarget(attacker, target))
                {
                    return(false);
                }
            }

            if (attacker is Entities.GameClient)
            {
                Ranged.DecreaseArrows(attacker as Entities.GameClient, 1);
            }
            damage = Calculations.Battle.GetRangedDamage(attacker, target);
            damage = (uint)(damage * 1.5);
            Combat.ProcessDamage(attacker, target, ref damage, false);
            if (damage > 0)
            {
                if (!(target is Entities.GameClient))
                {
                    uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                    if (target.Level > (attacker.Level + 10))
                    {
                        exp *= 2;
                    }
                    if ((attacker is Entities.GameClient))
                    {
                        (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp);
                    }
                }
                usespell.AddTarget(target.EntityUID, damage);
            }
            return(true);
        }
Esempio n. 28
0
        /// <summary>
        /// Processing damage.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="attacked">The attacked.</param>
        /// <param name="damage">The damage.</param>
        public static void ProcessDamage(Entities.IEntity attacker, Entities.IEntity attacked, ref uint damage, bool kill_damage = true)
        {
            // Removed dura, bugged atm. the dura works, although client doesn't update proper etc. CBA to fix it as I never intended to use it
            // Although you can go ahead and fix it yourself if you want, I may do it if I ever feel like it
            // The dura lose is commented out below.
            #region ATTACKER : GAMECLIENT
            if (attacker is Entities.GameClient)
            {
                Entities.GameClient attackerclient = attacker as Entities.GameClient;
                attackerclient.LoseAttackDura(damage);

                #region ATTACKED : GAMECLIENT
                if (attacked is Entities.GameClient)
                {
                    Entities.GameClient attackedclient = attacked as Entities.GameClient;
                    // tournament check, damage = 1 + return
                    if (attackerclient.Battle != null)
                    {
                        if (!attackerclient.Battle.HandleAttack(attackerclient, attackedclient, ref damage))
                        {
                            damage = 0;
                            return;
                        }
                    }
                    else
                    {
                        if (attacked.Map.GotKillCons() && !attackedclient.ContainsFlag1(Enums.Effect1.BlueName) && !attackedclient.ContainsFlag1(Enums.Effect1.RedName) && !attackedclient.ContainsFlag1(Enums.Effect1.BlackName))
                        {
                            attackerclient.AddStatusEffect1(Enums.Effect1.BlueName, 20000);
                        }

                        attackedclient.LoseDefenseDura(damage);
                    }
                }
                #endregion
                #region ATTACKED : MONSTER
                if (attacked is Entities.Monster)
                {
                    Entities.Monster attackedmob = attacked as Entities.Monster;

                    if (((byte)attackedmob.Behaviour) >= 3)
                    {
                        attackerclient.AddStatusEffect1(Enums.Effect1.BlueName, 20000);
                    }
                    if (damage > 0)
                    {
                        ulong exp = (ulong)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                        if (attacked.Level > (attacker.Level + 10))
                        {
                            exp *= 2;
                        }
                        else if (attacker.Level > (attacked.Level + 10))
                        {
                            exp = (ulong)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(1, (int)attackedmob.Level);
                        }
                        attackerclient.AddExp(exp);
                    }
                }
                #endregion
                //if (Calculations.Battle.LoseDuraAttak())
                //attackerclient.LoseAttackDura(damage);
            }
            #endregion
            #region ATTACKER : MONSTER

            #region ATTACKED : GAMECLIENT
            if (attacked is Entities.GameClient)
            {
                Entities.GameClient attackedclient = attacked as Entities.GameClient;

                attackedclient.LoseDefenseDura(damage);
            }
            #endregion

            #endregion

            if (kill_damage)
            {
                HitDamage(attacker, attacked, damage);
            }
        }