예제 #1
0
 private static void GetZskill(IReadOnlyList <string> currentLine, NpcMonsterDto monster)
 {
     monster.AttackClass   = Convert.ToByte(currentLine[2]);
     monster.BasicRange    = Convert.ToByte(currentLine[3]);
     monster.BasicArea     = Convert.ToByte(currentLine[5]);
     monster.BasicCooldown = Convert.ToInt16(currentLine[6]);
 }
예제 #2
0
 public MateEntity(IPlayerEntity owner, CharacterMateDto dto, NpcMonsterDto npcMonster) : base(VisualType.Monster, dto.Id)
 {
     Owner        = owner;
     Mate         = dto;
     NpcMonster   = npcMonster;
     Level        = dto.Level;
     LevelXp      = dto.Experience;
     Hp           = dto.Hp;
     HpMax        = dto.Hp;
     Mp           = dto.Mp;
     MpMax        = dto.Mp;
     IsTeamMember = dto.IsTeamMember;
     MateType     = dto.MateType;
     PetId        = 0;
     Movable      = new MovableComponent(this, NpcMonster.Speed)
     {
         Actual = new Position <short> {
             X = dto.MapX, Y = dto.MapY
         },
         Destination = new Position <short> {
             X = dto.MapX, Y = dto.MapY
         }
     };
     _visibility    = new VisibilityComponent(this);
     SkillComponent = new SkillComponent(this);
     Components     = new Dictionary <Type, IComponent>
     {
         { typeof(VisibilityComponent), _visibility },
         { typeof(MovableComponent), Movable },
         { typeof(SkillComponent), SkillComponent }
     };
 }
예제 #3
0
        protected override async Task Handle(MonsterDeathEvent e, CancellationToken cancellation)
        {
            if (!(e.Sender is IMonsterEntity monster))
            {
                return;
            }

            // Clear Buff/Debuff
            // Set respawn
            if (e.Killer is IPlayerEntity player)
            {
                NpcMonsterDto npcMonster = monster.NpcMonster;
                float ExpPenality(int lvlDif) => lvlDif < 5 ? 1 : (lvlDif < 10 ? 0.9f - 0.2f * (lvlDif - 6) : lvlDif < 19 ? 0.1f : 0.05f) * (2 / 3f);

                long xp     = (long)(npcMonster.Xp * ExpPenality(player.Level - npcMonster.Level));
                long jobXp  = (long)(npcMonster.JobXp * ExpPenality(player.JobLevel - npcMonster.Level));
                long heroXp = (long)(npcMonster.HeroXp * ExpPenality(player.Level - npcMonster.Level));
                await player.EmitEventAsync(new ExperienceGainEvent { Experience = xp, JobExperience = jobXp, HeroExperience = heroXp });
            }

            if (Random.Next(100) < 100) // 100 should be modified with GoldDropRate
            {
                Position <short>[] pos  = PathFinder.GetNeighbors(monster.Position, monster.CurrentMap.Map);
                IDropEntity        drop = new ItemDropEntity(monster.CurrentMap.GetNextId())
                {
                    ItemVnum       = 1046,
                    IsGold         = true,
                    DroppedTimeUtc = DateTime.Now,
                    Position       = pos.Length > 1 ? pos[Random.Next(pos.Length)] : monster.Position,
                    Quantity       = Random.Next(6 * monster.NpcMonster.Level, 12 * monster.NpcMonster.Level)
                };
                drop.TransferEntity(monster.CurrentMap);
                await monster.CurrentMap.BroadcastAsync(drop.GenerateDropPacket());
            }
        }
예제 #4
0
        private void GetCard(string[] currentLine, NpcMonsterDto monster)
        {
            for (int i = 0; i < 4; i++)
            {
                byte type = (byte)int.Parse(currentLine[5 * i + 2]);
                if (type == 0 || type == 255)
                {
                    continue;
                }

                int first       = int.Parse(currentLine[5 * i + 3]);
                var monsterCard = new BCardDto
                {
                    RelationType   = BCardRelationType.NpcMonster,
                    RelationId     = monster.Id,
                    Type           = (BCardType)type,
                    SubType        = (byte)(int.Parse(currentLine[5 * i + 5]) + 1 * 10 + 1 + (first > 0 ? 0 : 1)),
                    IsLevelScaled  = Convert.ToBoolean(first % 4),
                    IsLevelDivided = (first % 4) == 2,
                    FirstData      = (short)((first > 0 ? first : -first) / 4),
                    SecondData     = (short)(int.Parse(currentLine[5 * i + 4]) / 4),
                    ThirdData      = (short)(int.Parse(currentLine[5 * i + 6]) / 4)
                };
                _monsterBcards.Add(monsterCard);
                _monsterBCardsCount++;
            }
        }
예제 #5
0
파일: MapNpc.cs 프로젝트: Price-H16/NosCore
        public void Initialize(NpcMonsterDto npcMonster, ShopDto?shopDto, NpcTalkDto?npcTalkDto, List <ShopItemDto> shopItemsDto)
        {
            NpcMonster = npcMonster;
            Mp         = NpcMonster?.MaxMp ?? 0;
            Hp         = NpcMonster?.MaxHp ?? 0;
            Speed      = NpcMonster?.Speed ?? 0;
            PositionX  = MapX;
            PositionY  = MapY;
            IsAlive    = true;

            Task RequestExecAsync(RequestData request)
            {
                return(ShowDialogAsync(request));
            }

            Requests?.Select(RequestExecAsync).Subscribe();
            var shopObj = shopDto;

            if (shopObj == null)
            {
                return;
            }

            var shopItemsList = new ConcurrentDictionary <int, ShopItem>();

            Parallel.ForEach(shopItemsDto, shopItemGrouping =>
            {
                var shopItem          = shopItemGrouping.Adapt <ShopItem>();
                shopItem.ItemInstance = _itemProvider !.Create(shopItemGrouping.ItemVNum, -1);
                shopItemsList[shopItemGrouping.ShopItemId] = shopItem;
            });
예제 #6
0
 public static EInfoPacket GenerateEInfoPacket(this NpcMonsterDto monster)
 {
     return(new EInfoPacket
     {
         Unknown1 = 10,
         MonsterVnum = monster.Id,
         Level = monster.Level,
         Element = monster.Element,
         AttackClass = monster.AttackClass,
         ElementRate = monster.ElementRate,
         AttackUpgrade = monster.AttackUpgrade,
         DamageMinimum = monster.DamageMinimum,
         DamageMaximum = monster.DamageMaximum,
         Concentrate = monster.Concentrate,
         CriticalChance = monster.CriticalChance,
         CriticalRate = monster.CriticalRate,
         DefenceUpgrade = monster.DefenceUpgrade,
         CloseDefence = monster.CloseDefence,
         DefenceDodge = monster.DefenceDodge,
         DistanceDefence = monster.DistanceDefence,
         DistanceDefenceDodge = monster.DistanceDefenceDodge,
         MagicDefence = monster.MagicDefence,
         FireResistance = monster.FireResistance,
         WaterResistance = monster.WaterResistance,
         LightResistance = monster.LightResistance,
         DarkResistance = monster.DarkResistance,
         MaxHp = monster.MaxHp,
         MaxMp = monster.MaxMp,
         Unknown2 = -1,
         Name = monster.Name.Replace(" ", "^")
     });
 }
예제 #7
0
 private void GetArmor(string[] currentLine, NpcMonsterDto monster)
 {
     monster.CloseDefence         = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 2 + 18);
     monster.DistanceDefence      = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 3 + 17);
     monster.MagicDefence         = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 2 + 13);
     monster.DefenceDodge         = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 5 + 31);
     monster.DistanceDefenceDodge = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 5 + 31);
 }
예제 #8
0
 internal void Initialize(NpcMonsterDto npcMonster)
 {
     NpcMonster = npcMonster;
     Mp         = NpcMonster.MaxMp;
     Hp         = NpcMonster.MaxHp;
     Speed      = NpcMonster.Speed;
     IsAlive    = true;
 }
예제 #9
0
 private void GetPreAtt(IReadOnlyList <string> currentLine, NpcMonsterDto monster)
 {
     monster.IsHostile      = currentLine[2] == "1";
     monster.IsHostileGroup = currentLine[3] != "0";
     monster.NoticeRange    = Convert.ToByte(currentLine[4]);
     monster.Speed          = Convert.ToByte(currentLine[5]);
     monster.RespawnTime    = Convert.ToInt32(currentLine[6]);
 }
예제 #10
0
 private void GetElementsAndResistance(string[] currentLine, NpcMonsterDto monster)
 {
     monster.Element         = Enum.Parse <ElementType>(currentLine[2]);
     monster.ElementRate     = Convert.ToInt16(currentLine[3]);
     monster.FireResistance  = Convert.ToSByte(currentLine[4]);
     monster.WaterResistance = Convert.ToSByte(currentLine[5]);
     monster.LightResistance = Convert.ToSByte(currentLine[6]);
     monster.DarkResistance  = Convert.ToSByte(currentLine[7]);
 }
예제 #11
0
        private static void GetSetting(IReadOnlyList <string> currentLine, NpcMonsterDto monster)
        {
            if (currentLine[4] == "0")
            {
                return;
            }

            monster.VNumRequired   = Convert.ToInt16(currentLine[4]);
            monster.AmountRequired = 1;
        }
예제 #12
0
        private static void GetPetInfo(IReadOnlyList <string> currentLine, NpcMonsterDto monster, long unknownData)
        {
            if (monster.VNumRequired != 0 || unknownData != -2147481593 && unknownData != -2147481599 && unknownData != -1610610681)
            {
                return;
            }

            monster.VNumRequired   = Convert.ToInt16(currentLine[2]);
            monster.AmountRequired = Convert.ToByte(currentLine[3]);
        }
예제 #13
0
 internal void Initialize(NpcMonsterDto npcMonster)
 {
     NpcMonster = npcMonster;
     Mp         = NpcMonster.MaxMp;
     Hp         = NpcMonster.MaxHp;
     PositionX  = MapX;
     PositionY  = MapY;
     Speed      = NpcMonster.Speed;
     IsAlive    = true;
 }
예제 #14
0
 public void Initialize(NpcMonsterDto npcMonster)
 {
     NpcMonster = npcMonster;
     Mp         = NpcMonster?.MaxMp ?? 0;
     Hp         = NpcMonster?.MaxHp ?? 0;
     Speed      = NpcMonster?.Speed ?? 0;
     PositionX  = MapX;
     PositionY  = MapY;
     IsAlive    = true;
 }
예제 #15
0
 internal void Initialize(NpcMonsterDto npcMonster)
 {
     NpcMonster = npcMonster;
     Mp         = NpcMonster.MaxMp;
     Hp         = NpcMonster.MaxHp;
     PositionX  = MapX;
     PositionY  = MapY;
     Speed      = NpcMonster.Speed;
     IsAlive    = true;
     Requests.Subscribe(ShowDialog);
 }
예제 #16
0
        public Task SendInfoFromMonster(IPlayerEntity player, ReqInfoEvent e)
        {
            NpcMonsterDto target = _npcMonsterService.GetById(e.TargetId);

            if (target == null)
            {
                return(Task.CompletedTask);
            }

            //todo: use i18n to send the right npc name!
            return(player?.SendPacketAsync(target.GenerateEInfoPacket()));
        }
예제 #17
0
        private void GetExp(string[] currentLine, NpcMonsterDto monster)
        {
            monster.Xp     = _monsterAlgorithm.GetXp(NpcMonsterRaceType.Race0UnknownYet, monster.Level, true) + Math.Abs(Convert.ToInt32(currentLine[2]));
            monster.JobXp  = _monsterAlgorithm.GetXp(NpcMonsterRaceType.Race0UnknownYet, monster.Level, true) + Convert.ToInt32(currentLine[3]);
            monster.HeroXp = _monsterAlgorithm.GetHeroXp(NpcMonsterRaceType.Race0UnknownYet, monster.Level, true); // basicHxp


            /*
             * percent damage monsters
             */
            monster.IsPercent   = true;
            monster.TakeDamages = 0;
        }
예제 #18
0
        public void Fill(string filePath)
        {
            _npcMonsterService = ChickenContainer.Instance.Resolve <INpcMonsterService>();
            string tmp = File.ReadAllText(filePath, Encoding.GetEncoding(1252));

            string[] lines = tmp.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);

            foreach (string line in lines.Where(s => s.StartsWith("e_info 10")))
            {
                string[] currentPacket = line.Split(new[] { ' ', '\t' }, StringSplitOptions.None);

                if (currentPacket.Length <= 25)
                {
                    continue;
                }

                NpcMonsterDto npcMonster = _npcMonsterService.GetById(short.Parse(currentPacket[2]));
                if (npcMonster == null)
                {
                    continue;
                }

                npcMonster.AttackClass          = byte.Parse(currentPacket[5]);
                npcMonster.AttackUpgrade        = byte.Parse(currentPacket[7]);
                npcMonster.DamageMinimum        = short.Parse(currentPacket[8]);
                npcMonster.DamageMaximum        = short.Parse(currentPacket[9]);
                npcMonster.Concentrate          = short.Parse(currentPacket[10]);
                npcMonster.CriticalChance       = byte.Parse(currentPacket[11]);
                npcMonster.CriticalRate         = short.Parse(currentPacket[12]);
                npcMonster.DefenceUpgrade       = byte.Parse(currentPacket[13]);
                npcMonster.CloseDefence         = short.Parse(currentPacket[14]);
                npcMonster.DefenceDodge         = short.Parse(currentPacket[15]);
                npcMonster.DistanceDefence      = short.Parse(currentPacket[16]);
                npcMonster.DistanceDefenceDodge = short.Parse(currentPacket[17]);
                npcMonster.MagicDefence         = short.Parse(currentPacket[18]);
                npcMonster.FireResistance       = sbyte.Parse(currentPacket[19]);
                npcMonster.WaterResistance      = sbyte.Parse(currentPacket[20]);
                npcMonster.LightResistance      = sbyte.Parse(currentPacket[21]);
                npcMonster.DarkResistance       = sbyte.Parse(currentPacket[22]);
                if (_npcMonsters.Any(s => s.Id == npcMonster.Id))
                {
                    continue;
                }

                _npcMonsters.Add(npcMonster);
            }

            _npcMonsterService.Save(_npcMonsters);
        }
예제 #19
0
        protected override async Task Handle(AddPetEvent e, CancellationToken cancellation)
        {
            if (!(e.Sender is IPlayerEntity player))
            {
                return;
            }

            NpcMonsterDto heldMonster = _npcMonsterService.GetById(e.MonsterVnum);

            if (heldMonster == null)
            {
                return;
            }

            var mate = new CharacterMateDto
            {
                NpcMonsterId = (short)e.MonsterVnum,
                CanPickUp    = false,
                CharacterId  = player.Id,
                Attack       = 0,
                Defence      = 0,
                Direction    = 0,
                Experience   = 0,
                Hp           = heldMonster.MaxHp,
                Level        = 1,
                IsSummonable = false,
                IsTeamMember = true,
                Loyalty      = 1000,
                MapX         = player.Position.X,
                MapY         = player.Position.Y,
                Mp           = heldMonster.MaxMp,
                Name         = heldMonster.Name,
                Skin         = 0,
                Agility      = 0,
                MateType     = e.MateType
            };

            IMateEntity mateEn = await _entityFactory.CreateNewMateEntityAsync(player, mate);

            await player.AddPet(mateEn);

            await player.SendPacketAsync(player.GenerateInfoBubble("PET_LEAVE_BEAD"));
        }
예제 #20
0
        private static long GetEtc(IReadOnlyList <string> currentLine, NpcMonsterDto monster)
        {
            int monsterEtcVal = Convert.ToInt32(currentLine[2]);

            monster.CantWalk       = Convert.ToBoolean(monsterEtcVal & 0x1);
            monster.CanCollect     = Convert.ToBoolean(monsterEtcVal & 0x2);
            monster.CantDebuff     = Convert.ToBoolean(monsterEtcVal & 0x4);
            monster.CanCatch       = Convert.ToBoolean(monsterEtcVal & 0x8);
            monster.CanRegenMp     = Convert.ToBoolean(monsterEtcVal & 0x400);
            monster.CantVoke       = Convert.ToBoolean(monsterEtcVal & 0x800);
            monster.CantTargetInfo = Convert.ToBoolean(monsterEtcVal & 0x80000000);

            long unknownData = Convert.ToInt64(currentLine[2]);

            switch (unknownData)
            {
            case -2147481593:
                monster.MonsterType = MonsterType.Special;
                break;

            case -2147483616:
            case -2147483647:
            case -2147483646:
                if (monster.Race == 8 && monster.RaceType == 0)
                {
                    monster.NoAggresiveIcon = true;
                }
                else
                {
                    monster.NoAggresiveIcon = false;
                }

                break;
            }

            if (monster.Id >= 588 && monster.Id <= 607)
            {
                monster.MonsterType = MonsterType.Elite;
            }

            return(unknownData);
        }
예제 #21
0
        private void GetWeapon(string[] currentLine, NpcMonsterDto monster)
        {
            switch (currentLine[3])
            {
            case "1":
                monster.DamageMinimum = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 4 + 32 + Convert.ToInt16(currentLine[4]) +
                                                        Math.Round(Convert.ToDecimal((monster.Level - 1) / 5)));
                monster.DamageMaximum = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 6 + 40 + Convert.ToInt16(currentLine[5]) -
                                                        Math.Round(Convert.ToDecimal((monster.Level - 1) / 5)));
                monster.Concentrate    = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 5 + 27 + Convert.ToInt16(currentLine[6]));
                monster.CriticalChance = Convert.ToByte(4 + Convert.ToInt16(currentLine[7]));
                monster.CriticalRate   = Convert.ToInt16(70 + Convert.ToInt16(currentLine[8]));
                break;

            case "2":
                monster.DamageMinimum = Convert.ToInt16(Convert.ToInt16(currentLine[2]) * 6.5f + 23 + Convert.ToInt16(currentLine[4]));
                monster.DamageMaximum = Convert.ToInt16((Convert.ToInt16(currentLine[2]) - 1) * 8 + 38 + Convert.ToInt16(currentLine[5]));
                monster.Concentrate   = Convert.ToInt16(70 + Convert.ToInt16(currentLine[6]));
                break;
            }
        }
예제 #22
0
        private static InPacket GenerateInMonster(IMonsterEntity monster)
        {
            NpcMonsterDto npcMonster = monster.NpcMonster;

            return(new InPacket
            {
                VisualType = VisualType.Monster,
                Name = npcMonster.Id.ToString(),
                TransportId = monster.MapMonster.Id.ToString(),
                PositionX = monster.Position.X,
                PositionY = monster.Position.Y,
                DirectionType = monster.DirectionType,
                InMonsterSubPacket = new InMonsterSubPacket
                {
                    HpPercentage = monster.HpPercentage,
                    MpPercentage = monster.MpPercentage,
                    Unknown1 = 0,
                    Unknown2 = 0,
                    Unknown3 = 0,
                    Unknown4 = -1,
                    NoAggressiveIcon = npcMonster.NoAggresiveIcon,
                    Unknown5 = 0,
                    Unknown6 = -1,
                    Unknown7 = "-",
                    Unknown8 = 0,
                    Unknown9 = -1,
                    Unknown10 = 0,
                    Unknown11 = 0,
                    Unknown12 = 0,
                    Unknown13 = 0,
                    Unknown14 = 0,
                    Unknown15 = 0,
                    Unknown16 = 0,
                    Unknown17 = 0
                }
            });
        }
예제 #23
0
        private void GetItem(string[] currentLine, NpcMonsterDto monster, ref bool itemAreaBegin)
        {
            for (int i = 2; i < currentLine.Length - 3; i += 3)
            {
                short vnum = Convert.ToInt16(currentLine[i]);
                if (vnum == -1)
                {
                    break;
                }

                _monsterDrops.Add(new DropDto
                {
                    ItemId       = vnum,
                    Amount       = Convert.ToInt32(currentLine[i + 2]),
                    RelationType = DropType.NpcMonster,
                    TypedId      = monster.Id,
                    DropChance   = Convert.ToInt32(currentLine[i + 1])
                });
                _monsterDropsCount++;
            }

            _monsters.Add(monster);
            itemAreaBegin = false;
        }
예제 #24
0
 private void GetHpMp(string[] currentLine, NpcMonsterDto monster)
 {
     monster.MaxHp = _monsterAlgorithm.GetHpMax(NpcMonsterRaceType.Race0UnknownYet, monster.Level, true) + Convert.ToInt32(currentLine[2]);
     monster.MaxMp = _monsterAlgorithm.GetMpMax(NpcMonsterRaceType.Race0UnknownYet, monster.Level, true) + Convert.ToInt32(currentLine[3]);
 }
예제 #25
0
        public async Task <IMateEntity> CreateNewMateEntityAsync(IPlayerEntity owner, CharacterMateDto dto)
        {
            NpcMonsterDto npcMonster = await _npcMonsterService.GetByIdAsync(dto.NpcMonsterId);

            return(new MateEntity(owner, dto, npcMonster));
        }
예제 #26
0
 private static void GetRace(IReadOnlyList <string> currentLine, NpcMonsterDto monster)
 {
     monster.Race     = Convert.ToByte(currentLine[2]);
     monster.RaceType = Convert.ToByte(currentLine[3]);
 }
예제 #27
0
        internal void InsertNpcMonsters(string folder)
        {
            var basicHp          = new int[100];
            var basicPrimaryMp   = new int[100];
            var basicSecondaryMp = new int[100];
            var basicXp          = new int[100];
            var basicJXp         = new int[100];

            // basicHPLoad
            var baseHp  = 138;
            var hPbasup = 18;

            for (var i = 0; i < 100; i++)
            {
                basicHp[i] = baseHp;
                hPbasup++;
                baseHp += hPbasup;

                if (i == 37)
                {
                    baseHp  = 1765;
                    hPbasup = 65;
                }

                if (i < 41)
                {
                    continue;
                }

                if ((99 - i) % 8 == 0)
                {
                    hPbasup++;
                }
            }

            //Race == 0
            basicPrimaryMp[0] = 10;
            basicPrimaryMp[1] = 10;
            basicPrimaryMp[2] = 15;

            var  primaryBasup = 5;
            byte count        = 0;
            var  isStable     = true;
            var  isDouble     = false;

            for (uint i = 3; i < 100; i++)
            {
                if (i % 10 == 1)
                {
                    basicPrimaryMp[i] += basicPrimaryMp[i - 1] + (primaryBasup * 2);
                    continue;
                }

                if (!isStable)
                {
                    primaryBasup++;
                    count++;

                    if (count == 2)
                    {
                        if (isDouble)
                        {
                            isDouble = false;
                        }
                        else
                        {
                            isStable = true;
                            isDouble = true;
                            count    = 0;
                        }
                    }

                    if (count == 4)
                    {
                        isStable = true;
                        count    = 0;
                    }
                }
                else
                {
                    count++;
                    if (count == 2)
                    {
                        isStable = false;
                        count    = 0;
                    }
                }

                basicPrimaryMp[i] = basicPrimaryMp[i - (i % 10 == 2 ? 2 : 1)] + primaryBasup;
            }

            // Race == 2
            basicSecondaryMp[0] = 60;
            basicSecondaryMp[1] = 60;
            basicSecondaryMp[2] = 78;

            var secondaryBasup = 18;
            var boostup        = false;

            for (uint i = 3; i < 100; i++)
            {
                if (i % 10 == 1)
                {
                    basicSecondaryMp[i] += basicSecondaryMp[i - 1] + (int)i + 10;
                    continue;
                }

                if (boostup)
                {
                    secondaryBasup += 3;
                    boostup         = false;
                }
                else
                {
                    secondaryBasup++;
                    boostup = true;
                }

                basicSecondaryMp[i] = basicSecondaryMp[i - (i % 10 == 2 ? 2 : 1)] + secondaryBasup;
            }

            // basicXPLoad
            for (var i = 0; i < 100; i++)
            {
                basicXp[i] = i * 180;
            }

            // basicJXpLoad
            for (var i = 0; i < 100; i++)
            {
                basicJXp[i] = 360;
            }

            var npcs = new List <NpcMonsterDto>();

            // Store like this: (vnum, (name, level))
            var  npc           = new NpcMonsterDto();
            var  drops         = new List <DropDto>();
            var  monstercards  = new List <BCardDto>();
            var  skills        = new List <NpcMonsterSkillDto>();
            var  itemAreaBegin = false;
            var  counter       = 0;
            long unknownData   = 0;

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

                    if (currentLine.Length > 2 && currentLine[1] == "VNUM")
                    {
                        npc = new NpcMonsterDto
                        {
                            NpcMonsterVNum = Convert.ToInt16(currentLine[2])
                        };
                        itemAreaBegin = true;
                        unknownData   = 0;
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "NAME")
                    {
                        npc.Name = currentLine[2];
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "LEVEL")
                    {
                        if (!itemAreaBegin)
                        {
                            continue;
                        }

                        npc.Level = Convert.ToByte(currentLine[2]);
                    }
                    else if (currentLine.Length > 3 && currentLine[1] == "RACE")
                    {
                        npc.Race     = Convert.ToByte(currentLine[2]);
                        npc.RaceType = Convert.ToByte(currentLine[3]);
                    }
                    else if (currentLine.Length > 7 && currentLine[1] == "ATTRIB")
                    {
                        npc.Element         = Convert.ToByte(currentLine[2]);
                        npc.ElementRate     = Convert.ToInt16(currentLine[3]);
                        npc.FireResistance  = Convert.ToSByte(currentLine[4]);
                        npc.WaterResistance = Convert.ToSByte(currentLine[5]);
                        npc.LightResistance = Convert.ToSByte(currentLine[6]);
                        npc.DarkResistance  = Convert.ToSByte(currentLine[7]);
                    }
                    else if (currentLine.Length > 3 && currentLine[1] == "HP/MP")
                    {
                        npc.MaxHp = Convert.ToInt32(currentLine[2]) + basicHp[npc.Level];
                        npc.MaxMp = Convert.ToInt32(currentLine[3]) + npc.Race == 0 ? basicPrimaryMp[npc.Level]
                            : basicSecondaryMp[npc.Level];
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "EXP")
                    {
                        npc.Xp    = Math.Abs(Convert.ToInt32(currentLine[2]) + basicXp[npc.Level]);
                        npc.JobXp = Convert.ToInt32(currentLine[3]) + basicJXp[npc.Level];

                        //TODO find HeroXP algorithm
                        switch (npc.NpcMonsterVNum)
                        {
                        case 2510:
                        case 2501:
                            npc.HeroXp = 881;
                            break;

                        case 2512:
                        case 2502:
                            npc.HeroXp = 884;
                            break;

                        case 2503:
                            npc.HeroXp = 1013;
                            break;

                        case 2505:
                            npc.HeroXp = 871;
                            break;

                        case 2506:
                            npc.HeroXp = 765;
                            break;

                        case 2507:
                            npc.HeroXp = 803;
                            break;

                        case 2508:
                            npc.HeroXp = 825;
                            break;

                        case 2500:
                        case 2509:
                        case 2511:
                            npc.HeroXp = 879;
                            break;

                        case 2513:
                            npc.HeroXp = 1075;
                            break;

                        case 2515:
                            npc.HeroXp = 3803;
                            break;

                        case 2516:
                            npc.HeroXp = 836;
                            break;

                        case 2517:
                            npc.HeroXp = 450;
                            break;

                        case 2518:
                            npc.HeroXp = 911;
                            break;

                        case 2519:
                            npc.HeroXp = 845;
                            break;

                        case 2520:
                            npc.HeroXp = 3682;
                            break;

                        case 2521:
                            npc.HeroXp = 401;
                            break;

                        case 2522:
                            npc.HeroXp = 471;
                            break;

                        case 2523:
                            npc.HeroXp = 328;
                            break;

                        case 2524:
                            npc.HeroXp = 12718;
                            break;

                        case 2525:
                            npc.HeroXp = 412;
                            break;

                        case 2526:
                            npc.HeroXp = 11157;
                            break;

                        case 2527:
                            npc.HeroXp = 18057;
                            break;

                        case 2530:
                            npc.HeroXp = 28756;
                            break;

                        case 2559:
                            npc.HeroXp = 1308;
                            break;

                        case 2560:
                            npc.HeroXp = 1234;
                            break;

                        case 2561:
                            npc.HeroXp = 1168;
                            break;

                        case 2562:
                            npc.HeroXp = 959;
                            break;

                        case 2563:
                            npc.HeroXp = 947;
                            break;

                        case 2564:
                            npc.HeroXp = 952;
                            break;

                        case 2566:
                            npc.HeroXp = 1097;
                            break;

                        case 2567:
                            npc.HeroXp = 1096;
                            break;

                        case 2568:
                            npc.HeroXp = 4340;
                            break;

                        case 2569:
                            npc.HeroXp = 3534;
                            break;

                        case 2570:
                            npc.HeroXp = 4343;
                            break;

                        case 2571:
                            npc.HeroXp = 2205;
                            break;

                        case 2572:
                            npc.HeroXp = 5632;
                            break;

                        case 2573:
                            npc.HeroXp = 3756;
                            break;

                        default:
                            npc.HeroXp = 0;
                            break;
                        }
                    }
                    else if (currentLine.Length > 6 && currentLine[1] == "PREATT")
                    {
                        npc.IsHostile   = currentLine[2] != "0";
                        npc.NoticeRange = Convert.ToByte(currentLine[4]);
                        npc.Speed       = Convert.ToByte(currentLine[5]);
                        npc.RespawnTime = Convert.ToInt32(currentLine[6]);
                    }
                    else if (currentLine.Length > 6 && currentLine[1] == "WEAPON")
                    {
                        switch (currentLine[3])
                        {
                        case "1":
                            npc.DamageMinimum = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 4) + 32
                                                                + Convert.ToInt16(currentLine[4])
                                                                + Math.Round(Convert.ToDecimal((npc.Level - 1) / 5)));
                            npc.DamageMaximum = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 6) + 40
                                                                + Convert.ToInt16(currentLine[5])
                                                                - Math.Round(Convert.ToDecimal((npc.Level - 1) / 5)));
                            npc.Concentrate = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 5) + 27
                                                              + Convert.ToInt16(currentLine[6]));
                            npc.CriticalChance = Convert.ToByte(4 + Convert.ToInt16(currentLine[7]));
                            npc.CriticalRate   = Convert.ToInt16(70 + Convert.ToInt16(currentLine[8]));
                            break;

                        case "2":
                            npc.DamageMinimum = Convert.ToInt16((Convert.ToInt16(currentLine[2]) * 6.5f) + 23
                                                                + Convert.ToInt16(currentLine[4]));
                            npc.DamageMaximum = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 8) + 38
                                                                + Convert.ToInt16(currentLine[5]));
                            npc.Concentrate = Convert.ToInt16(70 + Convert.ToInt16(currentLine[6]));
                            break;

                        default:
                            continue;
                        }
                    }
                    else if (currentLine.Length > 6 && currentLine[1] == "ARMOR")
                    {
                        npc.CloseDefence         = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 2) + 18);
                        npc.DistanceDefence      = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 3) + 17);
                        npc.MagicDefence         = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 2) + 13);
                        npc.DefenceDodge         = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 5) + 31);
                        npc.DistanceDefenceDodge = Convert.ToInt16(((Convert.ToInt16(currentLine[2]) - 1) * 5) + 31);
                    }
                    else if (currentLine.Length > 7 && currentLine[1] == "ETC")
                    {
                        if (npc.NpcMonsterVNum >= 588 && npc.NpcMonsterVNum <= 607)
                        {
                            npc.MonsterType = MonsterType.Elite;
                        }

                        unknownData = Convert.ToInt64(currentLine[2]);
                        switch (unknownData)
                        {
                        case -2147481593:
                            npc.MonsterType = MonsterType.Special;
                            break;

                        case -2147483616:
                        case -2147483647:
                        case -2147483646:
                            npc.NoAggresiveIcon = (npc.Race == 8 && npc.RaceType == 0);
                            break;

                        default:
                            continue;
                        }
                    }
                    else if (currentLine.Length > 6 && currentLine[1] == "SETTING")
                    {
                        if (currentLine[4] == "0")
                        {
                            continue;
                        }

                        npc.VNumRequired   = Convert.ToInt16(currentLine[4]);
                        npc.AmountRequired = 1;
                    }
                    else if (currentLine.Length > 4 && currentLine[1] == "PETINFO")
                    {
                        if (npc.VNumRequired != 0 || (unknownData != -2147481593 && unknownData != -2147481599 &&
                                                      unknownData != -1610610681))
                        {
                            continue;
                        }

                        npc.VNumRequired   = Convert.ToInt16(currentLine[2]);
                        npc.AmountRequired = Convert.ToByte(currentLine[3]);
                    }
                    else if (currentLine.Length > 2 && currentLine[1] == "EFF")
                    {
                        npc.BasicSkill = Convert.ToInt16(currentLine[2]);
                    }
                    else if (currentLine.Length > 8 && currentLine[1] == "ZSKILL")
                    {
                        npc.AttackClass   = Convert.ToByte(currentLine[2]);
                        npc.BasicRange    = Convert.ToByte(currentLine[3]);
                        npc.BasicArea     = Convert.ToByte(currentLine[5]);
                        npc.BasicCooldown = Convert.ToInt16(currentLine[6]);
                    }
                    else if (currentLine.Length > 4 && currentLine[1] == "WINFO")
                    {
                        npc.AttackUpgrade = Convert.ToByte(unknownData == 1 ? currentLine[2] : currentLine[4]);
                    }
                    else if (currentLine.Length > 3 && currentLine[1] == "AINFO")
                    {
                        npc.DefenceUpgrade = Convert.ToByte(unknownData == 1 ? currentLine[2] : currentLine[3]);
                    }
                    else if (currentLine.Length > 1 && currentLine[1] == "SKILL")
                    {
                        for (var i = 2; i < currentLine.Length - 3; i += 3)
                        {
                            var vnum = short.Parse(currentLine[i]);
                            if (vnum == -1 || vnum == 0)
                            {
                                break;
                            }

                            if (_skillDao.FirstOrDefault(s => s.SkillVNum.Equals(vnum)) ==
                                null ||
                                _npcMonsterSkillDao
                                .Where(s => s.NpcMonsterVNum.Equals(npc.NpcMonsterVNum))
                                .Count(s => s.SkillVNum == vnum) != 0)
                            {
                                continue;
                            }

                            skills.Add(new NpcMonsterSkillDto
                            {
                                SkillVNum      = vnum,
                                Rate           = Convert.ToInt16(currentLine[i + 1]),
                                NpcMonsterVNum = npc.NpcMonsterVNum
                            });
                        }
                    }
                    else if (currentLine.Length > 1 && currentLine[1] == "CARD")
                    {
                        for (var i = 0; i < 4; i++)
                        {
                            var type = (byte)int.Parse(currentLine[(5 * i) + 2]);
                            if (type == 0 || type == 255)
                            {
                                continue;
                            }

                            var first    = int.Parse(currentLine[(5 * i) + 3]);
                            var itemCard = new BCardDto
                            {
                                NpcMonsterVNum = npc.NpcMonsterVNum,
                                Type           = type,
                                SubType        = (byte)(int.Parse(currentLine[(5 * i) + 5]) + (1 * 10) + 1
                                                        + (first > 0 ? 0 : 1)),
                                IsLevelScaled  = Convert.ToBoolean(first % 4),
                                IsLevelDivided = (uint)(first > 0 ? first : -first) % 4 == 2,
                                FirstData      = (short)((first > 0 ? first : -first) / 4),
                                SecondData     = (short)(int.Parse(currentLine[(5 * i) + 4]) / 4),
                                ThirdData      = (short)(int.Parse(currentLine[(5 * i) + 6]) / 4)
                            };
                            monstercards.Add(itemCard);
                        }
                    }
                    else if (currentLine.Length > 1 && currentLine[1] == "BASIC")
                    {
                        for (var i = 0; i < 4; i++)
                        {
                            var type = (byte)int.Parse(currentLine[(5 * i) + 2]);
                            if (type == 0)
                            {
                                continue;
                            }

                            var first    = int.Parse(currentLine[(5 * i) + 5]);
                            var itemCard = new BCardDto
                            {
                                NpcMonsterVNum = npc.NpcMonsterVNum,
                                Type           = type,
                                SubType        =
                                    (byte)(((int.Parse(currentLine[(5 * i) + 6]) + 1) * 10) + 1 + (first > 0 ? 0 : 1)),
                                FirstData      = (short)((first > 0 ? first : -first) / 4),
                                SecondData     = (short)(int.Parse(currentLine[(5 * i) + 4]) / 4),
                                ThirdData      = (short)(int.Parse(currentLine[(5 * i) + 3]) / 4),
                                CastType       = 1,
                                IsLevelScaled  = false,
                                IsLevelDivided = false
                            };
                            monstercards.Add(itemCard);
                        }
                    }
                    else if (currentLine.Length > 3 && currentLine[1] == "ITEM")
                    {
                        if (_npcMonsterDao
                            .FirstOrDefault(s => s.NpcMonsterVNum.Equals(npc.NpcMonsterVNum))
                            == null)
                        {
                            npcs.Add(npc);
                            counter++;
                        }

                        for (var i = 2; i < currentLine.Length - 3; i += 3)
                        {
                            var vnum = Convert.ToInt16(currentLine[i]);
                            if (vnum == -1)
                            {
                                break;
                            }

                            if (_dropDao.Where(s => s.MonsterVNum == npc.NpcMonsterVNum)
                                .Count(s => s.VNum == vnum) != 0)
                            {
                                continue;
                            }

                            drops.Add(new DropDto
                            {
                                VNum        = vnum,
                                Amount      = Convert.ToInt32(currentLine[i + 2]),
                                MonsterVNum = npc.NpcMonsterVNum,
                                DropChance  = Convert.ToInt32(currentLine[i + 1])
                            });
                        }

                        itemAreaBegin = false;
                    }
                }

                IEnumerable <NpcMonsterDto>      npcMonsterDtos      = npcs;
                IEnumerable <NpcMonsterSkillDto> npcMonsterSkillDtos = skills;
                IEnumerable <BCardDto>           monsterBCardDtos    = monstercards;

                _npcMonsterDao.InsertOrUpdate(npcMonsterDtos);
                _npcMonsterSkillDao.InsertOrUpdate(npcMonsterSkillDtos);
                _bCardDao.InsertOrUpdate(monsterBCardDtos);
                _logger.Information(LogLanguage.Instance.GetMessageFromKey(LogLanguageKey.NPCMONSTERS_PARSED),
                                    counter);
            }

            IEnumerable <DropDto> dropDtos = drops;

            _dropDao.InsertOrUpdate(dropDtos);
        }
예제 #28
0
 private void GetLevel(IReadOnlyList <string> currentLine, NpcMonsterDto monster)
 {
     monster.Level = Convert.ToByte(currentLine[2]);
 }
예제 #29
0
 private void GetName(IReadOnlyList <string> currentLine, NpcMonsterDto monster)
 {
     monster.Name = currentLine[2];
 }
예제 #30
0
        private void ParseFile()
        {
            bool   itemAreaBegin = false;
            string path          = _inputDirectory + '/' + _file;
            string tmp           = File.ReadAllText(path, Encoding.GetEncoding(1252));

            string[] lines   = tmp.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
            var      monster = new NpcMonsterDto();


            foreach (string line in lines)
            {
                string[] currentLine = line.Split('\t');

                long unknownData = 0;
                if (currentLine.Length > 2 && currentLine[1] == "VNUM")
                {
                    monster       = new NpcMonsterDto();
                    itemAreaBegin = true;
                    GetVnum(currentLine, monster);
                }

                if (itemAreaBegin == false)
                {
                    continue;
                }

                if (currentLine.Length > 2 && currentLine[1] == "NAME")
                {
                    GetName(currentLine, monster);
                }
                else if (currentLine.Length > 2 && currentLine[1] == "LEVEL")
                {
                    GetLevel(currentLine, monster);
                }
                else if (currentLine.Length > 3 && currentLine[1] == "RACE")
                {
                    GetRace(currentLine, monster);
                }
                else if (currentLine.Length > 7 && currentLine[1] == "ATTRIB")
                {
                    GetElementsAndResistance(currentLine, monster);
                }
                else if (currentLine.Length > 3 && currentLine[1] == "HP/MP")
                {
                    GetHpMp(currentLine, monster);
                }
                else if (currentLine.Length > 2 && currentLine[1] == "EXP")
                {
                    GetExp(currentLine, monster);
                }

                else if (currentLine.Length > 6 && currentLine[1] == "PREATT")
                {
                    GetPreAtt(currentLine, monster);
                }
                else if (currentLine.Length > 6 && currentLine[1] == "WEAPON")
                {
                    GetWeapon(currentLine, monster);
                }
                else if (currentLine.Length > 6 && currentLine[1] == "ARMOR")
                {
                    GetArmor(currentLine, monster);
                }
                else if (currentLine.Length > 7 && currentLine[1] == "ETC")
                {
                    unknownData = GetEtc(currentLine, monster);
                }
                else if (currentLine.Length > 6 && currentLine[1] == "SETTING")
                {
                    GetSetting(currentLine, monster);
                }
                else if (currentLine.Length > 4 && currentLine[1] == "PETINFO")
                {
                    GetPetInfo(currentLine, monster, unknownData);
                }
                else if (currentLine.Length > 2 && currentLine[1] == "EFF")
                {
                    GetEff(currentLine, monster);
                }
                else if (currentLine.Length > 8 && currentLine[1] == "ZSKILL")
                {
                    GetZskill(currentLine, monster);
                }
                else if (currentLine.Length > 4 && currentLine[1] == "WINFO")
                {
                    GetWinfo(currentLine, monster, unknownData);
                }
                else if (currentLine.Length > 3 && currentLine[1] == "AINFO")
                {
                    GetAInfo(currentLine, monster, unknownData);
                }
                else if (currentLine.Length > 1 && currentLine[1] == "SKILL")
                {
                    GetSkill(currentLine, monster);
                }

                else if (currentLine.Length > 1 && currentLine[1] == "CARD")
                {
                    GetCard(currentLine, monster);
                }
                else if (currentLine.Length > 1 && currentLine[1] == "BASIC")
                {
                    GetBasic(currentLine, monster);
                }
                else if (currentLine.Length > 3 && currentLine[1] == "ITEM")
                {
                    GetItem(currentLine, monster, ref itemAreaBegin);
                }
            }
        }