ConsumeOnFailure() public method

public ConsumeOnFailure ( Mobile from, Type resourceType, CraftItem craftItem ) : bool
from Mobile
resourceType Type
craftItem CraftItem
return bool
Ejemplo n.º 1
0
        public bool ConsumeRes(Mobile from, Type typeRes, CraftSystem craftSystem, ref int resHue, ref int maxAmount, ConsumeType consumeType, ref object message, bool isFailure)
        {
            Container ourPack = from.Backpack;

            if (ourPack == null)
            {
                return(false);
            }

            if (m_NeedHeat && !Find(from, m_HeatSources))
            {
                message = 1044487; // You must be near a fire source to cook.
                return(false);
            }

            if (m_NeedOven && !Find(from, m_Ovens))
            {
                message = 1044493; // You must be near an oven to bake that.
                return(false);
            }

            if (m_NeedMill && !Find(from, m_Mills))
            {
                message = 1044491; // You must be near a flour mill to do that.
                return(false);
            }

            Type[][] types   = new Type[m_arCraftRes.Count][];
            int[]    amounts = new int[m_arCraftRes.Count];

            maxAmount = int.MaxValue;

            CraftSubResCol resCol = (m_UseSubRes2 ? craftSystem.CraftSubRes2 : craftSystem.CraftSubRes);

            for (int i = 0; i < types.Length; ++i)
            {
                CraftRes craftRes = m_arCraftRes.GetAt(i);
                Type     baseType = craftRes.ItemType;

                // Resource Mutation
                if ((baseType == resCol.ResType) && (typeRes != null))
                {
                    baseType = typeRes;

                    CraftSubRes subResource = resCol.SearchFor(baseType);

                    if (subResource != null && from.Skills[craftSystem.MainSkill].Base < subResource.RequiredSkill)
                    {
                        message = subResource.Message;
                        return(false);
                    }
                }
                // ******************

                for (int j = 0; types[i] == null && j < m_TypesTable.Length; ++j)
                {
                    if (m_TypesTable[j][0] == baseType)
                    {
                        types[i] = m_TypesTable[j];
                    }
                }

                if (types[i] == null)
                {
                    types[i] = new Type[] { baseType }
                }
                ;

                amounts[i] = craftRes.Amount;

                // For stackable items that can ben crafted more than one at a time
                if (UseAllRes)
                {
                    int tempAmount = ourPack.GetAmount(types[i]);
                    tempAmount /= amounts[i];
                    if (tempAmount < maxAmount)
                    {
                        maxAmount = tempAmount;

                        if (maxAmount == 0)
                        {
                            CraftRes res = m_arCraftRes.GetAt(i);

                            if (res.MessageNumber > 0)
                            {
                                message = res.MessageNumber;
                            }
                            else if (!String.IsNullOrEmpty(res.MessageString))
                            {
                                message = res.MessageString;
                            }
                            else
                            {
                                message = 502925; // You don't have the resources required to make that item.
                            }
                            return(false);
                        }
                    }
                }
                // ****************************

                if (isFailure && !craftSystem.ConsumeOnFailure(from, types[i][0], this))
                {
                    amounts[i] = 0;
                }
            }

            // We adjust the amount of each resource to consume the max posible
            if (UseAllRes)
            {
                for (int i = 0; i < amounts.Length; ++i)
                {
                    amounts[i] *= maxAmount;
                }
            }
            else
            {
                maxAmount = -1;
            }

            Item consumeExtra = null;

            if (m_NameNumber == 1041267)
            {
                // Runebooks are a special case, they need a blank recall rune

                List <RecallRune> runes = ourPack.FindItemsByType <RecallRune>();

                for (int i = 0; i < runes.Count; ++i)
                {
                    RecallRune rune = runes[i];

                    if (rune != null && !rune.Marked)
                    {
                        consumeExtra = rune;
                        break;
                    }
                }

                if (consumeExtra == null)
                {
                    message = 1044253; // You don't have the components needed to make that.
                    return(false);
                }
            }

            int index = 0;

            // Consume ALL
            if (consumeType == ConsumeType.All)
            {
                m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

                if (from is Player)
                {
                    Craftsman cm = Perk.GetByType <Craftsman>(from as Player);

                    if (cm != null && cm.Efficient())
                    {
                        for (int i = 0; i < amounts.Length; i++)
                        {   //Reduce all resources used by one if result is greater than one.
                            if (amounts[i] - 1 > 1)
                            {
                                amounts[i]--;
                            }
                        }
                    }
                }

                if (IsQuantityType(types))
                {
                    index = ConsumeQuantity(ourPack, types, amounts);
                }
                else
                {
                    index = ourPack.ConsumeTotalGrouped
                                (types, amounts, true, new OnItemConsumed(OnResourceConsumed), new CheckItemGroup(CheckHueGrouping));
                }

                resHue = m_ResHue;
            }

            // Consume Half ( for use all resource craft type )
            else if (consumeType == ConsumeType.Half)
            {
                for (int i = 0; i < amounts.Length; i++)
                {
                    amounts[i] /= 2;

                    if (amounts[i] < 1)
                    {
                        amounts[i] = 1;
                    }
                }

                m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

                if (IsQuantityType(types))
                {
                    index = ConsumeQuantity(ourPack, types, amounts);
                }
                else
                {
                    index = ourPack.ConsumeTotalGrouped
                                (types, amounts, true, new OnItemConsumed(OnResourceConsumed), new CheckItemGroup(CheckHueGrouping));
                }

                resHue = m_ResHue;
            }
            else // ConstumeType.None ( it's basicaly used to know if the crafter has enough resource before starting the process )
            {
                index = -1;

                if (IsQuantityType(types))
                {
                    for (int i = 0; i < types.Length; i++)
                    {
                        if (GetQuantity(ourPack, types[i]) < amounts[i])
                        {
                            index = i;
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < types.Length; i++)
                    {
                        if (ourPack.GetBestGroupAmount(types[i], true, new CheckItemGroup(CheckHueGrouping)) < amounts[i])
                        {
                            index = i;
                            break;
                        }
                    }
                }
            }

            if (index == -1)
            {
                if (consumeType != ConsumeType.None)
                {
                    if (consumeExtra != null)
                    {
                        consumeExtra.Delete();
                    }
                }

                return(true);
            }
            else
            {
                CraftRes res = m_arCraftRes.GetAt(index);

                if (res.MessageNumber > 0)
                {
                    message = res.MessageNumber;
                }
                else if (res.MessageString != null && res.MessageString != String.Empty)
                {
                    message = res.MessageString;
                }
                else
                {
                    message = 502925; // You don't have the resources required to make that item.
                }
                return(false);
            }
        }
Ejemplo n.º 2
0
		public bool ConsumeRes( Mobile from, Type typeRes, CraftSystem craftSystem, ref int resHue, ref int maxAmount, ConsumeType consumeType, ref object message, bool isFailure )
		{
			Container ourPack = from.Backpack;

			if ( ourPack == null )
				return false;

			if ( m_NeedHeat && !Find( from, m_HeatSources ) )
			{
				message = 1044487; // You must be near a fire source to cook.
				return false;
			}

			if ( m_NeedOven && !Find( from, m_Ovens ) )
			{
				message = 1044493; // You must be near an oven to bake that.
				return false;
			}

			if ( m_NeedMill && !Find( from, m_Mills ) )
			{
				message = 1044491; // You must be near a flour mill to do that.
				return false;
			}

			Type[][] types = new Type[m_arCraftRes.Count][];
			int[] amounts = new int[m_arCraftRes.Count];

			maxAmount = int.MaxValue;

			CraftSubResCol resCol = ( m_UseSubRes2 ? craftSystem.CraftSubRes2 : craftSystem.CraftSubRes );

			for ( int i = 0; i < types.Length; ++i )
			{
				CraftRes craftRes = m_arCraftRes.GetAt( i );
				Type baseType = craftRes.ItemType;

				// Resource Mutation
				if ( (baseType == resCol.ResType) && ( typeRes != null ) )
				{
					baseType = typeRes;

					CraftSubRes subResource = resCol.SearchFor( baseType );

					if ( subResource != null && from.Skills[craftSystem.MainSkill].Base < subResource.RequiredSkill )
					{
						message = subResource.Message;
						return false;
					}
				}
				// ******************

				for ( int j = 0; types[i] == null && j < m_TypesTable.Length; ++j )
				{
					if ( m_TypesTable[j][0] == baseType )
						types[i] = m_TypesTable[j];
				}

				if ( types[i] == null )
					types[i] = new Type[]{ baseType };

				amounts[i] = craftRes.Amount;

				// For stackable items that can ben crafted more than one at a time
				if ( UseAllRes )
				{
					int tempAmount = ourPack.GetAmount( types[i] );
					tempAmount /= amounts[i];
					if ( tempAmount < maxAmount )
					{
						maxAmount = tempAmount;

						if ( maxAmount == 0 )
						{
							CraftRes res = m_arCraftRes.GetAt( i );

							if ( res.MessageNumber > 0 )
								message = res.MessageNumber;
							else if ( !String.IsNullOrEmpty( res.MessageString ) )
								message = res.MessageString;
							else
								message = 502925; // You don't have the resources required to make that item.

							return false;
						}
					}
				}
				// ****************************

				if ( isFailure && !craftSystem.ConsumeOnFailure( from, types[i][0], this ) )
					amounts[i] = 0;
			}

			// We adjust the amount of each resource to consume the max posible
			if ( UseAllRes )
			{
				for ( int i = 0; i < amounts.Length; ++i )
					amounts[i] *= maxAmount;
			}
			else
				maxAmount = -1;

			Item consumeExtra = null;

			if ( m_NameNumber == 1041267 )
			{
				// Runebooks are a special case, they need a blank recall rune

				List<RecallRune> runes = ourPack.FindItemsByType<RecallRune>();

				for ( int i = 0; i < runes.Count; ++i )
				{
					RecallRune rune = runes[i];

					if ( rune != null && !rune.Marked )
					{
						consumeExtra = rune;
						break;
					}
				}

				if ( consumeExtra == null )
				{
					message = 1044253; // You don't have the components needed to make that.
					return false;
				}
			}
			
			int index = 0;

			// Consume ALL
			if ( consumeType == ConsumeType.All )
			{
				m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

				if ( IsQuantityType( types ) )
					index = ConsumeQuantity( ourPack, types, amounts );
				else
					index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );

				resHue = m_ResHue;
			}

			// Consume Half ( for use all resource craft type )
			else if ( consumeType == ConsumeType.Half )
			{
				for ( int i = 0; i < amounts.Length; i++ )
				{
					amounts[i] /= 2;

					if ( amounts[i] < 1 )
						amounts[i] = 1;
				}

				m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

				if ( IsQuantityType( types ) )
					index = ConsumeQuantity( ourPack, types, amounts );
				else
					index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );

				resHue = m_ResHue;
			}

			else // ConstumeType.None ( it's basicaly used to know if the crafter has enough resource before starting the process )
			{
				index = -1;

				if ( IsQuantityType( types ) )
				{
					for ( int i = 0; i < types.Length; i++ )
					{
						if ( GetQuantity( ourPack, types[i] ) < amounts[i] )
						{
							index = i;
							break;
						}
					}
				}
				else
				{
					for ( int i = 0; i < types.Length; i++ )
					{
						if ( ourPack.GetBestGroupAmount( types[i], true, new CheckItemGroup( CheckHueGrouping ) ) < amounts[i] )
						{
							index = i;
							break;
						}
					}
				}
			}

			if ( index == -1 )
			{
				if ( consumeType != ConsumeType.None )
					if ( consumeExtra != null )
						consumeExtra.Delete();

				return true;
			}
			else
			{
				CraftRes res = m_arCraftRes.GetAt( index );

				if ( res.MessageNumber > 0 )
					message = res.MessageNumber;
				else if ( res.MessageString != null && res.MessageString != String.Empty )
					message = res.MessageString;
				else
					message = 502925; // You don't have the resources required to make that item.

				return false;
			}
		}
Ejemplo n.º 3
0
        public bool ConsumeRes( Mobile from, Type typeRes, CraftSystem craftSystem, ref int resHue, ref int maxAmount, ConsumeType consumeType, ref object message, bool isFailure )
        {
            Container ourPack = from.Backpack;

            if ( ourPack == null )
                return false;

            if ( m_NeedHeat && !Find( from, m_HeatSources ) )
            {
                message = 1044487; // You must be near a fire source to cook.
                return false;
            }

            if ( m_NeedOven && !Find( from, m_Ovens ) )
            {
                message = 1044493; // You must be near an oven to bake that.
                return false;
            }

            if ( m_NeedMill && !Find( from, m_Mills ) )
            {
                message = 1044491; // You must be near a flour mill to do that.
                return false;
            }

            Type[][] types = new Type[m_arCraftRes.Count][];
            int[] amounts = new int[m_arCraftRes.Count];

            maxAmount = int.MaxValue;

            CraftSubResCol resCol = ( m_UseSubRes2 ? craftSystem.CraftSubRes2 : craftSystem.CraftSubRes );

            for ( int i = 0; i < types.Length; ++i )
            {
                CraftRes craftRes = m_arCraftRes.GetAt( i );
                Type baseType = craftRes.ItemType;

                // Resource Mutation
                if ( (baseType == resCol.ResType) && ( typeRes != null ) )
                {
                    baseType = typeRes;

                    CraftSubRes subResource = resCol.SearchFor( baseType );

                    if ( subResource != null && from.Skills[craftSystem.MainSkill].Base < subResource.RequiredSkill )
                    {
                        message = subResource.Message;
                        return false;
                    }
                }
                // ******************

                for ( int j = 0; types[i] == null && j < m_TypesTable.Length; ++j )
                {
                    if ( m_TypesTable[j][0] == baseType )
                        types[i] = m_TypesTable[j];
                }

                if ( types[i] == null )
                    types[i] = new Type[]{ baseType };

                amounts[i] = craftRes.Amount;

                // For stackable items that can ben crafted more than one at a time
                if ( UseAllRes )
                {
                    int tempAmount = ourPack.GetAmount( types[i] );
                    tempAmount /= amounts[i];
                    if ( tempAmount < maxAmount )
                    {
                        maxAmount = tempAmount;

                        if ( maxAmount == 0 )
                        {
                            CraftRes res = m_arCraftRes.GetAt( i );

                            if ( res.MessageNumber > 0 )
                                message = res.MessageNumber;
                            else if ( !String.IsNullOrEmpty( res.MessageString ) )
                                message = res.MessageString;
                            else
                                message = 502925; // You don't have the resources required to make that item.

                            if (craftSystem is DefInscription)
                            {
                                from.LocalOverheadMessage(MessageType.Regular, 0x22, true, "More reagents are needed for this spell.");
                            }
                            else if (craftSystem is DefTinkering)
                            {
                                if (baseType == typeof(Bolt))
                                    from.SendAsciiMessage("You need a crossbow bolt to make that trap!");
                                else if (baseType == typeof(BaseExplosionPotion))
                                    from.SendAsciiMessage("You need a purple potion to make that trap!");
                                else if (baseType == typeof(BasePoisonPotion))
                                    from.SendAsciiMessage("You need a green potion to make that trap!");
                                else
                                    from.SendAsciiMessage("You don't have the resources required to make that item.");
                            }
                            else
                                from.SendAsciiMessage("You don't have the resources required to make that item.");
                            return false;
                        }
                    }
                }
                // ****************************

                if ( isFailure && !craftSystem.ConsumeOnFailure( from, types[i][0], this ) )
                    amounts[i] = 0;
            }

            // We adjust the amount of each resource to consume the max posible
            if ( UseAllRes )
            {
                for ( int i = 0; i < amounts.Length; ++i )
                    amounts[i] *= maxAmount;
            }
            else
                maxAmount = -1;

            Item consumeExtra = null;

            if ( m_NameNumber == 1041267 )
            {
                // Runebooks are a special case, they need a blank recall rune

                List<RecallRune> runes = ourPack.FindItemsByType<RecallRune>();

                for ( int i = 0; i < runes.Count; ++i )
                {
                    RecallRune rune = runes[i];

                    if ( rune != null && !rune.Marked )
                    {
                        consumeExtra = rune;
                        break;
                    }
                }

                if ( consumeExtra == null )
                {
                    message = 1044253; // You don't have the components needed to make that.
                    return false;
                }
            }

            int index = 0;

            double platChance = 0.025; //2.5% base

            // Consume ALL
            if ( consumeType == ConsumeType.All )
            {
                m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

                int amountTotal = 0;
                foreach (int value in amounts.ToList())
                {
                    amountTotal += value;
                }

                platChance *= amountTotal;

                if ( isFailure )
                {
                    platChance /= 2;
                }

                if ( platChance > 0.3 )
                {
                    platChance = 0.3;
                }

                if ( platChance > Utility.RandomDouble() && (from is PlayerMobile) && ((PlayerMobile)from).LastCraftPlatinum + TimeSpan.FromDays(1.0) < DateTime.Now )
                {
                    from.AddToBackpack( new Platinum() );
                    from.SendAsciiMessage( "Some platinum has been put in your backpack." );
                }

                if ( from is PlayerMobile )
                {
                    ( (PlayerMobile)from ).LastCraftPlatinum = DateTime.Now;
                }

                if ( IsQuantityType( types ) )
                    index = ConsumeQuantity( ourPack, types, amounts );
                else
                    index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );

                resHue = m_ResHue;
            }
            // Consume Half ( for use all resource craft type )
            else if ( consumeType == ConsumeType.Half )
            {
                int amountTotal = 0;
                for ( int i = 0; i < amounts.Length; i++ )
                {
                    amounts[i] /= 2;

                    if ( amounts[i] < 1 )
                        amounts[i] = 1;

                    amountTotal += amounts[i];
                }

                platChance *= amountTotal;

                if ( isFailure )
                {
                    platChance /= 2;
                }

                if ( platChance > 0.3 )
                {
                    platChance = 0.3;
                }

                if ( platChance > Utility.RandomDouble() && ( from is PlayerMobile ) && ( (PlayerMobile)from ).LastCraftPlatinum + TimeSpan.FromDays( 1.0 ) < DateTime.Now )
                {
                    from.AddToBackpack( new Platinum() );
                    from.SendAsciiMessage( "Some platinum has been put in your backpack." );
                }

                if ( from is PlayerMobile )
                {
                    ( (PlayerMobile)from ).LastCraftPlatinum = DateTime.Now;
                }

                m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

                if ( IsQuantityType( types ) )
                    index = ConsumeQuantity( ourPack, types, amounts );
                else
                    index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );

                resHue = m_ResHue;
            }

            else // ConstumeType.None ( it's basicaly used to know if the crafter has enough resource before starting the process )
            {
                index = -1;

                if ( IsQuantityType( types ) )
                {
                    for ( int i = 0; i < types.Length; i++ )
                    {
                        if ( GetQuantity( ourPack, types[i] ) < amounts[i] )
                        {
                            index = i;
                            break;
                        }
                    }
                }
                else
                {
                    for ( int i = 0; i < types.Length; i++ )
                    {
                        if ( ourPack.GetBestGroupAmount( types[i], true, new CheckItemGroup( CheckHueGrouping ) ) < amounts[i] )
                        {
                            index = i;
                            break;
                        }
                    }
                }
            }

            if ( index == -1 )
            {
                if ( consumeType != ConsumeType.None )
                    if ( consumeExtra != null )
                        consumeExtra.Delete();

                return true;
            }
            else
            {
                CraftRes res = m_arCraftRes.GetAt( index );

                if ( res.MessageNumber > 0 )
                    message = res.MessageNumber;
                else if ( res.MessageString != null && res.MessageString != String.Empty )
                    message = res.MessageString;
                else
                    message = 502925; // You don't have the resources required to make that item.

                if (craftSystem is DefInscription)
                {
                    from.LocalOverheadMessage(MessageType.Regular, 0x22, true, "More reagents are needed for this spell.");
                }
                else
                {
                    if (res.ItemType == typeof(Bolt))
                        from.SendAsciiMessage("You need a crossbow bolt to make that trap!");
                    else if (res.ItemType == typeof(BaseExplosionPotion))
                        from.SendAsciiMessage("You need a purple potion to make that trap!");
                    else if (res.ItemType == typeof(BasePoisonPotion))
                        from.SendAsciiMessage("You need a green potion to make that trap!");
                    else
                        from.SendAsciiMessage("You don't have the resources required to make that item.");
                }
                return false;
            }
        }