Пример #1
0
        public override bool PreDraw(int i, int j, SpriteBatch spriteBatch)
        {
            int ID = mod.GetID <TEQETank>(i, j);

            if (ID == -1)
            {
                return(false);
            }

            Tile tile = Main.tile[i, j];

            if (tile.TopLeft())
            {
                Vector2 zero = new Vector2(Main.offScreenRange, Main.offScreenRange);
                if (Main.drawToScreen)
                {
                    zero = Vector2.Zero;
                }
                Vector2 position = new Vector2(i * 16 - (int)Main.screenPosition.X, j * 16 - (int)Main.screenPosition.Y) + zero;

                TEQETank qeTank = (TEQETank)TileEntity.ByID[ID];
                ModFluid fluid  = qeTank.GetFluid();

                if (fluid != null)
                {
                    spriteBatch.Draw(ModLoader.GetTexture(FluidLoader.GetFluid(fluid.Name).Texture), new Rectangle((int)position.X + 6, (int)(position.Y + 6 + (20 - 20 * (fluid.volume / (float)TEQETank.MaxVolume))), 20, (int)(20 * (fluid.volume / (float)TEQETank.MaxVolume))), null, Color.White, 0f, Vector2.Zero, SpriteEffects.None, 0f);
                }
            }

            return(true);
        }
Пример #2
0
        public override void Load(TagCompound tag)
        {
            if (tag.ContainsKey("Items"))
            {
                if (tag.ContainsKey("Frequencies"))
                {
                    IList <Frequency>    frequencies = tag.GetList <Frequency>("Frequencies");
                    IList <List <Item> > items       = tag.GetList <List <Item> >("Items");
                    enderItems = frequencies.Zip(items, (frequency, list) => new KeyValuePair <Frequency, List <Item> >(frequency, list)).ToDictionary(x => x.Key, x => x.Value);
                }
                else
                {
                    List <TagCompound> tags = tag.GetList <TagCompound>("Items").ToList();
                    enderItems = tags.Select(x => new KeyValuePair <Frequency, List <Item> >(x.Get <Frequency>("Frequency"), x.GetList <Item>("Items").ToList())).ToDictionary(x => x.Key, x => x.Value);
                }
            }

            if (tag.ContainsKey("KeysFluids") && tag.ContainsKey("ValuesFluids"))
            {
                IList <Frequency> keysFluids   = tag.GetList <Frequency>("KeysFluids");
                IList <ModFluid>  valuesFluids = tag.GetList <ModFluid>("ValuesFluids");
                enderFluids = keysFluids.Zip(valuesFluids, (freq, list) => new KeyValuePair <Frequency, ModFluid>(freq, list)).ToDictionary(x => x.Key, x => x.Value);
            }
            else if (tag.ContainsKey("Fluids"))
            {
                List <TagCompound> tags = tag.GetList <TagCompound>("Fluids").ToList();
                enderFluids = tags.Select(x =>
                {
                    TagCompound fluidTag = x.Get <TagCompound>("Fluid");
                    ModFluid fluid       = TheOneLibrary.Utility.Utility.SetDefaults(fluidTag.GetString("Type"));
                    fluid.volume         = fluidTag.GetInt("Volume");
                    return(new KeyValuePair <Frequency, ModFluid>(x.Get <Frequency>("Frequency"), fluid));
                }).ToDictionary(x => x.Key, x => x.Value);
            }
        }
Пример #3
0
        public static ModFluid SetDefaults(string name)
        {
            ModFluid fluid = FluidLoader.fluidNames[name].NewInstance();

            fluid.SetDefaults();
            fluid.SetStaticDefaults();
            return(fluid);
        }
Пример #4
0
        public static ModFluid SetDefaults(int type)
        {
            ModFluid fluid = FluidLoader.fluids.First(x => x.type == type).NewInstance();

            fluid.SetDefaults();
            fluid.SetStaticDefaults();
            return(fluid);
        }
Пример #5
0
        public void SetFluidStorage(Frequency frequency, ModFluid value)
        {
            if (!enderFluids.ContainsKey(frequency))
            {
                enderFluids.Add(frequency, null);
                Net.SyncQE();
            }

            enderFluids[frequency] = value;
        }
Пример #6
0
        public static ModFluid CopyFluidWithSize(ModFluid fluid, int size)
        {
            if (size == 0)
            {
                return(null);
            }
            ModFluid copy = fluid.Clone();

            copy.volume = fluid.volume;
            return(copy);
        }
Пример #7
0
        public override void LeftClickCont(int i, int j)
        {
            int ID = mod.GetID <TEQETank>(i, j);

            if (ID == -1)
            {
                return;
            }

            TEQETank qeTank = (TEQETank)TileEntity.ByID[ID];

            if (Main.LocalPlayer.HeldItem.modItem is IFluidContainerItem)             // extract fluid
            {
                IFluidContainerItem fluidContainer = (IFluidContainerItem)Main.LocalPlayer.HeldItem.modItem;

                ModFluid fluid     = qeTank.GetFluid();
                ModFluid itemFluid = fluidContainer.GetFluid();
                int      capacity  = fluidContainer.GetFluidCapacity();

                if (fluid != null)
                {
                    if (itemFluid == null)
                    {
                        itemFluid = TheOneLibrary.Utility.Utility.SetDefaults(fluid.type);

                        int volume = Math.Min(fluid.volume, capacity - itemFluid.volume);
                        itemFluid.volume += volume;
                        fluid.volume     -= volume;

                        if (fluid.volume <= 0)
                        {
                            fluid = null;
                        }
                    }
                    else if (fluid.type == itemFluid.type && itemFluid.volume < capacity)
                    {
                        int volume = Math.Min(fluid.volume, capacity - itemFluid.volume);
                        itemFluid.volume += volume;
                        fluid.volume     -= volume;

                        if (fluid.volume <= 0)
                        {
                            fluid = null;
                        }
                    }
                }

                fluidContainer.SetFluid(itemFluid);
                qeTank.SetFluid(fluid);

                NetUtility.SyncItem(fluidContainer.GetItem().item);
                Net.SyncQE();
            }
        }
Пример #8
0
        public ModFluid InsertFluid(int slot, ModFluid fluid, bool simulate = false)
        {
            if (fluid == null)
            {
                return(null);
            }

            ValidateSlotIndex(slot);

            if (!IsFluidValid(this, slot, fluid))
            {
                return(fluid);
            }

            ModFluid existing = Fluids[slot];

            int limit = GetVolumeLimit(slot);

            if (existing != null)
            {
                if (!fluid.Equals(existing))
                {
                    return(fluid);
                }

                limit -= existing.volume;
            }

            if (limit <= 0)
            {
                return(fluid);
            }

            bool reachedLimit = fluid.volume > limit;

            if (!simulate)
            {
                if (existing == null)
                {
                    Fluids[slot] = reachedLimit ? CopyFluidWithSize(fluid, limit) : fluid;
                }
                else
                {
                    this.Grow(slot, reachedLimit ? limit : fluid.volume);
                }

                OnContentsChanged(slot);
            }

            return(reachedLimit ? CopyFluidWithSize(fluid, fluid.volume - limit) : null);
        }
Пример #9
0
        public void AddFluid(string fluid, int volume = 1, int tanks = -1)
        {
            ModFluid modFluid = FluidLoader.GetFluid(fluid).NewInstance();

            modFluid.volume = volume;
            if (tanks == -1)
            {
                requiredFluids.Add(modFluid);
            }
            else
            {
                requiredFluids[tanks] = modFluid;
            }
        }
Пример #10
0
        internal static void ReceiveFluid(BinaryReader reader, int whoAmI)
        {
            Frequency frequency = reader.ReadFrequency();
            int       slot      = reader.ReadInt32();
            ModFluid  fluid     = reader.ReadFluid();

            FluidPair pair = ModContent.GetInstance <QSWorld>().QEFluidHandlers.FirstOrDefault(fluidPair => Equals(fluidPair.Frequency, frequency));

            pair?.Handler.SetFluidInSlot(slot, fluid);

            if (Main.netMode == NetmodeID.Server)
            {
                SendFluid(frequency, slot, whoAmI);
            }
        }
Пример #11
0
        public FluidHandler Load(TagCompound tag)
        {
            SetSize(tag.ContainsKey("Count") ? tag.GetInt("Count") : Slots);
            foreach (TagCompound compound in tag.GetList <TagCompound>("Fluids"))
            {
                ModFluid fluid = compound.Get <ModFluid>("Fluid");
                int      slot  = compound.GetInt("Slot");

                if (slot >= 0 && slot < Slots)
                {
                    Fluids[slot] = fluid;
                }
            }

            return(this);
        }
Пример #12
0
        public ModFluid ExtractFluid(int slot, int volume, bool simulate = false)
        {
            if (volume == 0)
            {
                return(null);
            }

            ValidateSlotIndex(slot);

            ModFluid existing = Fluids[slot];

            if (existing == null)
            {
                return(null);
            }

            int toExtract = Math.Min(volume, GetVolumeLimit(slot));

            if (existing.volume <= toExtract)
            {
                if (!simulate)
                {
                    Fluids[slot] = null;
                    OnContentsChanged(slot);
                }

                return(existing);
            }

            if (!simulate)
            {
                Fluids[slot] = CopyFluidWithSize(existing, existing.volume - toExtract);
                OnContentsChanged(slot);
            }

            return(CopyFluidWithSize(existing, toExtract));
        }
Пример #13
0
 public void AddFluid(ModFluid fluid, int volume = 1, int tanks = -1) => AddFluid(fluid.Name, volume, tanks);
Пример #14
0
 public void SetFluidInSlot(int slot, ModFluid stack)
 {
     ValidateSlotIndex(slot);
     Fluids[slot] = stack;
     OnContentsChanged(slot);
 }
Пример #15
0
 public void SetFluid(ModFluid value, int slot = 0) => fluid = value;
Пример #16
0
        public override bool UseItem(Player player)
        {
            ModFluid fluid = GetFluid();

            if (player.altFunctionUse == 2)
            {
                if (fluid != null)
                {
                    Tile tile = Main.tile[Player.tileTargetX, Player.tileTargetY];
                    if ((!tile.nactive() || !Main.tileSolid[tile.type] || Main.tileSolidTop[tile.type]) && TileLoader.GetTile(tile.type)?.GetType().GetAttribute <BucketDisablePlacement>() == null)
                    {
                        if (tile.liquid == 0 || tile.liquidType() == fluid.type)
                        {
                            Main.PlaySound(19, (int)player.position.X, (int)player.position.Y);

                            if (tile.liquid == 0)
                            {
                                tile.liquidType(fluid.type);
                            }

                            int volume = Math.Min(fluid.volume, 255 - tile.liquid);
                            tile.liquid  += (byte)volume;
                            fluid.volume -= volume;
                            if (fluid.volume == 0)
                            {
                                fluid = null;
                            }

                            WorldGen.SquareTileFrame(Player.tileTargetX, Player.tileTargetY);

                            if (Main.netMode == 1)
                            {
                                NetMessage.sendWater(Player.tileTargetX, Player.tileTargetY);
                            }
                        }
                    }
                }
            }
            else
            {
                if (!Main.GamepadDisableCursorItemIcon)
                {
                    player.showItemIcon = true;
                    Main.ItemIconCacheUpdate(item.type);
                }

                Tile tile = Main.tile[Player.tileTargetX, Player.tileTargetY];
                if ((fluid == null || fluid.type == tile.liquidType()) && tile.liquid > 0 && TileLoader.GetTile(tile.type)?.GetType().GetAttribute <BucketDisablePickup>() == null)
                {
                    Main.PlaySound(19, (int)player.position.X, (int)player.position.Y);

                    if (fluid == null)
                    {
                        fluid = TheOneLibrary.Utility.Utility.SetDefaults(tile.liquidType());
                    }

                    int drain = Math.Min(tile.liquid, TEQETank.MaxVolume - fluid.volume);
                    fluid.volume += drain;

                    tile.liquid -= (byte)drain;

                    if (tile.liquid <= 0)
                    {
                        tile.lava(false);
                        tile.honey(false);
                    }

                    WorldGen.SquareTileFrame(Player.tileTargetX, Player.tileTargetY, false);
                    if (Main.netMode == 1)
                    {
                        NetMessage.sendWater(Player.tileTargetX, Player.tileTargetY);
                    }
                    else
                    {
                        Liquid.AddWater(Player.tileTargetX, Player.tileTargetY);
                    }
                }
            }

            SetFluid(fluid);

            return(true);
        }
Пример #17
0
 public void SetFluid(ModFluid value, int slot = 0) => mod.GetModWorld <PSWorld>().SetFluidStorage(frequency, value);
Пример #18
0
        public override void RightClickCont(int i, int j)
        {
            int ID = mod.GetID <TEQETank>(i, j);

            if (ID == -1)
            {
                return;
            }

            TEQETank qeTank = (TEQETank)TileEntity.ByID[ID];

            Point16 topLeft   = TheOneLibrary.Utility.Utility.TileEntityTopLeft(i, j);
            int     realTileX = topLeft.X * 16;
            int     realTileY = topLeft.Y * 16;

            Rectangle left   = new Rectangle(realTileX + 2, realTileY + 2, 4, 4);
            Rectangle middle = new Rectangle(realTileX + 14, realTileY + 27, 4, 4);
            Rectangle right  = new Rectangle(realTileX + 26, realTileY + 2, 4, 4);

            if (Main.LocalPlayer.HeldItem.type == mod.ItemType <QEBucket>())            // copy frequency
            {
                Main.LocalPlayer.noThrow = 2;
                QEBucket bucket = (QEBucket)Main.LocalPlayer.HeldItem.modItem;
                bucket.frequency = qeTank.frequency;
                NetUtility.SyncItem(bucket.item);
            }
            else if (Main.LocalPlayer.HeldItem.modItem is IFluidContainerItem)             // insert fluid
            {
                IFluidContainerItem fluidContainer = (IFluidContainerItem)Main.LocalPlayer.HeldItem.modItem;

                ModFluid fluid     = qeTank.GetFluid();
                ModFluid itemFluid = fluidContainer.GetFluid();

                if (itemFluid != null)
                {
                    if (fluid == null)
                    {
                        fluid = TheOneLibrary.Utility.Utility.SetDefaults(itemFluid.type);

                        int volume = Math.Min(itemFluid.volume, TEQETank.MaxVolume - fluid.volume);
                        fluid.volume     += volume;
                        itemFluid.volume -= volume;

                        if (itemFluid.volume <= 0)
                        {
                            itemFluid = null;
                        }
                    }
                    else if (fluid.type == itemFluid.type && fluid.volume < TEQETank.MaxVolume)
                    {
                        int volume = Math.Min(itemFluid.volume, TEQETank.MaxVolume - fluid.volume);
                        fluid.volume     += volume;
                        itemFluid.volume -= volume;

                        if (itemFluid.volume <= 0)
                        {
                            itemFluid = null;
                        }
                    }
                }

                fluidContainer.SetFluid(itemFluid);
                qeTank.SetFluid(fluid);

                NetUtility.SyncItem(fluidContainer.GetItem().item);
                Net.SyncQE();
            }
            else             // general click
            {
                Frequency frequency       = qeTank.frequency;
                bool      handleFrequency = false;

                if (left.Contains(Main.MouseWorld))
                {
                    frequency.colorLeft = Utility.ColorFromItem(frequency.colorLeft);
                    handleFrequency     = true;
                }
                else if (middle.Contains(Main.MouseWorld))
                {
                    frequency.colorMiddle = Utility.ColorFromItem(frequency.colorMiddle);
                    handleFrequency       = true;
                }
                else if (right.Contains(Main.MouseWorld))
                {
                    frequency.colorRight = Utility.ColorFromItem(frequency.colorRight);
                    handleFrequency      = true;
                }

                if (handleFrequency)
                {
                    qeTank.frequency = frequency;
                }

                qeTank.SendUpdate();
            }
        }