/// <summary> /// Handles skill training from enchanting. /// </summary> /// <param name="skill"></param> /// <param name="result"></param> private void Training(Skill skill, EnchantResult result) { // Novice and r8 have no relevant training if (skill.Info.Rank < SkillRank.RF || skill.Info.Rank > SkillRank.R1 || skill.Info.Rank == SkillRank.R8) { return; } switch (result) { case EnchantResult.Success: skill.Train(1); // Get a success. return; case EnchantResult.HugeSuccess: skill.Train(2); // Get a great success. goto case EnchantResult.Success; case EnchantResult.Fail: if (skill.Info.Rank <= SkillRank.R6) { skill.Train(3); // Get a failure. } return; case EnchantResult.HugeFail: if (skill.Info.Rank <= SkillRank.RE) { skill.Train(4); // Get a horrible result. } goto case EnchantResult.Fail; } }
/// <summary> /// Returns random durability loss for rank. Returns -1 if item should /// be destroyed. /// </summary> /// <remarks> /// Reference: http://wiki.mabinogiworld.com/view/Enchant#Enchanting /// </remarks> /// <param name="rnd"></param> /// <param name="enchantRank"></param> /// <returns></returns> private int GetDurabilityLoss(Random rnd, SkillRank enchantRank, EnchantResult result) { var points = 0; switch (enchantRank) { case SkillRank.Novice: return(0); case SkillRank.RF: points = (result == EnchantResult.Fail ? rnd.Next(0, 1) : rnd.Next(0, 2)); break; case SkillRank.RE: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RD: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RC: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 6)); break; case SkillRank.RB: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 7)); break; case SkillRank.RA: points = (result == EnchantResult.Fail ? rnd.Next(0, 4) : rnd.Next(0, 8)); break; case SkillRank.R9: points = (result == EnchantResult.Fail ? rnd.Next(1, 6) : rnd.Next(1, 10)); break; case SkillRank.R8: points = (result == EnchantResult.Fail ? rnd.Next(2, 7) : rnd.Next(2, 12)); break; case SkillRank.R7: points = (result == EnchantResult.Fail ? rnd.Next(2, 8) : rnd.Next(2, 14)); break; default: return(-1); } return(points * 1000); }
/// <summary> /// Returns random durability loss for rank. Returns -1 if item should /// be destroyed. /// </summary> /// <remarks> /// Reference: http://wiki.mabinogiworld.com/view/Enchant#Enchanting /// </remarks> /// <param name="rnd"></param> /// <param name="enchantRank"></param> /// <returns></returns> private int GetDurabilityLoss(Random rnd, SkillRank enchantRank, EnchantResult result) { var points = 0; // Destroy item if safe enchanting is disabled and rank is over 6. if (!ChannelServer.Instance.Conf.World.SafeEnchanting && enchantRank >= SkillRank.R6) { return(-1); } switch (enchantRank) { // A huge fail results in a bigger durability loss. case SkillRank.RF: points = (result == EnchantResult.Fail ? rnd.Next(0, 1) : rnd.Next(0, 2)); break; case SkillRank.RE: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RD: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RC: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 6)); break; case SkillRank.RB: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 7)); break; case SkillRank.RA: points = (result == EnchantResult.Fail ? rnd.Next(0, 4) : rnd.Next(0, 8)); break; case SkillRank.R9: points = (result == EnchantResult.Fail ? rnd.Next(1, 6) : rnd.Next(1, 10)); break; case SkillRank.R8: points = (result == EnchantResult.Fail ? rnd.Next(2, 7) : rnd.Next(2, 12)); break; case SkillRank.R7: points = (result == EnchantResult.Fail ? rnd.Next(2, 8) : rnd.Next(2, 14)); break; // Custom durability loss for R6+, for safe enchanting option. case SkillRank.R6: points = (result == EnchantResult.Fail ? rnd.Next(3, 9) : rnd.Next(3, 16)); break; case SkillRank.R5: points = (result == EnchantResult.Fail ? rnd.Next(3, 9) : rnd.Next(3, 16)); break; case SkillRank.R4: points = (result == EnchantResult.Fail ? rnd.Next(4, 10) : rnd.Next(4, 18)); break; case SkillRank.R3: points = (result == EnchantResult.Fail ? rnd.Next(4, 10) : rnd.Next(4, 18)); break; case SkillRank.R2: points = (result == EnchantResult.Fail ? rnd.Next(5, 11) : rnd.Next(5, 20)); break; case SkillRank.R1: points = (result == EnchantResult.Fail ? rnd.Next(5, 11) : rnd.Next(5, 20)); break; } return(points * 1000); }
public void ItemEnchantReq(GameSession session, ItemEnchantReqMessage message) { // Todo !! Enchant For Costumes - Only need to fill the xml containing effects and levels Player player = session.Player; if (player == null) { return; } if (player.PEN < 200) { session.SendAsync(new EnchantItemAckMessage(EnchantResult.NotEnoughMoney)); return; } PlayerItem item = player.Inventory[(ulong)message.ItemId]; // Checks if item not equal null and enchant lvl is less than 16 and is a weapon if (item == null || item.ItemNumber.Category != ItemCategory.Weapon || item.EnchantLvl >= 16) { session.SendAsync(new EnchantItemAckMessage(EnchantResult.ErrorItemEnchant)); } else { try { EnchantSys enchantSystems = GameServer.Instance.ResourceCache.GetEnchantSystem()[item.EnchantLvl]; uint num = (new uint[25] { 200, 200, 300, 300, 500, 500, 600, 600, 800, 800, 1100, 1100, 1300, 1500, 1800, 2300, 2900, 3500, 4200, 5200, 5200, 5200, 5200, 5200, 5200 })[item.EnchantLvl]; EnchantGroup[] array = enchantSystems.EnchantGroup.Where(delegate(EnchantGroup i) { return((i.Category == item.ItemNumber.Category) & (i.SubCategory == item.ItemNumber.SubCategory)); }).ToArray(); // Checks if player's pen is less than cost if (player.PEN < num) { session.SendAsync(new EnchantItemAckMessage(EnchantResult.NotEnoughMoney)); return; } EnchantSystem enchantSystem = array[0].Eff(); EnchantResult result = EnchantResult.Success; uint num2 = enchantSystem.Effect; List <EffectNumber> list = item.Effects.ToList(); if (list.Contains(num2 - 1)) { list.Remove(num2 - 1); list.Add(num2); } else if (list.Contains(num2 - 2)) { list.Remove(num2 - 2); list.Add(num2); } else if (list.Contains(num2 - 3)) { list.Remove(num2 - 3); list.Add(num2); } else if (list.Contains(num2 - 4)) { list.Remove(num2 - 4); list.Add(num2); } else if (!list.Contains(num2) && !list.Contains(num2 + 1) && !list.Contains(num2 + 2) && !list.Contains(num2 + 3) && !list.Contains(num2 + 4)) { list.Add(num2); } else { list = new List <EffectNumber>(); if (item.ItemNumber.Category == ItemCategory.Weapon) { if (item.Effects[0].Equals(1299600007)) { list.Add(1299600007); list.Add(1299602002); list.Add(1208300005); list.Add(1208301005); } else if (item.Effects[0].Equals(1203300005)) { list.Add(1203300005); list.Add(1203301005); list.Add(1299600007); } else if (item.Effects[0].Equals(1299600006)) { list.Add(1299600006); } else { list.Add(1299600001); } } } item.EnchantLvl++; item.Effects = list.ToArray(); item.EnchantMP = 0; player.PEN -= num; session.SendAsync(new EnchantItemAckMessage { Result = result, ItemId = (ulong)message.ItemId, Effect = num2 }); session.SendAsync(new ItemUpdateInventoryAckMessage(InventoryAction.Update, item.Map <PlayerItem, ItemDto>())); session.SendAsync(new MoneyRefreshCashInfoAckMessage(player.PEN, player.AP)); Logger.ForAccount(session).Information(string.Format("Enchanted {0} With {1} PEN", item.ItemNumber, num)); } catch (Exception ex) { session.SendAsync(new EnchantItemAckMessage(EnchantResult.ErrorItemEnchant)); //Logger.Information(ex.StackTrace); } } return; }
/// <summary> /// Handles skill training from enchanting. /// </summary> /// <param name="skill"></param> /// <param name="result"></param> private void Training(Skill skill, EnchantResult result) { // Novice and r8 have no relevant training if (skill.Info.Rank < SkillRank.RF || skill.Info.Rank > SkillRank.R1 || skill.Info.Rank == SkillRank.R8) return; switch (result) { case EnchantResult.Success: skill.Train(1); // Get a success. return; case EnchantResult.HugeSuccess: skill.Train(2); // Get a great success. goto case EnchantResult.Success; case EnchantResult.Fail: if (skill.Info.Rank <= SkillRank.R6) skill.Train(3); // Get a failure. return; case EnchantResult.HugeFail: if (skill.Info.Rank <= SkillRank.RE) skill.Train(4); // Get a horrible result. goto case EnchantResult.Fail; } }
/// <summary> /// Returns random durability loss for rank. Returns -1 if item should /// be destroyed. /// </summary> /// <remarks> /// Reference: http://wiki.mabinogiworld.com/view/Enchant#Enchanting /// </remarks> /// <param name="rnd"></param> /// <param name="enchantRank"></param> /// <returns></returns> private int GetDurabilityLoss(Random rnd, SkillRank enchantRank, EnchantResult result) { var points = 0; switch (enchantRank) { case SkillRank.Novice: return 0; case SkillRank.RF: points = (result == EnchantResult.Fail ? rnd.Next(0, 1) : rnd.Next(0, 2)); break; case SkillRank.RE: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RD: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RC: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 6)); break; case SkillRank.RB: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 7)); break; case SkillRank.RA: points = (result == EnchantResult.Fail ? rnd.Next(0, 4) : rnd.Next(0, 8)); break; case SkillRank.R9: points = (result == EnchantResult.Fail ? rnd.Next(1, 6) : rnd.Next(1, 10)); break; case SkillRank.R8: points = (result == EnchantResult.Fail ? rnd.Next(2, 7) : rnd.Next(2, 12)); break; case SkillRank.R7: points = (result == EnchantResult.Fail ? rnd.Next(2, 8) : rnd.Next(2, 14)); break; default: return -1; } return points * 1000; }
public EnchantItemAckMessage(EnchantResult result) : this() { Result = result; }
/// <summary> /// Returns random durability loss for rank. Returns -1 if item should /// be destroyed. /// </summary> /// <remarks> /// Reference: http://wiki.mabinogiworld.com/view/Enchant#Enchanting /// </remarks> /// <param name="rnd"></param> /// <param name="enchantRank"></param> /// <returns></returns> private int GetDurabilityLoss(Random rnd, SkillRank enchantRank, EnchantResult result) { var points = 0; // Destroy item if safe enchanting is disabled and rank is over 6. if (!ChannelServer.Instance.Conf.World.SafeEnchanting && enchantRank >= SkillRank.R6) return -1; switch (enchantRank) { // A huge fail results in a bigger durability loss. case SkillRank.RF: points = (result == EnchantResult.Fail ? rnd.Next(0, 1) : rnd.Next(0, 2)); break; case SkillRank.RE: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RD: points = (result == EnchantResult.Fail ? rnd.Next(0, 2) : rnd.Next(0, 4)); break; case SkillRank.RC: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 6)); break; case SkillRank.RB: points = (result == EnchantResult.Fail ? rnd.Next(0, 3) : rnd.Next(0, 7)); break; case SkillRank.RA: points = (result == EnchantResult.Fail ? rnd.Next(0, 4) : rnd.Next(0, 8)); break; case SkillRank.R9: points = (result == EnchantResult.Fail ? rnd.Next(1, 6) : rnd.Next(1, 10)); break; case SkillRank.R8: points = (result == EnchantResult.Fail ? rnd.Next(2, 7) : rnd.Next(2, 12)); break; case SkillRank.R7: points = (result == EnchantResult.Fail ? rnd.Next(2, 8) : rnd.Next(2, 14)); break; // Custom durability loss for R6+, for safe enchanting option. case SkillRank.R6: points = (result == EnchantResult.Fail ? rnd.Next(3, 9) : rnd.Next(3, 16)); break; case SkillRank.R5: points = (result == EnchantResult.Fail ? rnd.Next(3, 9) : rnd.Next(3, 16)); break; case SkillRank.R4: points = (result == EnchantResult.Fail ? rnd.Next(4, 10) : rnd.Next(4, 18)); break; case SkillRank.R3: points = (result == EnchantResult.Fail ? rnd.Next(4, 10) : rnd.Next(4, 18)); break; case SkillRank.R2: points = (result == EnchantResult.Fail ? rnd.Next(5, 11) : rnd.Next(5, 20)); break; case SkillRank.R1: points = (result == EnchantResult.Fail ? rnd.Next(5, 11) : rnd.Next(5, 20)); break; } return points * 1000; }