/// <summary> /// Swap <see cref="UIItem"/>s from one <see cref="UIInventory"/> to the other. /// </summary> private void SwapUIItems(UIItem uiItem, bool fromPlayer, EventArg3 <Item, Trader, Trader> tradeEvent) { // Check if the trade was successful: // (I know this is a very ugly way of doing it, but I don't want to introduce new EventArg(s) with boolean as their return type...) // If we are transfering the item FROM the player, then the player shouldn't have the item in the inventory if the trade was successful and vice versa for the merchant. if ((fromPlayer && !PlayerController.Player.Inventory.Items.Contains(uiItem.Item)) || (!fromPlayer && PlayerController.Player.Inventory.Items.Contains(uiItem.Item))) { //Remove the old UIItem: if (fromPlayer) { uiPlayerInventory.ItemGrid.RemoveUIElement(uiItem); } else { uiMerchantInventory.ItemGrid.RemoveUIElement(uiItem); } //Assign a new instance to the reference that looks the same etc.: uiItem = new UIItem(new Transform(uiItem.Transform.Size), uiItem.Sprite, screen, uiItem.Item); //Swap the Trader references in the EventArg: tradeEvent.SetArguments( tradeEvent.Arg1, //Keep the item reference tradeEvent.Arg3, //Switch reference tradeEvent.Arg2); //Switch reference //Create a new event list where the new swapped trade event and an entirely new EventArg3 can be created. EventArgList onButtonClickEvents = new EventArgList( tradeEvent, new EventArg3 <UIItem, bool, EventArg3 <Item, Trader, Trader> >(SwapUIItems, uiItem, !fromPlayer /* We want to trigger the opposite reaction */, tradeEvent) ); //Create the purchase/sell button whether or not it came from the player's inventory. if (fromPlayer) { uiItem.CreatePurchaseButton(onButtonClickEvents); } else if (uiItem.Item.CanSell) { uiItem.CreateSellButton(onButtonClickEvents); } //Add the new UIItem to the right grid: if (fromPlayer) { uiMerchantInventory.ItemGrid.AddUIElement(uiItem); } else { uiPlayerInventory.ItemGrid.AddUIElement(uiItem); } } }