示例#1
0
文件: Enchant.cs 项目: xKamuna/aura-1
        /// <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;
            }
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        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;
        }
示例#5
0
        /// <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;
            }
        }
示例#6
0
        /// <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;
        }
示例#7
0
 public EnchantItemAckMessage(EnchantResult result)
     : this()
 {
     Result = result;
 }
示例#8
0
		/// <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;
		}