Exemple #1
0
        public async Task <IActionResult> Create(ComboDTO ComboDTO)
        {
            var Combo = _mapper.Map <ComboDTO, Combo>(ComboDTO);
            await _unitOfWork.Combos.Add(Combo);

            return(CreatedAtAction(nameof(GetBy), new { id = Combo.ComboId }, Combo));
        }
        public HitRequest(TargetHitType targetHitType, ClientSession session, Skill skill, short?skillEffect = null, short?mapX = null, short?mapY = null, ComboDTO skillCombo = null, bool showTargetAnimation = false, int directDamage = 0)
        {
            HitTimestamp           = DateTime.UtcNow;
            Session                = session;
            Skill                  = skill;
            TargetHitType          = targetHitType;
            SkillEffect            = skillEffect ?? skill?.Effect ?? 0;
            ShowTargetHitAnimation = showTargetAnimation;
            DirectDamage           = directDamage;

            if (mapX.HasValue)
            {
                MapX = mapX.Value;
            }

            if (mapY.HasValue)
            {
                MapY = mapY.Value;
            }

            if (skillCombo != null)
            {
                SkillCombo = skillCombo;
            }
        }
Exemple #3
0
        public HitRequest(TargetHitType targetHitType, ClientSession session, Skill skill, short?skillEffect = null, short?mapX = null, short?mapY = null, ComboDTO skillCombo = null)
        {
            HitTimestamp  = DateTime.Now;
            Session       = session;
            Skill         = skill;
            TargetHitType = targetHitType;
            if (skillEffect.HasValue)
            {
                SkillEffect = skillEffect.Value;
            }
            else
            {
                SkillEffect = skill.Effect;
            }

            if (mapX.HasValue)
            {
                MapX = mapX.Value;
            }

            if (mapY.HasValue)
            {
                MapY = mapY.Value;
            }

            if (skillCombo != null)
            {
                SkillCombo = skillCombo;
            }
        }
Exemple #4
0
        public HitRequest(TargetHitType targetHitType, ClientSession session, Skill skill, short?skillEffect = null, short?mapX = null, short?mapY = null, ComboDTO skillCombo = null, bool showTargetAnimation = false, List <BCard> skillBCards = null)
        {
            HitTimestamp           = DateTime.Now;
            Session                = session;
            Skill                  = skill;
            TargetHitType          = targetHitType;
            SkillEffect            = skillEffect ?? skill.Effect;
            ShowTargetHitAnimation = showTargetAnimation;

            if (mapX.HasValue)
            {
                MapX = mapX.Value;
            }

            if (mapY.HasValue)
            {
                MapY = mapY.Value;
            }

            if (skillCombo != null)
            {
                SkillCombo = skillCombo;
            }

            if (skillBCards != null)
            {
                SkillBCards = skillBCards;
            }
            else
            {
                SkillBCards = skill?.BCards ?? new List <BCard>();
            }
        }
        public IHttpActionResult GetAnItemById(int id)
        {
            ComboDTO dto = ComboBUS.getById(id);

            if (dto == null)
            {
                return(NotFound());
            }
            return(Ok(dto));
        }
Exemple #6
0
 public ComboDTO Insert(ComboDTO combo)
 {
     using (var context = DataAccessHelper.CreateContext())
     {
         Combo entity = _mapper.Map <Combo>(combo);
         context.Combo.Add(entity);
         context.SaveChanges();
         return(_mapper.Map <ComboDTO>(entity));
     }
 }
Exemple #7
0
 public static bool ToComboDTO(Combo input, ComboDTO output)
 {
     if (input == null)
     {
         return(false);
     }
     output.Animation = input.Animation;
     output.ComboId   = input.ComboId;
     output.Effect    = input.Effect;
     output.Hit       = input.Hit;
     output.SkillVNum = input.SkillVNum;
     return(true);
 }
Exemple #8
0
 public IEnumerable <ComboDTO> LoadByVNumHitAndEffect(short skillVNum, short hit, short effect)
 {
     using (OpenNosContext context = DataAccessHelper.CreateContext())
     {
         List <ComboDTO> result = new List <ComboDTO>();
         foreach (Combo combo in context.Combo.Where(s => s.SkillVNum == skillVNum && s.Hit == hit && s.Effect == effect))
         {
             ComboDTO dto = new ComboDTO();
             Mapper.Mapper.Instance.ComboMapper.ToComboDTO(combo, dto);
             result.Add(dto);
         }
         return(result);
     }
 }
Exemple #9
0
 public IEnumerable <ComboDTO> LoadAll()
 {
     using (OpenNosContext context = DataAccessHelper.CreateContext())
     {
         List <ComboDTO> result = new List <ComboDTO>();
         foreach (Combo combo in context.Combo)
         {
             ComboDTO dto = new ComboDTO();
             Mapper.Mapper.Instance.ComboMapper.ToComboDTO(combo, dto);
             result.Add(dto);
         }
         return(result);
     }
 }
Exemple #10
0
 public IEnumerable <ComboDTO> LoadBySkillVnum(short skillVNum)
 {
     using (OpenNosContext context = DataAccessHelper.CreateContext())
     {
         List <ComboDTO> result = new List <ComboDTO>();
         foreach (Combo combo in context.Combo.Where(c => c.SkillVNum == skillVNum))
         {
             ComboDTO dto = new ComboDTO();
             Mapper.Mapper.Instance.ComboMapper.ToComboDTO(combo, dto);
             result.Add(dto);
         }
         return(result);
     }
 }
        private void buttonAddCombo_Click(object sender, EventArgs e)
        {
            string  comboName = textBoxComboName.Text;
            decimal price     = Convert.ToDecimal(textBoxPriceCombo.Text);
            string  detail    = textBoxComboDetail.Text;
            int     idCatalog = (comboBoxComboCatalog.SelectedItem as CatalogDTO).Id;

            ComboDTO combo = new ComboDTO();

            combo.ComboName    = comboName;
            combo.ComboDetails = detail;
            combo.Price        = price;
            combo.IdCatalog    = idCatalog;
            service.createCombo(combo);
            loadCombo();
        }
Exemple #12
0
 public ComboDTO Insert(ComboDTO combo)
 {
     try
     {
         using (var context = DataAccessHelper.CreateContext())
         {
             Combo entity = _mapper.Map <Combo>(combo);
             context.Combo.Add(entity);
             context.SaveChanges();
             return(_mapper.Map <ComboDTO>(entity));
         }
     }
     catch (Exception e)
     {
         Logger.Error(e);
         return(null);
     }
 }
Exemple #13
0
        public ComboDTO LoadById(short comboId)
        {
            try
            {
                using (OpenNosContext context = DataAccessHelper.CreateContext())
                {
                    ComboDTO dto = new ComboDTO();
                    if (Mapper.Mapper.Instance.ComboMapper.ToComboDTO(context.Combo.FirstOrDefault(s => s.SkillVNum.Equals(comboId)), dto))
                    {
                        return(dto);
                    }

                    return(null);
                }
            }
            catch (Exception e)
            {
                Logger.Error(e);
                return(null);
            }
        }
 private void textBoxIdCombo_TextChanged(object sender, EventArgs e)
 {
     if (!textBoxIdCombo.Text.Equals("0") && !textBoxIdCombo.Text.Equals(""))
     {
         int      idCombo = Convert.ToInt32(textBoxIdCombo.Text);
         ComboDTO combo   = service.getComboByID(idCombo);
         bindingSourceComboProduct.DataSource = service.getProductByIdCombo(idCombo);
         int index = -1;
         int i     = 0;
         foreach (CatalogDTO item in comboBoxComboCatalog.Items)
         {
             if (item.Id == combo.IdCatalog)
             {
                 index = i;
                 break;
             }
             i++;
         }
         comboBoxComboCatalog.SelectedIndex = index;
     }
 }
Exemple #15
0
 public async Task <IActionResult> Update(int id, ComboDTO ComboDTO)
 {
     if (ComboDTO.ComboId != id)
     {
         return(BadRequest());
     }
     try
     {
         var Combo = _mapper.Map <ComboDTO, Combo>(ComboDTO);
         await _unitOfWork.Combos.Update(id, Combo);
     }
     catch (DbUpdateConcurrencyException)
     {
         if (!await ComboExists(id))
         {
             return(NotFound());
         }
         else
         {
             throw;
         }
     }
     return(NoContent());
 }
Exemple #16
0
        public ComboDTO Insert(ComboDTO combo)
        {
            try
            {
                using (OpenNosContext context = DataAccessHelper.CreateContext())
                {
                    Combo entity = new Combo();
                    Mapper.Mapper.Instance.ComboMapper.ToCombo(combo, entity);
                    context.Combo.Add(entity);
                    context.SaveChanges();
                    if (Mapper.Mapper.Instance.ComboMapper.ToComboDTO(entity, combo))
                    {
                        return(combo);
                    }

                    return(null);
                }
            }
            catch (Exception e)
            {
                Logger.Error(e);
                return(null);
            }
        }
Exemple #17
0
 public void editCombo(ComboDTO combo)
 {
     comboService.edit(combo);
 }
Exemple #18
0
 public void edit(ComboDTO combo)
 {
     comboRepository.edit(mapper.Map <ComboDTO, Combo>(combo));
 }
        public void TargetHit(IBattleEntity target, TargetHitType hitType, Skill skill, short?skillEffect = null,
                              short?mapX = null, short?mapY = null, ComboDTO skillCombo = null, bool showTargetAnimation = false,
                              bool isPvp = false)
        {
            if (target == null || Entity == null)
            {
                return;
            }

            if (!target.IsTargetable(Entity.SessionType(), isPvp) ||
                target.Faction == Entity.Faction && ServerManager.Instance.Act4Maps.Any(m => m == Entity.MapInstance))
            {
                if (Session is Character cha)
                {
                    cha.Session.SendPacket($"cancel 2 {target.GetId()}");
                }

                return;
            }

            MapInstance mapInstance = target.MapInstance;
            int         hitmode     = 0;
            bool        onyxWings   = false;
            int         damage      = DamageHelper.Instance.GenerateDamage(this, target, skill, ref hitmode, ref onyxWings);

            if (skill != null && SkillHelper.Instance.NoDamageSkills != null)
            {
                if (SkillHelper.Instance.NoDamageSkills.Any(s => s == skill.SkillVNum))
                {
                    target.DealtDamage = 0;
                    damage             = 0;
                }
            }

            if (Session is Character charact && mapInstance != null && hitmode != 1)
            {
                target.RemoveBuff(548);
                if (onyxWings)
                {
                    short onyxX  = (short)(charact.PositionX + 2);
                    short onyxY  = (short)(charact.PositionY + 2);
                    int   onyxId = mapInstance.GetNextId();
                    var   onyx   = new MapMonster
                    {
                        MonsterVNum   = 2371,
                        MapX          = onyxX,
                        MapY          = onyxY,
                        MapMonsterId  = onyxId,
                        IsHostile     = false,
                        IsMoving      = false,
                        ShouldRespawn = false
                    };
                    mapInstance.Broadcast($"guri 31 1 {charact.CharacterId} {onyxX} {onyxY}");
                    onyx.Initialize(mapInstance);
                    mapInstance.AddMonster(onyx);
                    mapInstance.Broadcast(onyx.GenerateIn());
                    target.GetDamage(target.DealtDamage / 2, Entity, false);
                    Observable.Timer(TimeSpan.FromMilliseconds(350)).Subscribe(o =>
                    {
                        mapInstance.Broadcast(
                            $"su 3 {onyxId} {(target is Character ? "1" : "3")} {target.GetId()} -1 0 -1 {skill.Effect} -1 -1 1 {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {(target.BattleEntity.IsReflecting ? 0 : target.DealtDamage) / 2} 0 0");
                        mapInstance.RemoveMonster(onyx);
                        mapInstance.Broadcast(onyx.GenerateOut());
                    });
                }

                if (target is Character tchar)
                {
                    if (tchar.ReflectiveBuffs.Any())
                    {
                        int?multiplier = 0;

                        foreach (KeyValuePair <short, int?> entry in tchar.ReflectiveBuffs)
                        {
                            multiplier += entry.Value;
                        }
                        ushort damaged = (ushort)(damage > tchar.Level * multiplier ? tchar.Level * multiplier : damage);
                        mapInstance.Broadcast(
                            $"su 1 {tchar.GetId()} 1 {charact.GetId()} -1 0 -1 {skill.Effect} -1 -1 1 {(int)(tchar.Hp / (double)target.MaxHp * 100)} {damaged} 0 1");
                        charact.Hp = charact.Hp - damaged <= 0 ? 1 : charact.Hp - damaged;
                        charact.Session.SendPacket(charact.GenerateStat());
                        target.DealtDamage = 0;
                    }
                }
                else if (target is MapMonster tmon)
                {
                    if (tmon.ReflectiveBuffs.Any())
                    {
                        int?multiplier = 0;

                        foreach (KeyValuePair <short, int?> entry in tmon.ReflectiveBuffs)
                        {
                            multiplier += entry.Value;
                        }

                        ushort damaged = (ushort)(damage > tmon.Monster.Level * multiplier ? tmon.Monster.Level * multiplier : damage);
                        charact.Hp -= charact.Hp - damaged <= 0 ? 1 : charact.Hp - damaged;
                        charact.Session.SendPacket(charact.GenerateStat());
                        mapInstance.Broadcast(
                            $"su 3 {tmon.GetId()} 1 {charact.GetId()} -1 0 -1 {skill.Effect} -1 -1 1 {(int)(tmon.CurrentHp / (double)target.MaxHp * 100)} {damaged} 0 1");
                        target.DealtDamage = 0;
                    }
                }
            }

            if (target.GetSession() is Character character)
            {
                damage             = (ushort)(character.HasGodMode ? 0 : damage);
                target.DealtDamage = (ushort)(character.HasGodMode ? 0 : damage);
                if (character.IsSitting)
                {
                    character.IsSitting = false;
                    character.MapInstance.Broadcast(character.GenerateRest());
                }
            }
            else if (target.GetSession() is Mate mate)
            {
                if (mate.IsSitting)
                {
                    mate.IsSitting = false;
                    mate.Owner.MapInstance.Broadcast(mate.GenerateRest());
                }
            }

            int castTime = 0;

            if (skill != null && skill.CastEffect != 0)
            {
                Entity.MapInstance.Broadcast(Entity.GenerateEff(skill.CastEffect), Entity.GetPos().X,
                                             Entity.GetPos().Y);
                castTime = skill.CastTime * 100;
            }

            Observable.Timer(TimeSpan.FromMilliseconds(castTime)).Subscribe(o => TargetHit2(target, hitType, skill,
                                                                                            damage, hitmode, skillEffect, mapX, mapY, skillCombo, showTargetAnimation, isPvp));
        }
Exemple #20
0
        internal void InsertSkills(string folder)
        {
            _folder = folder;
            var skills     = new List <SkillDTO>();
            var skill      = new SkillDTO();
            var combo      = new List <ComboDTO>();
            var skillCards = new List <BCardDTO>();
            var counter    = 0;

            using (var skillIdStream = new StreamReader(_folder + fileSkillId, Encoding.Default))
            {
                string line;
                while ((line = skillIdStream.ReadLine()) != null)
                {
                    var currentLine = line.Split('\t');

                    if (currentLine.Length > 2 && currentLine[1] == "VNUM")
                    {
                        skill = new SkillDTO
                        {
                            SkillVNum = short.Parse(currentLine[2])
                        };
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "NAME")
                    {
                        skill.Name = currentLine[2];
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "TYPE")
                    {
                        skill.SkillType = byte.Parse(currentLine[2]);
                        skill.CastId    = short.Parse(currentLine[3]);
                        skill.Class     = byte.Parse(currentLine[4]);
                        skill.Type      = byte.Parse(currentLine[5]);
                        skill.Element   = byte.Parse(currentLine[7]);
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "FCOMBO")
                    {
                        for (var i = 3; i < currentLine.Length - 4; i += 3)
                        {
                            var comb = new ComboDTO
                            {
                                SkillVNum = skill.SkillVNum,
                                Hit       = short.Parse(currentLine[i]),
                                Animation = short.Parse(currentLine[i + 1]),
                                Effect    = short.Parse(currentLine[i + 2])
                            };

                            if (comb.Hit == 0 && comb.Animation == 0 && comb.Effect == 0)
                            {
                                continue;
                            }

                            if (DAOFactory.ComboDAO.FirstOrDefault(s =>
                                                                   s.SkillVNum.Equals(comb.SkillVNum) && s.Hit.Equals(comb.Hit) &&
                                                                   s.Effect.Equals(comb.Effect)) == null)
                            {
                                combo.Add(comb);
                            }
                        }
                    }
                    else if (currentLine.Length > 3 && currentLine[1] == "COST")
                    {
                        skill.CPCost = currentLine[2] == "-1" ? (byte)0 : byte.Parse(currentLine[2]);
                        skill.Price  = int.Parse(currentLine[3]);
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "LEVEL")
                    {
                        skill.LevelMinimum = currentLine[2] != "-1" ? byte.Parse(currentLine[2]) : (byte)0;
                        if (skill.Class > 31)
                        {
                            var firstskill = skills.FirstOrDefault(s => s.Class == skill.Class);
                            if (firstskill == null || skill.SkillVNum <= firstskill.SkillVNum + 10)
                            {
                                switch (skill.Class)
                                {
                                case 8:
                                    switch (skills.Count(s => s.Class == skill.Class))
                                    {
                                    case 3:
                                        skill.LevelMinimum = 20;
                                        break;

                                    case 2:
                                        skill.LevelMinimum = 10;
                                        break;

                                    default:
                                        skill.LevelMinimum = 0;
                                        break;
                                    }

                                    break;

                                case 9:
                                    switch (skills.Count(s => s.Class == skill.Class))
                                    {
                                    case 9:
                                        skill.LevelMinimum = 20;
                                        break;

                                    case 8:
                                        skill.LevelMinimum = 16;
                                        break;

                                    case 7:
                                        skill.LevelMinimum = 12;
                                        break;

                                    case 6:
                                        skill.LevelMinimum = 8;
                                        break;

                                    case 5:
                                        skill.LevelMinimum = 4;
                                        break;

                                    default:
                                        skill.LevelMinimum = 0;
                                        break;
                                    }

                                    break;

                                case 16:
                                    switch (skills.Count(s => s.Class == skill.Class))
                                    {
                                    case 6:
                                        skill.LevelMinimum = 20;
                                        break;

                                    case 5:
                                        skill.LevelMinimum = 15;
                                        break;

                                    case 4:
                                        skill.LevelMinimum = 10;
                                        break;

                                    case 3:
                                        skill.LevelMinimum = 5;
                                        break;

                                    case 2:
                                        skill.LevelMinimum = 3;
                                        break;

                                    default:
                                        skill.LevelMinimum = 0;
                                        break;
                                    }

                                    break;

                                default:
                                    switch (skills.Count(s => s.Class == skill.Class))
                                    {
                                    case 10:
                                        skill.LevelMinimum = 20;
                                        break;

                                    case 9:
                                        skill.LevelMinimum = 16;
                                        break;

                                    case 8:
                                        skill.LevelMinimum = 12;
                                        break;

                                    case 7:
                                        skill.LevelMinimum = 8;
                                        break;

                                    case 6:
                                        skill.LevelMinimum = 4;
                                        break;

                                    default:
                                        skill.LevelMinimum = 0;
                                        break;
                                    }

                                    break;
                                }
                            }
                        }

                        skill.MinimumAdventurerLevel = currentLine[3] != "-1" ? byte.Parse(currentLine[3]) : (byte)0;
                        skill.MinimumSwordmanLevel   = currentLine[4] != "-1" ? byte.Parse(currentLine[4]) : (byte)0;
                        skill.MinimumArcherLevel     = currentLine[5] != "-1" ? byte.Parse(currentLine[5]) : (byte)0;
                        skill.MinimumMagicianLevel   = currentLine[6] != "-1" ? byte.Parse(currentLine[6]) : (byte)0;
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "EFFECT")
                    {
                        skill.CastEffect      = short.Parse(currentLine[3]);
                        skill.CastAnimation   = short.Parse(currentLine[4]);
                        skill.Effect          = short.Parse(currentLine[5]);
                        skill.AttackAnimation = short.Parse(currentLine[6]);
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "TARGET")
                    {
                        skill.TargetType  = byte.Parse(currentLine[2]);
                        skill.HitType     = byte.Parse(currentLine[3]);
                        skill.Range       = byte.Parse(currentLine[4]);
                        skill.TargetRange = byte.Parse(currentLine[5]);
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "DATA")
                    {
                        skill.UpgradeSkill = short.Parse(currentLine[2]);
                        skill.UpgradeType  = short.Parse(currentLine[3]);
                        skill.CastTime     = short.Parse(currentLine[6]);
                        skill.Cooldown     = short.Parse(currentLine[7]);
                        skill.MpCost       = short.Parse(currentLine[10]);
                        skill.ItemVNum     = short.Parse(currentLine[12]);
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "BASIC")
                    {
                        var type = (byte)int.Parse(currentLine[3]);
                        if (type == 0 || type == 255)
                        {
                            continue;
                        }

                        var first    = int.Parse(currentLine[5]);
                        var itemCard = new BCardDTO
                        {
                            SkillVNum      = skill.SkillVNum,
                            Type           = type,
                            SubType        = (byte)((int.Parse(currentLine[4]) + 1) * 10 + 1 + (first < 0 ? 1 : 0)),
                            IsLevelScaled  = Convert.ToBoolean(first % 4),
                            IsLevelDivided = first % 4 == 2,
                            FirstData      = (short)(first > 0 ? first : -first / 4),
                            SecondData     = (short)(int.Parse(currentLine[6]) / 4),
                            ThirdData      = (short)(int.Parse(currentLine[7]) / 4)
                        };
                        skillCards.Add(itemCard);
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "FCOMBO")
                    {
                        // investigate

                        /*
                         * if (currentLine[2] == "1")
                         * {
                         *  combo.FirstActivationHit = byte.Parse(currentLine[3]);
                         *  combo.FirstComboAttackAnimation = short.Parse(currentLine[4]);
                         *  combo.FirstComboEffect = short.Parse(currentLine[5]);
                         *  combo.SecondActivationHit = byte.Parse(currentLine[3]);
                         *  combo.SecondComboAttackAnimation = short.Parse(currentLine[4]);
                         *  combo.SecondComboEffect = short.Parse(currentLine[5]);
                         *  combo.ThirdActivationHit = byte.Parse(currentLine[3]);
                         *  combo.ThirdComboAttackAnimation = short.Parse(currentLine[4]);
                         *  combo.ThirdComboEffect = short.Parse(currentLine[5]);
                         *  combo.FourthActivationHit = byte.Parse(currentLine[3]);
                         *  combo.FourthComboAttackAnimation = short.Parse(currentLine[4]);
                         *  combo.FourthComboEffect = short.Parse(currentLine[5]);
                         *  combo.FifthActivationHit = byte.Parse(currentLine[3]);
                         *  combo.FifthComboAttackAnimation = short.Parse(currentLine[4]);
                         *  combo.FifthComboEffect = short.Parse(currentLine[5]);
                         * }
                         */
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "CELL")
                    {
                        // investigate
                    }
                    else if (currentLine.Length > 1 && currentLine[1] == "Z_DESC")
                    {
                        // investigate
                        var skill1 = skill;
                        if (DAOFactory.SkillDAO.FirstOrDefault(s => s.SkillVNum.Equals(skill1.SkillVNum)) != null)
                        {
                            continue;
                        }

                        skills.Add(skill);
                        counter++;
                    }
                }

                IEnumerable <SkillDTO> skillDtos = skills;
                IEnumerable <ComboDTO> comboDtos = combo;
                IEnumerable <BCardDTO> bCardDtos = skillCards;


                DAOFactory.SkillDAO.InsertOrUpdate(skillDtos);
                DAOFactory.ComboDAO.InsertOrUpdate(comboDtos);
                DAOFactory.BCardDAO.InsertOrUpdate(bCardDtos);

                Logger.Log.Info(string.Format(LogLanguage.Instance.GetMessageFromKey(LanguageKey.SKILLS_PARSED),
                                              counter));
            }
        }
        public void TargetHit(IBattleEntity target, TargetHitType hitType, Skill skill, short?skillEffect = null, short?mapX = null, short?mapY = null, ComboDTO skillCombo = null, bool showTargetAnimation = false, bool isPvp = false)
        {
            if (!target.IsTargetable(Entity.SessionType(), isPvp) || (target.Faction == Entity.Faction && ServerManager.Instance.Act4Maps.Any(m => m == Entity.MapInstance)))
            {
                if (Session is Character cha)
                {
                    cha.Session.SendPacket($"cancel 2 {target.GetId()}");
                }
                return;
            }

            MapInstance mapInstance = target.MapInstance;
            int         hitmode     = 0;
            bool        onyxWings   = false;
            ushort      damage      = GenerateDamage(target, skill, ref hitmode, ref onyxWings);

            if (Session is Character charact && onyxWings && mapInstance != null)
            {
                short onyxX  = (short)(charact.PositionX + 2);
                short onyxY  = (short)(charact.PositionY + 2);
                int   onyxId = mapInstance.GetNextId();
                var   onyx   = new MapMonster
                {
                    MonsterVNum   = 2371,
                    MapX          = onyxX,
                    MapY          = onyxY,
                    MapMonsterId  = onyxId,
                    IsHostile     = false,
                    IsMoving      = false,
                    ShouldRespawn = false
                };
                mapInstance.Broadcast($"guri 31 1 {charact.CharacterId} {onyxX} {onyxY}");
                onyx.Initialize(mapInstance);
                mapInstance.AddMonster(onyx);
                mapInstance.Broadcast(onyx.GenerateIn());
                target.GetDamage(damage / 2, Entity, false);
                Observable.Timer(TimeSpan.FromMilliseconds(350)).Subscribe(o =>
                {
                    mapInstance.Broadcast($"su 3 {onyxId} 3 {target.GetId()} -1 0 -1 {skill.Effect} -1 -1 1 {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {damage / 2} 0 0");
                    mapInstance.RemoveMonster(onyx);
                    mapInstance.Broadcast(onyx.GenerateOut());
                });
            }

            if (target.GetSession() is Character character)
            {
                damage = (ushort)(character.HasGodMode ? 0 : damage);
                if (character.IsSitting)
                {
                    character.IsSitting = false;
                    character.MapInstance.Broadcast(character.GenerateRest());
                }
            }
            else if (target.GetSession() is Mate mate)
            {
                if (mate.IsSitting)
                {
                    mate.IsSitting = false;
                    mate.Owner.MapInstance.Broadcast(mate.GenerateRest());
                }
            }

            int castTime = 0;

            if (skill != null && skill.CastEffect != 0)
            {
                Entity.MapInstance.Broadcast(Entity.GenerateEff(skill.CastEffect), Entity.GetPos().X, Entity.GetPos().Y);
                castTime = skill.CastTime * 100;
            }
            Observable.Timer(TimeSpan.FromMilliseconds(castTime)).Subscribe(o => TargetHit2(target, hitType, skill, damage, hitmode, skillEffect, mapX, mapY, skillCombo, showTargetAnimation, isPvp));
        }
        private void TargetHit2(IBattleEntity target, TargetHitType hitType, Skill skill, int damage, int hitmode, short?skillEffect = null, short?mapX = null, short?mapY = null, ComboDTO skillCombo = null, bool showTargetAnimation = false, bool isPvp = false, bool isRange = false)
        {
            target.GetDamage(damage, Entity, !(Session is MapMonster mon && mon.IsInvicible));
            string str = $"su {(byte)Entity.SessionType()} {Entity.GetId()} {(byte)target.SessionType()} {target.GetId()} {skill?.SkillVNum ?? 0} {skill?.Cooldown ?? 0}";

            switch (hitType)
            {
            case TargetHitType.SingleTargetHit:
                str += $" {skill?.AttackAnimation ?? 11} {skill?.Effect ?? skillEffect ?? 0} {Entity.GetPos().X} {Entity.GetPos().Y} {(target.CurrentHp > 0 ? 1 : 0)} {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {damage} {hitmode} {skill?.SkillType - 1 ?? 0}";
                break;

            case TargetHitType.SingleTargetHitCombo:
                str += $" {skillCombo?.Animation ?? 0} {skillCombo?.Effect ?? 0} {Entity.GetPos().X} {Entity.GetPos().Y} {(target.CurrentHp > 0 ? 1 : 0)} {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {damage} {hitmode} {skill.SkillType - 1}";
                break;

            case TargetHitType.SingleAOETargetHit:
                switch (hitmode)
                {
                case 1:
                    hitmode = 4;
                    break;

                case 3:
                    hitmode = 6;
                    break;

                default:
                    hitmode = 5;
                    break;
                }
                if (showTargetAnimation)
                {
                    Entity.MapInstance.Broadcast($" {skill?.AttackAnimation ?? 0} {skill?.Effect ?? 0} 0 0 {(target.CurrentHp > 0 ? 1 : 0)} {(int)(target.CurrentHp / (double)target.MaxHp * 100)} 0 0 {skill.SkillType - 1}");
                }
                str += $" {skill?.AttackAnimation ?? 0} {skill?.Effect ?? 0} {Entity.GetPos().X} {Entity.GetPos().Y} {(target.CurrentHp > 0 ? 1 : 0)} {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {damage} {hitmode} {skill.SkillType - 1}";
                break;

            case TargetHitType.AOETargetHit:
                switch (hitmode)
                {
                case 1:
                    hitmode = 4;
                    break;

                case 3:
                    hitmode = 6;
                    break;

                default:
                    hitmode = 5;
                    break;
                }
                str += $" {skill?.AttackAnimation ?? 0} {skill?.Effect ?? 0} {Entity.GetPos().X} {Entity.GetPos().Y} {(target.CurrentHp > 0 ? 1 : 0)} {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {damage} {hitmode} {skill.SkillType - 1}";
                break;

            case TargetHitType.ZoneHit:
                str += $" {skill?.AttackAnimation ?? 0} {skillEffect ?? 0} {mapX ?? Entity.GetPos().X} {mapY ?? Entity.GetPos().Y} {(target.CurrentHp > 0 ? 1 : 0)} {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {damage} 5 {skill.SkillType - 1}";
                break;

            case TargetHitType.SpecialZoneHit:
                str += $" {skill?.AttackAnimation ?? 0} {skillEffect ?? 0} {Entity.GetPos().X} {Entity.GetPos().Y} {(target.CurrentHp > 0 ? 1 : 0)} {(int)(target.CurrentHp / (double)target.MaxHp * 100)} {damage} 0 {skill.SkillType - 1}";
                break;
            }
            Entity.MapInstance.Broadcast(str);

            bool isBoss = false;

            if (Entity.GetSession() is Character character)
            {
                character.LastSkillUse = DateTime.Now;
                RemoveBuff(85); // Hideout
            }
            else if (Entity.GetSession() is Mate mate)
            {
                mate.LastSkillUse = DateTime.Now;
            }
            if (target.GetSession() is MapMonster monster)
            {
                if (monster.Target == null)
                {
                    monster.LastSkill = DateTime.Now;
                }
                monster.Target = Entity;
                isBoss         = monster.IsBoss;
                if (isBoss)
                {
                    Entity.MapInstance?.Broadcast(monster.GenerateBoss());
                }
                monster.DamageList.AddOrUpdate(Entity, damage, (key, oldValue) => oldValue + damage);
            }

            if (!isBoss && skill != null)
            {
                foreach (BCard bcard in skill.BCards.Where(b => b != null))
                {
                    switch ((CardType)bcard.Type)
                    {
                    case CardType.Buff:
                        Buff.Buff b = new Buff.Buff(bcard.SecondData);
                        switch (b.Card?.BuffType)
                        {
                        case BuffType.Bad:
                            bcard.ApplyBCards(target, Entity);
                            break;

                        case BuffType.Good:
                        case BuffType.Neutral:
                            bcard.ApplyBCards(Entity, Entity);
                            break;
                        }
                        break;

                    case CardType.HealingBurningAndCasting:
                        switch ((AdditionalTypes.HealingBurningAndCasting)bcard.SubType)
                        {
                        case AdditionalTypes.HealingBurningAndCasting.RestoreHP:
                        case AdditionalTypes.HealingBurningAndCasting.RestoreHPWhenCasting:
                            bcard.ApplyBCards(Entity, Entity);
                            break;

                        default:
                            bcard.ApplyBCards(target, Entity);
                            break;
                        }
                        break;

                    case CardType.MeditationSkill:
                        bcard.ApplyBCards(Entity);
                        break;

                    default:
                        bcard.ApplyBCards(target, Entity);
                        break;
                    }
                }
            }

            if (skill == null || (skill.Range <= 0 && skill.TargetRange <= 0) || isRange || !(Entity.GetSession() is MapMonster))
            {
                return;
            }

            foreach (IBattleEntity entitiesInRange in Entity.MapInstance?.GetBattleEntitiesInRange(Entity.GetPos(), skill.TargetRange).Where(e => e != target && e.IsTargetable(Entity.SessionType())))
            {
                TargetHit2(entitiesInRange, TargetHitType.SingleTargetHit, skill, damage, hitmode, isRange: true);
            }
        }
Exemple #23
0
 public void createCombo(ComboDTO combo)
 {
     comboService.create(combo);
 }
Exemple #24
0
        public void TargetHit(int castingId, int targetId)
        {
            IList <string> broadcastPackets = new List <string>();

            List <CharacterSkill> skills = Session.Character.UseSp ? Session.Character.SkillsSp.GetAllItems() : Session.Character.Skills.GetAllItems();
            bool notcancel = false;

            if ((DateTime.Now - Session.Character.LastTransform).TotalSeconds < 3)
            {
                Session.SendPacket("cancel 0 0");
                Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_ATTACK"), 0));
                return;
            }
            if (skills != null)
            {
                ushort         damage  = 0;
                int            hitmode = 0;
                CharacterSkill ski     = skills.FirstOrDefault(s => s.Skill?.CastId == castingId && s.Skill?.UpgradeSkill == 0);
                Session.SendPacket("ms_c 0");
                if (!Session.Character.WeaponLoaded(ski))
                {
                    Session.SendPacket("cancel 2 0");
                    return;
                }
                for (int i = 0; i < 10 && !ski.CanBeUsed(); i++)
                {
                    Thread.Sleep(100);
                    if (i == 10)
                    {
                        Session.SendPacket("cancel 2 0");
                        return;
                    }
                }

                if (ski != null && Session.Character.Mp >= ski.Skill.MpCost)
                {
                    if (ski.Skill.TargetType == 1 && ski.Skill.HitType == 1)
                    {
                        Session.Character.LastSkillUse = DateTime.Now;
                        if (!Session.Character.HasGodMode)
                        {
                            Session.Character.Mp -= ski.Skill.MpCost;
                        }
                        if (Session.Character.UseSp && ski.Skill.CastEffect != -1)
                        {
                            Session.SendPackets(Session.Character.GenerateQuicklist());
                        }

                        Session.SendPacket(Session.Character.GenerateStat());
                        CharacterSkill skillinfo = Session.Character.Skills.GetAllItems().OrderBy(o => o.SkillVNum).FirstOrDefault(s => s.Skill.UpgradeSkill == ski.Skill.SkillVNum && s.Skill.Effect > 0 && s.Skill.SkillType == 2);
                        Session.CurrentMap?.Broadcast($"ct 1 {Session.Character.CharacterId} 1 {Session.Character.CharacterId} {ski.Skill.CastAnimation} {(skillinfo != null ? skillinfo.Skill.CastEffect : ski.Skill.CastEffect)} {ski.Skill.SkillVNum}");

                        // Generate scp
                        ski.LastUse = DateTime.Now;
                        if (ski.Skill.CastEffect != 0)
                        {
                            Thread.Sleep(ski.Skill.CastTime * 100);
                        }
                        notcancel = true;
                        MapMonster mmon;
                        broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 1 {Session.Character.CharacterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(skillinfo != null ? skillinfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} 1 {((int)((double)Session.Character.Hp / Session.Character.HPLoad()) * 100)} 0 -2 {ski.Skill.SkillType - 1}");
                        if (ski.Skill.TargetRange != 0)
                        {
                            foreach (MapMonster mon in Session.CurrentMap.GetListMonsterInRange(Session.Character.MapX, Session.Character.MapY, ski.Skill.TargetRange).Where(s => s.CurrentHp > 0))
                            {
                                mmon = Session.CurrentMap.GetMonster(mon.MapMonsterId);
                                if (mmon != null)
                                {
                                    damage = GenerateDamage(mon.MapMonsterId, ski.Skill, ref hitmode);
                                    broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {mmon.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(skillinfo != null ? skillinfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} {(mmon.IsAlive ? 1 : 0)} {(int)(((float)mmon.CurrentHp / (float)mon.Monster.MaxHP) * 100)} {damage} 5 {ski.Skill.SkillType - 1}");
                                    Task.Factory.StartNew(() => { GenerateKillBonus(mon.MapMonsterId); });
                                }
                            }
                        }
                    }
                    else if (ski.Skill.TargetType == 0)
                    {
                        // if monster target
                        MapMonster monsterToAttack = Session.CurrentMap.GetMonster(targetId);
                        if (monsterToAttack != null && monsterToAttack.IsAlive)
                        {
                            NpcMonster monsterToAttackInfo = ServerManager.GetNpc(monsterToAttack.MonsterVNum);
                            if (monsterToAttack != null && ski != null && ski.CanBeUsed())
                            {
                                if (Session.Character.Mp >= ski.Skill.MpCost)
                                {
                                    short distanceX = (short)(Session.Character.MapX - monsterToAttack.MapX);
                                    short distanceY = (short)(Session.Character.MapY - monsterToAttack.MapY);

                                    if (Map.GetDistance(new MapCell()
                                    {
                                        X = Session.Character.MapX, Y = Session.Character.MapY
                                    },
                                                        new MapCell()
                                    {
                                        X = monsterToAttack.MapX, Y = monsterToAttack.MapY
                                    }) <= ski.Skill.Range + (DateTime.Now - monsterToAttack.LastMove).TotalSeconds * 2 * (monsterToAttackInfo.Speed == 0 ? 1 : monsterToAttackInfo.Speed) || ski.Skill.TargetRange != 0)
                                    {
                                        Session.Character.LastSkillUse = DateTime.Now;
                                        damage = GenerateDamage(monsterToAttack.MapMonsterId, ski.Skill, ref hitmode);

                                        ski.LastUse = DateTime.Now;
                                        Task.Factory.StartNew(() => { GenerateKillBonus(monsterToAttack.MapMonsterId); });
                                        notcancel = true;
                                        if (!Session.Character.HasGodMode)
                                        {
                                            Session.Character.Mp -= ski.Skill.MpCost;
                                        }
                                        if (Session.Character.UseSp && ski.Skill.CastEffect != -1)
                                        {
                                            Session.SendPackets(Session.Character.GenerateQuicklist());
                                        }
                                        Session.SendPacket(Session.Character.GenerateStat());
                                        CharacterSkill characterSkillInfo = Session.Character.Skills.GetAllItems().OrderBy(o => o.SkillVNum).FirstOrDefault(s => s.Skill.UpgradeSkill == ski.Skill.SkillVNum && s.Skill.Effect > 0 && s.Skill.SkillType == 2);
                                        Session.CurrentMap?.Broadcast($"ct 1 {Session.Character.CharacterId} 3 {monsterToAttack.MapMonsterId} {ski.Skill.CastAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.CastEffect : ski.Skill.CastEffect)} {ski.Skill.SkillVNum}");
                                        Session.Character.Skills.GetAllItems().Where(s => s.Id != ski.Id).ToList().ForEach(i => i.Hit = 0);

                                        // Generate scp
                                        ski.LastUse = DateTime.Now;
                                        if (damage == 0 || (DateTime.Now - ski.LastUse).TotalSeconds > 3)
                                        {
                                            ski.Hit = 0;
                                        }
                                        else
                                        {
                                            ski.Hit++;
                                        }
                                        if (ski.Skill.CastEffect != 0)
                                        {
                                            Thread.Sleep(ski.Skill.CastTime * 100);
                                        }

                                        ComboDTO skillCombo = ski.Skill.Combos.FirstOrDefault(s => ski.Hit == s.Hit);
                                        if (skillCombo != null)
                                        {
                                            if (ski.Skill.Combos.OrderByDescending(s => s.Hit).ElementAt(0).Hit == ski.Hit)
                                            {
                                                ski.Hit = 0;
                                            }
                                            broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {monsterToAttack.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {skillCombo.Animation} {skillCombo.Effect} {Session.Character.MapX} {Session.Character.MapY} {(monsterToAttack.IsAlive ? 1 : 0)} {(int)(((float)monsterToAttack.CurrentHp / (float)monsterToAttackInfo.MaxHP) * 100)} {damage} {hitmode} {ski.Skill.SkillType - 1}");
                                        }
                                        else
                                        {
                                            broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {monsterToAttack.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} {(monsterToAttack.IsAlive ? 1 : 0)} {(int)(((float)monsterToAttack.CurrentHp / (float)monsterToAttackInfo.MaxHP) * 100)} {damage} {hitmode} {ski.Skill.SkillType - 1}");
                                        }
                                        if (ski.Skill.TargetRange != 0)
                                        {
                                            IEnumerable <MapMonster> monstersInAOERange = Session.CurrentMap?.GetListMonsterInRange(monsterToAttack.MapX, monsterToAttack.MapY, ski.Skill.TargetRange).ToList();
                                            foreach (MapMonster mon in monstersInAOERange.Where(s => s.CurrentHp > 0))
                                            {
                                                damage = GenerateDamage(mon.MapMonsterId, ski.Skill, ref hitmode);
                                                broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {mon.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} {(mon.IsAlive ? 1 : 0)} {(int)(((float)mon.CurrentHp / (float)ServerManager.GetNpc(mon.MonsterVNum).MaxHP) * 100)} {damage} 5 {ski.Skill.SkillType - 1}");
                                                Task.Factory.StartNew(() => { GenerateKillBonus(mon.MapMonsterId); });
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    // send su packets
                    Session.CurrentMap.Broadcast(broadcastPackets.ToArray());

                    Task t = Task.Factory.StartNew((Func <Task>)(async() =>
                    {
                        await Task.Delay((ski.Skill.Cooldown) * 100);
                        Session.SendPacket($"sr {castingId}");
                    }));
                }
                else
                {
                    notcancel = false;
                    Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MP"), 10));
                }
            }
            if (!notcancel)
            {
                Session.SendPacket($"cancel 2 {targetId}");
            }
        }
Exemple #25
0
 public void create(ComboDTO combo)
 {
     comboRepository.create(mapper.Map <ComboDTO, Combo>(combo));
 }
Exemple #26
0
 public ComboDTO Insert(ComboDTO combo)
 {
     throw new NotImplementedException();
 }
Exemple #27
0
        public void TargetHit(int castingId, int targetId)
        {
            if ((DateTime.Now - Session.Character.LastTransform).TotalSeconds < 3)
            {
                Session.SendPacket("cancel 0 0");
                Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_ATTACK"), 0));
                return;
            }

            bool doNotCancel             = false;
            List <CharacterSkill> skills = Session.Character.UseSp ? Session.Character.SkillsSp.GetAllItems() : Session.Character.Skills.GetAllItems();

            if (skills != null)
            {
                CharacterSkill ski = skills.FirstOrDefault(s => s.Skill?.CastId == castingId && s.Skill?.UpgradeSkill == 0);
                Session.SendPacket("ms_c 0");
                if (!Session.Character.WeaponLoaded(ski) || !ski.CanBeUsed())
                {
                    Session.SendPacket("cancel 2 0");
                    return;
                }

                if (ski != null && Session.Character.Mp >= ski.Skill.MpCost)
                {
                    // AOE Target hit
                    if (ski.Skill.TargetType == 1 && ski.Skill.HitType == 1)
                    {
                        Session.Character.LastSkillUse = DateTime.Now;
                        if (!Session.Character.HasGodMode)
                        {
                            Session.Character.Mp -= ski.Skill.MpCost;
                        }

                        if (Session.Character.UseSp && ski.Skill.CastEffect != -1)
                        {
                            Session.SendPackets(Session.Character.GenerateQuicklist());
                        }

                        Session.SendPacket(Session.Character.GenerateStat());
                        CharacterSkill skillinfo = Session.Character.Skills.GetAllItems().OrderBy(o => o.SkillVNum).FirstOrDefault(s => s.Skill.UpgradeSkill == ski.Skill.SkillVNum && s.Skill.Effect > 0 && s.Skill.SkillType == 2);
                        Session.CurrentMap?.Broadcast($"ct 1 {Session.Character.CharacterId} 1 {Session.Character.CharacterId} {ski.Skill.CastAnimation} {(skillinfo != null ? skillinfo.Skill.CastEffect : ski.Skill.CastEffect)} {ski.Skill.SkillVNum}");

                        // Generate scp
                        ski.LastUse = DateTime.Now;
                        if (ski.Skill.CastEffect != 0)
                        {
                            Thread.Sleep(ski.Skill.CastTime * 100);
                        }

                        doNotCancel = true;
                        Session.CurrentMap.Broadcast($"su 1 {Session.Character.CharacterId} 1 {Session.Character.CharacterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(skillinfo != null ? skillinfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} 1 {((int)((double)Session.Character.Hp / Session.Character.HPLoad()) * 100)} 0 -2 {ski.Skill.SkillType - 1}");
                        if (ski.Skill.TargetRange != 0)
                        {
                            foreach (MapMonster mon in Session.CurrentMap.GetListMonsterInRange(Session.Character.MapX, Session.Character.MapY, ski.Skill.TargetRange).Where(s => s.CurrentHp > 0))
                            {
                                mon.HitQueue.Enqueue(new GameObject.Networking.HitRequest(TargetHitType.AOETargetHit, Session, ski.Skill, skillEffect: (skillinfo != null ? skillinfo.Skill.Effect : ski.Skill.Effect)));
                            }
                        }
                    }
                    else if (ski.Skill.TargetType == 0)
                    // monster target
                    {
                        MapMonster monsterToAttack = Session.CurrentMap.GetMonster(targetId);
                        if (monsterToAttack != null && monsterToAttack.IsAlive)
                        {
                            if (monsterToAttack != null && ski != null && ski.CanBeUsed())
                            {
                                if (Session.Character.Mp >= ski.Skill.MpCost)
                                {
                                    short distanceX = (short)(Session.Character.MapX - monsterToAttack.MapX);
                                    short distanceY = (short)(Session.Character.MapY - monsterToAttack.MapY);
                                    if (Map.GetDistance(new MapCell()
                                    {
                                        X = Session.Character.MapX, Y = Session.Character.MapY
                                    },
                                                        new MapCell()
                                    {
                                        X = monsterToAttack.MapX, Y = monsterToAttack.MapY
                                    }) <= (ski.Skill.Range) + monsterToAttack.Monster.BasicArea)
                                    {
                                        Session.Character.LastSkillUse = DateTime.Now;
                                        ski.LastUse = DateTime.Now;
                                        doNotCancel = true;
                                        if (!Session.Character.HasGodMode)
                                        {
                                            Session.Character.Mp -= ski.Skill.MpCost;
                                        }
                                        if (Session.Character.UseSp && ski.Skill.CastEffect != -1)
                                        {
                                            Session.SendPackets(Session.Character.GenerateQuicklist());
                                        }
                                        Session.SendPacket(Session.Character.GenerateStat());
                                        CharacterSkill characterSkillInfo = Session.Character.Skills.GetAllItems().OrderBy(o => o.SkillVNum)
                                                                            .FirstOrDefault(s => s.Skill.UpgradeSkill == ski.Skill.SkillVNum && s.Skill.Effect > 0 && s.Skill.SkillType == 2);

                                        Session.CurrentMap?.Broadcast($"ct 1 {Session.Character.CharacterId} 3 {monsterToAttack.MapMonsterId} {ski.Skill.CastAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.CastEffect : ski.Skill.CastEffect)} {ski.Skill.SkillVNum}");
                                        Session.Character.Skills.GetAllItems().Where(s => s.Id != ski.Id).ToList().ForEach(i => i.Hit = 0);

                                        // Generate scp
                                        ski.LastUse = DateTime.Now;
                                        if ((DateTime.Now - ski.LastUse).TotalSeconds > 3)
                                        {
                                            ski.Hit = 0;
                                        }
                                        else
                                        {
                                            ski.Hit++;
                                        }

                                        if (ski.Skill.CastEffect != 0)
                                        {
                                            Thread.Sleep(ski.Skill.CastTime * 100);
                                        }
                                        // check if we will hit mutltiple targets
                                        if (ski.Skill.TargetRange != 0)
                                        {
                                            ComboDTO skillCombo = ski.Skill.Combos.FirstOrDefault(s => ski.Hit == s.Hit);
                                            if (skillCombo != null)
                                            {
                                                if (ski.Skill.Combos.OrderByDescending(s => s.Hit).First().Hit == ski.Hit)
                                                {
                                                    ski.Hit = 0;
                                                }
                                                IEnumerable <MapMonster> monstersInAOERange = Session.CurrentMap?.GetListMonsterInRange(monsterToAttack.MapX, monsterToAttack.MapY, ski.Skill.TargetRange).ToList();
                                                foreach (MapMonster mon in monstersInAOERange.Where(s => s.CurrentHp > 0))
                                                {
                                                    mon.HitQueue.Enqueue(new GameObject.Networking.HitRequest(TargetHitType.SingleTargetHitCombo, Session, ski.Skill
                                                                                                              , skillCombo: skillCombo));
                                                }
                                            }
                                            else
                                            {
                                                IEnumerable <MapMonster> monstersInAOERange = Session.CurrentMap?.GetListMonsterInRange(monsterToAttack.MapX, monsterToAttack.MapY, ski.Skill.TargetRange).ToList();
                                                Session.CurrentMap.Broadcast($"su 1 {Session.Character.CharacterId} 3 {targetId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.Effect : ski.Skill.Effect)} 0 0 {(monsterToAttack.IsAlive ? 1 : 0)} {((int)((double)Session.Character.Hp / Session.Character.HPLoad()) * 100)} 0 0 {ski.Skill.SkillType - 1}");
                                                foreach (MapMonster mon in monstersInAOERange.Where(s => s.CurrentHp > 0))
                                                {
                                                    mon.HitQueue.Enqueue(new GameObject.Networking.HitRequest(TargetHitType.SingleAOETargetHit, Session, ski.Skill
                                                                                                              , skillEffect: (characterSkillInfo != null ? characterSkillInfo.Skill.Effect : ski.Skill.Effect)));
                                                }
                                            }
                                        }
                                        else
                                        {
                                            ComboDTO skillCombo = ski.Skill.Combos.FirstOrDefault(s => ski.Hit == s.Hit);
                                            if (skillCombo != null)
                                            {
                                                if (ski.Skill.Combos.OrderByDescending(s => s.Hit).First().Hit == ski.Hit)
                                                {
                                                    ski.Hit = 0;
                                                }
                                                monsterToAttack.HitQueue.Enqueue(new GameObject.Networking.HitRequest(TargetHitType.SingleTargetHitCombo, Session, ski.Skill, skillCombo: skillCombo));
                                            }
                                            else
                                            {
                                                monsterToAttack.HitQueue.Enqueue(new GameObject.Networking.HitRequest(TargetHitType.SingleTargetHit, Session, ski.Skill));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    Session.SendPacketAfterWait($"sr {castingId}", ski.Skill.Cooldown * 100);
                }
                else
                {
                    doNotCancel = false;
                    Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MP"), 10));
                }
            }

            if (!doNotCancel)
            {
                Session.SendPacket($"cancel 2 {targetId}");
            }
        }