Example #1
0
        private void ConsumeNeeded(ref int need, Item item, OnItemConsumed callback)
        {
            int theirAmount = item.Amount;

            if (theirAmount < need)
            {
                if (callback != null)
                {
                    callback(item, theirAmount);
                }

                item.Delete();
                need -= theirAmount;
            }
            else
            {
                if (callback != null)
                {
                    callback(item, need);
                }

                item.Consume(need);
                need = 0;
            }
        }
Example #2
0
        public int ConsumeTotal(Type[] types, int[] amounts, bool recurse, OnItemConsumed callback)
        {
            if (types.Length != amounts.Length)
            {
                throw new ArgumentException();
            }

            Item[][] items  = new Item[types.Length][];
            int[]    totals = new int[types.Length];

            for (int i = 0; i < types.Length; ++i)
            {
                items[i] = FindItemsByType(types[i], recurse);

                for (int j = 0; j < items[i].Length; ++j)
                {
                    totals[i] += items[i][j].Amount;
                }

                if (totals[i] < amounts[i])
                {
                    return(i);
                }
            }

            for (int i = 0; i < types.Length; ++i)
            {
                int need = amounts[i];

                for (int j = 0; j < items[i].Length; ++j)
                {
                    Item item = items[i][j];

                    int theirAmount = item.Amount;

                    if (theirAmount < need)
                    {
                        if (callback != null)
                        {
                            callback(item, theirAmount);
                        }

                        item.Delete();
                        need -= theirAmount;
                    }
                    else
                    {
                        if (callback != null)
                        {
                            callback(item, need);
                        }

                        item.Consume(need);
                        break;
                    }
                }
            }

            return(-1);
        }
Example #3
0
        public bool ConsumeTotal(Type type, int amount, bool recurse, OnItemConsumed callback)
        {
            Item[] items = FindItemsByType(type, recurse);

            // First pass, compute total
            int total = 0;

            for (int i = 0; i < items.Length; ++i)
            {
                total += items[i].Amount;
            }

            if (total >= amount)
            {
                // We've enough, so consume it

                int need = amount;

                for (int i = 0; i < items.Length; ++i)
                {
                    Item item = items[i];

                    int theirAmount = item.Amount;

                    if (theirAmount < need)
                    {
                        if (callback != null)
                        {
                            callback(item, theirAmount);
                        }

                        item.Delete();
                        need -= theirAmount;
                    }
                    else
                    {
                        if (callback != null)
                        {
                            callback(item, need);
                        }

                        item.Consume(need);

                        return(true);
                    }
                }
            }

            return(false);
        }
Example #4
0
        public int ConsumeTotalGrouped(Type[][] types, int[] amounts, bool recurse, OnItemConsumed callback, CheckItemGroup grouper)
        {
            if (types.Length != amounts.Length)
            {
                throw new ArgumentException();
            }
            else if (grouper == null)
            {
                throw new ArgumentNullException();
            }

            Item[][][] items  = new Item[types.Length][][];
            int[][]    totals = new int[types.Length][];

            for (int i = 0; i < types.Length; ++i)
            {
                Item[] typedItems = FindItemsByType(types[i], recurse);

                ArrayList groups = new ArrayList();
                int       idx    = 0;

                while (idx < typedItems.Length)
                {
                    Item      a     = typedItems[idx++];
                    ArrayList group = new ArrayList();

                    group.Add(a);

                    while (idx < typedItems.Length)
                    {
                        Item b = typedItems[idx];
                        int  v = grouper(a, b);

                        if (v == 0)
                        {
                            group.Add(b);
                        }
                        else
                        {
                            break;
                        }

                        ++idx;
                    }

                    groups.Add(group);
                }

                items[i]  = new Item[groups.Count][];
                totals[i] = new int[groups.Count];

                bool hasEnough = false;

                for (int j = 0; j < groups.Count; ++j)
                {
                    items[i][j] = (Item[])(((ArrayList)groups[j]).ToArray(typeof(Item)));

                    for (int k = 0; k < items[i][j].Length; ++k)
                    {
                        totals[i][j] += items[i][j][k].Amount;
                    }

                    if (totals[i][j] >= amounts[i])
                    {
                        hasEnough = true;
                    }
                }

                if (!hasEnough)
                {
                    return(i);
                }
            }

            for (int i = 0; i < items.Length; ++i)
            {
                for (int j = 0; j < items[i].Length; ++j)
                {
                    if (totals[i][j] >= amounts[i])
                    {
                        int need = amounts[i];

                        for (int k = 0; k < items[i][j].Length; ++k)
                        {
                            Item item = items[i][j][k];

                            int theirAmount = item.Amount;

                            if (theirAmount < need)
                            {
                                if (callback != null)
                                {
                                    callback(item, theirAmount);
                                }

                                item.Delete();
                                need -= theirAmount;
                            }
                            else
                            {
                                if (callback != null)
                                {
                                    callback(item, need);
                                }

                                item.Consume(need);
                                break;
                            }
                        }

                        break;
                    }
                }
            }

            return(-1);
        }
Example #5
0
        public int ConsumeTotalGrouped( Type[][] types, int[] amounts, bool recurse, OnItemConsumed callback, CheckItemGroup grouper )
        {
            if ( types.Length != amounts.Length )
                throw new ArgumentException();
            else if ( grouper == null )
                throw new ArgumentNullException();

            Item[][][] items = new Item[types.Length][][];
            int[][] totals = new int[types.Length][];

            for ( int i = 0; i < types.Length; ++i )
            {
                Item[] typedItems = FindItemsByType( types[i], recurse );

                ArrayList groups = new ArrayList();
                int idx = 0;

                while ( idx < typedItems.Length )
                {
                    Item a = typedItems[idx++];
                    ArrayList group = new ArrayList();

                    group.Add( a );

                    while ( idx < typedItems.Length )
                    {
                        Item b = typedItems[idx];
                        int v = grouper( a, b );

                        if ( v == 0 )
                            group.Add( b );
                        else
                            break;

                        ++idx;
                    }

                    groups.Add( group );
                }

                items[i] = new Item[groups.Count][];
                totals[i] = new int[groups.Count];

                bool hasEnough = false;

                for ( int j = 0; j < groups.Count; ++j )
                {
                    items[i][j] = (Item[])(((ArrayList)groups[j]).ToArray( typeof( Item ) ));

                    for ( int k = 0; k < items[i][j].Length; ++k )
                        totals[i][j] += items[i][j][k].Amount;

                    if ( totals[i][j] >= amounts[i] )
                        hasEnough = true;
                }

                if ( !hasEnough )
                    return i;
            }

            for ( int i = 0; i < items.Length; ++i )
            {
                for ( int j = 0; j < items[i].Length; ++j )
                {
                    if ( totals[i][j] >= amounts[i] )
                    {
                        int need = amounts[i];

                        for ( int k = 0; k < items[i][j].Length; ++k )
                        {
                            Item item = items[i][j][k];

                            int theirAmount = item.Amount;

                            if ( theirAmount < need )
                            {
                                if ( callback != null )
                                    callback( item, theirAmount );

                                item.Delete();
                                need -= theirAmount;
                            }
                            else
                            {
                                if ( callback != null )
                                    callback( item, need );

                                item.Consume( need );
                                break;
                            }
                        }

                        break;
                    }
                }
            }

            return -1;
        }
Example #6
0
        public bool ConsumeTotal( Type type, int amount, bool recurse, OnItemConsumed callback )
        {
            Item[] items = FindItemsByType( type, recurse );

            // First pass, compute total
            int total = 0;

            for ( int i = 0; i < items.Length; ++i )
                total += items[i].Amount;

            if ( total >= amount )
            {
                // We've enough, so consume it

                int need = amount;

                for ( int i = 0; i < items.Length; ++i )
                {
                    Item item = items[i];

                    int theirAmount = item.Amount;

                    if ( theirAmount < need )
                    {
                        if ( callback != null )
                            callback( item, theirAmount );

                        item.Delete();
                        need -= theirAmount;
                    }
                    else
                    {
                        if ( callback != null )
                            callback( item, need );

                        item.Consume( need );

                        return true;
                    }
                }
            }

            return false;
        }
Example #7
0
        public int ConsumeTotal( Type[] types, int[] amounts, bool recurse, OnItemConsumed callback )
        {
            if ( types.Length != amounts.Length )
                throw new ArgumentException();

            Item[][] items = new Item[types.Length][];
            int[] totals = new int[types.Length];

            for ( int i = 0; i < types.Length; ++i )
            {
                items[i] = FindItemsByType( types[i], recurse );

                for ( int j = 0; j < items[i].Length; ++j )
                    totals[i] += items[i][j].Amount;

                if ( totals[i] < amounts[i] )
                    return i;
            }

            for ( int i = 0; i < types.Length; ++i )
            {
                int need = amounts[i];

                for ( int j = 0; j < items[i].Length; ++j )
                {
                    Item item = items[i][j];

                    int theirAmount = item.Amount;

                    if ( theirAmount < need )
                    {
                        if ( callback != null )
                            callback( item, theirAmount );

                        item.Delete();
                        need -= theirAmount;
                    }
                    else
                    {
                        if ( callback != null )
                            callback( item, need );

                        item.Consume( need );
                        break;
                    }
                }
            }

            return -1;
        }
        private void ConsumeNeeded( ref int need, Item item, OnItemConsumed callback )
        {
            int theirAmount = item.Amount;

            if ( theirAmount < need )
            {
                if ( callback != null )
                    callback( item, theirAmount );

                item.Delete();
                need -= theirAmount;
            }
            else
            {
                if ( callback != null )
                    callback( item, need );

                item.Consume( need );
                need = 0;
            }
        }
        public int ConsumeTotalGroupedCompared( Type[][] types, int[] amounts, bool recurse, OnItemConsumed callback, CheckItemGroup grouper, Item compareTo )
        {
            if ( types.Length != amounts.Length )
                throw new ArgumentException();
            else if ( grouper == null )
                throw new ArgumentNullException();

            Item[][][] items = new Item[types.Length][][];
            int[] totals = new int[types.Length];

            bool hasComparer = false;

            Item originalComparer = compareTo;

            int comparerType = -1;

            for ( int i = 0; i < types.Length; ++i )
            {
                Item[] typedItems = FindItemsByType( types[i], recurse );

                List<List<Item>> groups = new List<List<Item>>();

                int idx = 0;

                if ( originalComparer != null )
                {
                    for ( int j = 0; j < types[i].Length; ++j )
                    {
                        if ( originalComparer.GetType() == types[i][j] )
                        {
                            hasComparer = true;
                            compareTo = originalComparer;
                            comparerType = i;
                            break;
                        }
                    }
                }

                while( idx < typedItems.Length )
                {
                    Item a = typedItems[idx++];
                    List<Item> group = new List<Item>();

                    if ( !hasComparer )
                    {
                        compareTo = a;
                        group.Add( a );
                    }
                    else if ( grouper( compareTo, a ) == 0 )
                        group.Add( a );

                    while( idx < typedItems.Length )
                    {
                        Item b = typedItems[idx];
                        int v = grouper( compareTo, b );

                        if( v == 0 )
                            group.Add( b );
                        else
                            break;

                        ++idx;
                    }

                    groups.Add( group );
                }

                compareTo = originalComparer;
                hasComparer = false;

                items[i] = new Item[groups.Count][];

                bool hasEnough = false;

                for ( int j = 0; j < groups.Count; ++j )
                {
                    items[i][j] = groups[j].ToArray();

                    for ( int k = 0; k < items[i][j].Length; ++k )
                        totals[i] += items[i][j][k].Amount;
                }

                if ( totals[i] >= amounts[i] )
                    hasEnough = true;

                if ( !hasEnough )
                    return i;
            }

            for ( int i = 0; i < items.Length; ++i )
            {
                int need = amounts[i];

                if ( originalComparer != null && comparerType == i )
                {
                    object parent = originalComparer.RootParent;

                    if ( parent is Mobile )
                    {
                        Mobile m = (Mobile)parent;

                        if ( this.RootParent is Mobile && m == (Mobile)this.RootParent )
                            ConsumeNeeded( ref need, originalComparer, callback );
                    }
                }

                for ( int j = 0; j < items[i].Length && need > 0; ++j )
                {
                    if ( totals[i] >= amounts[i] )
                    {
                        for ( int k = 0; k < items[i][j].Length && need > 0; ++k )
                        {
                            Item item = items[i][j][k];

                            if ( !item.Deleted )
                                ConsumeNeeded( ref need, item, callback );
                        }
                    }
                }
            }

            return -1;
        }
Example #10
0
        public int ConsumeTotalGroupedCompared(Type[][] types, int[] amounts, bool recurse, OnItemConsumed callback, CheckItemGroup grouper, Item compareTo)
        {
            if (types.Length != amounts.Length)
            {
                throw new ArgumentException();
            }
            else if (grouper == null)
            {
                throw new ArgumentNullException();
            }

            Item[][][] items  = new Item[types.Length][][];
            int[]      totals = new int[types.Length];

            bool hasComparer = false;

            Item originalComparer = compareTo;

            int comparerType = -1;

            for (int i = 0; i < types.Length; ++i)
            {
                Item[] typedItems = FindItemsByType(types[i], recurse);

                List <List <Item> > groups = new List <List <Item> >();

                int idx = 0;

                if (originalComparer != null)
                {
                    for (int j = 0; j < types[i].Length; ++j)
                    {
                        if (originalComparer.GetType() == types[i][j])
                        {
                            hasComparer  = true;
                            compareTo    = originalComparer;
                            comparerType = i;
                            break;
                        }
                    }
                }

                while (idx < typedItems.Length)
                {
                    Item        a     = typedItems[idx++];
                    List <Item> group = new List <Item>();

                    if (!hasComparer)
                    {
                        compareTo = a;
                        group.Add(a);
                    }
                    else if (grouper(compareTo, a) == 0)
                    {
                        group.Add(a);
                    }

                    while (idx < typedItems.Length)
                    {
                        Item b = typedItems[idx];
                        int  v = grouper(compareTo, b);

                        if (v == 0)
                        {
                            group.Add(b);
                        }
                        else
                        {
                            break;
                        }

                        ++idx;
                    }

                    groups.Add(group);
                }

                compareTo   = originalComparer;
                hasComparer = false;

                items[i] = new Item[groups.Count][];

                bool hasEnough = false;

                for (int j = 0; j < groups.Count; ++j)
                {
                    items[i][j] = groups[j].ToArray();

                    for (int k = 0; k < items[i][j].Length; ++k)
                    {
                        totals[i] += items[i][j][k].Amount;
                    }
                }

                if (totals[i] >= amounts[i])
                {
                    hasEnough = true;
                }

                if (!hasEnough)
                {
                    return(i);
                }
            }


            for (int i = 0; i < items.Length; ++i)
            {
                int need = amounts[i];

                if (originalComparer != null && comparerType == i)
                {
                    object parent = originalComparer.RootParent;

                    if (parent is Mobile)
                    {
                        Mobile m = (Mobile)parent;

                        if (this.RootParent is Mobile && m == (Mobile)this.RootParent)
                        {
                            ConsumeNeeded(ref need, originalComparer, callback);
                        }
                    }
                }

                for (int j = 0; j < items[i].Length && need > 0; ++j)
                {
                    if (totals[i] >= amounts[i])
                    {
                        for (int k = 0; k < items[i][j].Length && need > 0; ++k)
                        {
                            Item item = items[i][j][k];

                            if (!item.Deleted)
                            {
                                ConsumeNeeded(ref need, item, callback);
                            }
                        }
                    }
                }
            }

            return(-1);
        }