////////////////

        private bool CanStartInvasion(Player player, out Item fuelItem)
        {
            fuelItem = CrossDimensionalAggregatorItem.GetFuelItemFromInventory(player);
            if (fuelItem == null || fuelItem.IsAir)
            {
                return(false);
            }

            var myworld  = ModContent.GetInstance <DynamicInvasionsWorld>();
            var itemInfo = this.item.GetGlobalItem <AggregatorItemInfo>();
            int fuelCost = this.GetFuelCost();

            if (!itemInfo.IsInitialized)
            {
                return(false);
            }

            // Not enough fuel?
            if (fuelCost > fuelItem.stack)
            {
                return(false);
            }

            return(myworld.Logic.CanStartInvasion());
        }
        public override bool CanUseItem(Player player)
        {
            if (!DynamicInvasionsMod.Config.Enabled)
            {
                return(false);
            }

            var modworld = ModContent.GetInstance <DynamicInvasionsWorld>();
            var itemInfo = this.item.GetGlobalItem <AggregatorItemInfo>();

            if (!itemInfo.IsInitialized)
            {
                return(false);
            }

            if (!modworld.Logic.CanStartInvasion())
            {
                Main.NewText("Signal disrupted by mass of surface activity.", Main.errorColor);
                return(false);
            }

            Item fuelItem = CrossDimensionalAggregatorItem.GetFuelItemFromInventory(player);
            int  fuelCost = this.GetFuelCost();
            bool hasFuel  = fuelItem != null && !fuelItem.IsAir && fuelCost <= fuelItem.stack;

            if (!hasFuel)
            {
                Main.NewText("Not enough Eternia Crystals.", Main.errorColor);
                return(false);
            }

            return(hasFuel);
        }
        public override void RightClick(Player player)
        {
            var config  = DynamicInvasionsMod.Config;
            var myworld = ModContent.GetInstance <DynamicInvasionsWorld>();

            if (config.CanAbortInvasions && myworld.Logic.IsInvasionHappening())
            {
                Item fuelItem = CrossDimensionalAggregatorItem.GetFuelItemFromInventory(player);
                int  fuelAmt  = fuelItem != null && !fuelItem.IsAir
                                        ? fuelItem.stack
                                        : 0;

                if (config.InvasionAbortFuelCost == 0 || fuelAmt >= config.InvasionAbortFuelCost)
                {
                    if (config.InvasionAbortFuelCost > 0)
                    {
                        ItemHelpers.ReduceStack(fuelItem, config.InvasionAbortFuelCost);
                    }

                    Main.NewText("Ending invasion...");

                    if (Main.netMode == 0)
                    {
                        myworld.Logic.EndInvasion();
                    }
                    else if (Main.netMode == 1)
                    {
                        ClientPacketHandlers.SendEndInvasionRequestFromClient();
                    }
                }
                else
                {
                    Main.NewText("You need " + config.InvasionAbortFuelCost + " Eternia Crystals to abort an invasion.", Color.Yellow);
                }
            }
            else
            {
                Main.NewText("No custom invasion in progress.", Color.Yellow);
            }
        }