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]); }
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 } }; }
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()); } }
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++; } }
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; });
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(" ", "^") }); }
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); }
internal void Initialize(NpcMonsterDto npcMonster) { NpcMonster = npcMonster; Mp = NpcMonster.MaxMp; Hp = NpcMonster.MaxHp; Speed = NpcMonster.Speed; IsAlive = true; }
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]); }
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]); }
private static void GetSetting(IReadOnlyList <string> currentLine, NpcMonsterDto monster) { if (currentLine[4] == "0") { return; } monster.VNumRequired = Convert.ToInt16(currentLine[4]); monster.AmountRequired = 1; }
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]); }
internal void Initialize(NpcMonsterDto npcMonster) { NpcMonster = npcMonster; Mp = NpcMonster.MaxMp; Hp = NpcMonster.MaxHp; PositionX = MapX; PositionY = MapY; Speed = NpcMonster.Speed; IsAlive = true; }
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; }
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); }
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())); }
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; }
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); }
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")); }
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); }
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; } }
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 } }); }
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; }
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]); }
public async Task <IMateEntity> CreateNewMateEntityAsync(IPlayerEntity owner, CharacterMateDto dto) { NpcMonsterDto npcMonster = await _npcMonsterService.GetByIdAsync(dto.NpcMonsterId); return(new MateEntity(owner, dto, npcMonster)); }
private static void GetRace(IReadOnlyList <string> currentLine, NpcMonsterDto monster) { monster.Race = Convert.ToByte(currentLine[2]); monster.RaceType = Convert.ToByte(currentLine[3]); }
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); }
private void GetLevel(IReadOnlyList <string> currentLine, NpcMonsterDto monster) { monster.Level = Convert.ToByte(currentLine[2]); }
private void GetName(IReadOnlyList <string> currentLine, NpcMonsterDto monster) { monster.Name = currentLine[2]; }
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); } } }