From 44ff338023fb08485afe45c365f3f82a978d4ac1 Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Sat, 28 Jan 2023 20:32:25 +0800 Subject: [PATCH 1/9] add fluid auto filler --- dependencies.gradle | 2 +- .../github/client/gui/GuiFluidAutoFiller.java | 34 ++ .../container/ContainerFluidAutoFiller.java | 54 ++++ .../common/block/BlockFluidAutoFiller.java | 62 ++++ .../common/item/ItemPartFluidTerminal.java | 9 +- .../common/tile/TileFluidAutoFiller.java | 292 ++++++++++++++++++ .../github/inventory/gui/GuiType.java | 11 + .../inventory/slot/FCSlotRestrictedInput.java | 61 +++- .../github/loader/ItemAndBlockHolder.java | 1 + .../com/glodblock/github/util/NameConst.java | 2 + .../resources/assets/ae2fc/lang/en_US.lang | 2 + .../resources/assets/ae2fc/lang/zh_CN.lang | 2 + .../textures/blocks/fluid_auto_filler.png | Bin 0 -> 995 bytes .../ae2fc/textures/gui/fluid_auto_filler.png | Bin 0 -> 1237 bytes 14 files changed, 522 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java create mode 100644 src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java create mode 100644 src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java create mode 100644 src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/fluid_auto_filler.png create mode 100644 src/main/resources/assets/ae2fc/textures/gui/fluid_auto_filler.png diff --git a/dependencies.gradle b/dependencies.gradle index 12fb2e62..018ce888 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,7 +2,7 @@ dependencies { compile('com.github.GTNewHorizons:NotEnoughItems:2.3.21-GTNH:dev') - compile('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-148-GTNH-pre:dev') + compile('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-149-GTNH:dev') compile('curse.maven:cofh-core-69162:2388751') compile('com.github.GTNewHorizons:waila:1.5.22:dev') compileOnly('com.github.GTNewHorizons:ExtraCells2:2.5.25:dev') { transitive = false } diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java new file mode 100644 index 00000000..8368eb05 --- /dev/null +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java @@ -0,0 +1,34 @@ +package com.glodblock.github.client.gui; + +import appeng.client.gui.AEBaseMEGui; +import appeng.core.localization.GuiText; +import com.glodblock.github.FluidCraft; +import com.glodblock.github.client.gui.container.ContainerFluidAutoFiller; +import com.glodblock.github.common.tile.TileFluidAutoFiller; +import com.glodblock.github.util.NameConst; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GuiFluidAutoFiller extends AEBaseMEGui { + protected EntityPlayer player; + private static final ResourceLocation TEX_BG = FluidCraft.resource("textures/gui/fluid_auto_filler.png"); + + public GuiFluidAutoFiller(InventoryPlayer ipl, TileFluidAutoFiller tile) { + super(new ContainerFluidAutoFiller(ipl, tile)); + this.player = ipl.player; + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) { + mc.getTextureManager().bindTexture(TEX_BG); + drawTexturedModalRect(offsetX, offsetY, 0, 0, 176, ySize); + } + + @Override + public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { + fontRendererObj.drawString(getGuiDisplayName(I18n.format(NameConst.GUI_FLUID_AUTO_FILLER)), 8, 6, 0x404040); + fontRendererObj.drawString(GuiText.inventory.getLocal(), 8, ySize - 94, 0x404040); + } +} diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java new file mode 100644 index 00000000..b36d6cab --- /dev/null +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java @@ -0,0 +1,54 @@ +package com.glodblock.github.client.gui.container; + +import appeng.container.AEBaseContainer; +import appeng.container.slot.SlotFake; +import com.glodblock.github.common.tile.TileFluidAutoFiller; +import com.glodblock.github.util.Util; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import org.apache.commons.lang3.tuple.MutablePair; + +public class ContainerFluidAutoFiller extends AEBaseContainer { + public static class FakeSlot extends SlotFake { + public FakeSlot(IInventory inv, int idx, int x, int y) { + super(inv, idx, x, y); + } + + @Override + public void putStack(ItemStack is) { + MutablePair result = ContainerFluidAutoFiller.isItemValid(is); + if (result.left) { + if (super.getHasStack()) super.clearStack(); + super.putStack(result.right); + } + } + } + + private final TileFluidAutoFiller tile; + + public ContainerFluidAutoFiller(InventoryPlayer ipl, TileFluidAutoFiller tile) { + super(ipl, tile); + this.tile = tile; + addSlotToContainer(new FakeSlot(tile.getInventory(), 0, 80, 35)); + bindPlayerInventory(ipl, 0, 84); + } + + public static MutablePair isItemValid(ItemStack itemStack) { + boolean result = Util.FluidUtil.isFluidContainer(itemStack); + if (!result) return new MutablePair<>(false, null); + ItemStack tank = itemStack.copy(); + tank.stackSize = 1; + if (Util.FluidUtil.isFilled(tank)) { + return new MutablePair<>(true, Util.FluidUtil.clearFluid(tank)); + } else { + return new MutablePair<>(true, tank); + } + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + tile.updatePattern(); + } +} diff --git a/src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java b/src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java new file mode 100644 index 00000000..4ceabaf2 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java @@ -0,0 +1,62 @@ +package com.glodblock.github.common.block; + +import appeng.api.config.SecurityPermissions; +import appeng.util.Platform; +import com.glodblock.github.common.item.FCBaseItemBlock; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.common.tile.TileFluidAutoFiller; +import com.glodblock.github.inventory.InventoryHandler; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.util.BlockPos; +import com.glodblock.github.util.NameConst; +import com.glodblock.github.util.Util; +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockFluidAutoFiller extends FCBaseBlock { + + public BlockFluidAutoFiller() { + super(Material.iron, NameConst.BLOCK_FLUID_AUTO_FILLER); + setTileEntity(TileFluidAutoFiller.class); + setFullBlock(false); + setOpaque(false); + this.lightOpacity = 3; + } + + @Override + public BlockFluidAutoFiller register() { + GameRegistry.registerBlock(this, FCBaseItemBlock.class, NameConst.BLOCK_FLUID_AUTO_FILLER); + GameRegistry.registerTileEntity(TileFluidAutoFiller.class, NameConst.BLOCK_FLUID_AUTO_FILLER); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + @Override + public boolean onActivated( + World world, int x, int y, int z, EntityPlayer player, int facing, float hitX, float hitY, float hitZ) { + if (player.isSneaking()) { + return false; + } + TileFluidAutoFiller tile = getTileEntity(world, x, y, z); + if (tile != null) { + if (Platform.isServer()) { + if (Util.hasPermission(player, SecurityPermissions.INJECT, tile)) { + InventoryHandler.openGui( + player, + world, + new BlockPos(x, y, z), + ForgeDirection.getOrientation(facing), + GuiType.FLUID_AUTO_FILLER); + } else { + player.addChatComponentMessage(new ChatComponentText("You don't have permission to view.")); + } + } + return true; + } + return false; + } +} diff --git a/src/main/java/com/glodblock/github/common/item/ItemPartFluidTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemPartFluidTerminal.java index f164d370..1b975475 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemPartFluidTerminal.java +++ b/src/main/java/com/glodblock/github/common/item/ItemPartFluidTerminal.java @@ -16,7 +16,6 @@ import javax.annotation.Nullable; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; public class ItemPartFluidTerminal extends FCBaseItem implements IPartItem { @@ -50,8 +49,12 @@ public class ItemPartFluidTerminal extends FCBaseItem implements IPartItem { @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean flag) { - if (isShiftKeyDown()) tooltip.add(StatCollector.translateToLocalFormatted(NameConst.TT_FLUID_TERMINAL)); + public void addInformation(ItemStack stack, EntityPlayer player, List toolTip, boolean flag) { + if (isShiftKeyDown()) { + toolTip.add(NameConst.i18n(NameConst.TT_FLUID_TERMINAL)); + } else { + toolTip.add(NameConst.i18n(NameConst.TT_SHIFT_FOR_MORE)); + } } @Override diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java new file mode 100644 index 00000000..49b60c22 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java @@ -0,0 +1,292 @@ +package com.glodblock.github.common.tile; + +import static com.glodblock.github.loader.RecipeLoader.BUCKET; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.implementations.ICraftingPatternItem; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.networking.crafting.ICraftingProviderHelper; +import appeng.api.networking.events.MENetworkBootingStatusChange; +import appeng.api.networking.events.MENetworkCraftingPatternChange; +import appeng.api.networking.events.MENetworkEventSubscribe; +import appeng.api.networking.events.MENetworkPowerStatusChange; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; +import appeng.api.networking.storage.IBaseMonitor; +import appeng.api.networking.storage.IStorageGrid; +import appeng.api.networking.ticking.IGridTickable; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.api.networking.ticking.TickingRequest; +import appeng.api.storage.IMEMonitorHandlerReceiver; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import appeng.api.util.AECableType; +import appeng.api.util.DimensionalCoord; +import appeng.helpers.Reflected; +import appeng.me.GridAccessException; +import appeng.tile.TileEvent; +import appeng.tile.events.TileEventType; +import appeng.tile.grid.AENetworkInvTile; +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.tile.inventory.InvOperation; +import com.glodblock.github.common.item.ItemFluidDrop; +import com.glodblock.github.util.Util; +import javax.annotation.Nonnull; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import org.apache.commons.lang3.tuple.MutablePair; + +public class TileFluidAutoFiller extends AENetworkInvTile + implements ICraftingProvider, IMEMonitorHandlerReceiver, IGridTickable { + private final AppEngInternalInventory inventory = new AppEngInternalInventory(this, 1); + private final BaseActionSource source = new MachineSource(this); + private IItemList fluids = AEApi.instance().storage().createFluidList(); + public ItemStack containerItem; + private final Item encodedPattern = + AEApi.instance().definitions().items().encodedPattern().maybeItem().orNull(); + private IAEItemStack returnStack; + private boolean isPowered; + + public IInventory getInventory() { + return inventory; + } + + @Reflected + public TileFluidAutoFiller() { + getProxy().setIdlePowerUsage(1D); + getProxy().setFlags(GridFlags.REQUIRE_CHANNEL); + inventory.setInventorySlotContents(0, BUCKET); + this.containerItem = getInventory().getStackInSlot(0); + } + + @Override + public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) {} + + @Override + public int[] getAccessibleSlotsBySide(ForgeDirection whichSide) { + return new int[0]; + } + + @Override + public boolean canBeRotated() { + return false; + } + + public void updatePattern() { + ItemStack is = inventory.getStackInSlot(0); + if (is == null || this.containerItem.isItemEqual(is)) return; + this.containerItem = is; + postEvent(); + } + + @TileEvent(TileEventType.WORLD_NBT_READ) + public void readFromNBTEvent(NBTTagCompound data) { + inventory.readFromNBT(data, "Inv"); + } + + @TileEvent(TileEventType.WORLD_NBT_WRITE) + public NBTTagCompound writeToNBTEvent(NBTTagCompound data) { + inventory.writeToNBT(data, "Inv"); + return data; + } + + @Nonnull + @Override + public IInventory getInternalInventory() { + return inventory; + } + + @Override + public DimensionalCoord getLocation() { + return new DimensionalCoord(this); + } + + @Override + public AECableType getCableConnectionType(ForgeDirection dir) { + return AECableType.DENSE; + } + + private IStorageGrid getStorageGrid() { + try { + return this.getProxy().getGrid().getCache(IStorageGrid.class); + } catch (GridAccessException e) { + return null; + } + } + + @Override + public void provideCrafting(ICraftingProviderHelper craftingTracker) { + IStorageGrid storage = getStorageGrid(); + if (storage == null) return; + IItemList fluidStorage = + this.fluids.isEmpty() ? storage.getFluidInventory().getStorageList() : this.fluids; + for (IAEFluidStack fluidStack : fluidStorage) { + Fluid fluid = fluidStack.getFluid(); + if (fluid == null) continue; + int maxCapacity = Util.FluidUtil.getCapacity(this.containerItem, fluid); + if (maxCapacity == 0) continue; + MutablePair filled = + Util.FluidUtil.fillStack(this.containerItem.copy(), new FluidStack(fluid, maxCapacity)); + if (filled.right == null) continue; + ItemStack pattern = getPattern(this.containerItem, filled.right); + ICraftingPatternItem patter = (ICraftingPatternItem) pattern.getItem(); + craftingTracker.addCraftingOption(this, patter.getPatternForItem(pattern, getWorldObj())); + } + } + + private ItemStack getPattern(ItemStack emptyContainer, ItemStack filledContainer) { + NBTTagList in = new NBTTagList(); + NBTTagList out = new NBTTagList(); + in.appendTag(emptyContainer.writeToNBT(new NBTTagCompound())); + ItemStack fluidDrop = ItemFluidDrop.newStack(Util.FluidUtil.getFluidFromContainer(filledContainer)); + in.appendTag(createItemTag(fluidDrop)); + out.appendTag(filledContainer.writeToNBT(new NBTTagCompound())); + NBTTagCompound itemTag = new NBTTagCompound(); + itemTag.setTag("in", in); + itemTag.setTag("out", out); + itemTag.setBoolean("crafting", false); + ItemStack pattern = new ItemStack(this.encodedPattern); + pattern.setTagCompound(itemTag); + return pattern; + } + + protected NBTBase createItemTag(final ItemStack i) { + final NBTTagCompound c = new NBTTagCompound(); + if (i != null) { + i.writeToNBT(c); + c.setInteger("Count", i.stackSize); + } + return c; + } + + @Override + public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table) { + this.returnStack = + AEApi.instance().storage().createItemStack(patternDetails.getCondensedOutputs()[0].getItemStack()); + try { + this.getProxy().getTick().alertDevice(this.getProxy().getNode()); + } catch (GridAccessException ignored) { + + } + return true; + } + + @Override + public boolean isBusy() { + return this.returnStack != null; + } + + @Override + public boolean isValid(Object verificationToken) { + return true; + } + + @Override + public void postChange( + IBaseMonitor monitor, Iterable change, BaseActionSource source) { + if (this.getProxy().isActive() && this.getStorageGrid() != null) { + boolean hasChanged = false; + IItemList stored = this.getStorageGrid() + .getFluidInventory() + .getAvailableItems(AEApi.instance().storage().createFluidList()); + for (IAEFluidStack tmp : change) { + if (stored.findPrecise(tmp) == null || this.fluids.findPrecise(tmp) == null) { + hasChanged = true; + this.fluids = stored; + break; + } + } + if (hasChanged) postEvent(); + } + } + + private boolean postEvent() { + try { + this.getProxy() + .getGrid() + .postEvent(new MENetworkCraftingPatternChange(this, getGridNode(ForgeDirection.UNKNOWN))); + return true; + } catch (GridAccessException ignored) { + return false; + } + } + + @Override + public void onListUpdate() {} + + @MENetworkEventSubscribe + public void stateChange(final MENetworkPowerStatusChange p) { + this.updatePowerState(); + } + + @MENetworkEventSubscribe + public final void bootingRender(final MENetworkBootingStatusChange c) { + this.updatePowerState(); + } + + private void updatePowerState() { + boolean newState = false; + try { + newState = this.getProxy().isActive() + && this.getProxy().getEnergy().extractAEPower(1, Actionable.SIMULATE, PowerMultiplier.CONFIG) + > 0.0001; + if (newState != this.isPowered && newState) { + this.getProxy().getStorage().getFluidInventory().addListener(this, null); + } + } catch (final GridAccessException ignored) { + } + if (newState != this.isPowered) { + this.isPowered = newState; + this.markForUpdate(); + } + } + + @Override + public void gridChanged() { + try { + this.getProxy().getStorage().getFluidInventory().removeListener(this); + } catch (final GridAccessException ignored) { + } + super.gridChanged(); + } + + @Override + public TickingRequest getTickingRequest(IGridNode node) { + return new TickingRequest(1, 5, this.returnStack == null, true); + } + + @Override + public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) { + if (this.getStorageGrid() == null) { + return TickRateModulation.SLOWER; + } + IAEItemStack nodAdded = + getStorageGrid().getItemInventory().injectItems(this.returnStack, Actionable.SIMULATE, this.source); + if (nodAdded == null) { + getStorageGrid().getItemInventory().injectItems(this.returnStack, Actionable.MODULATE, this.source); + this.returnStack = null; + return TickRateModulation.SLEEP; + } else { + return TickRateModulation.SLOWER; + } + } + + @Override + public boolean dropItems() { + return false; + } +} diff --git a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java index 196c7735..625218cc 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java @@ -20,6 +20,17 @@ import javax.annotation.Nullable; import net.minecraft.entity.player.EntityPlayer; public enum GuiType { + FLUID_AUTO_FILLER(new TileGuiFactory(TileFluidAutoFiller.class) { + @Override + protected Object createServerGui(EntityPlayer player, TileFluidAutoFiller inv) { + return new ContainerFluidAutoFiller(player.inventory, inv); + } + + @Override + protected Object createClientGui(EntityPlayer player, TileFluidAutoFiller inv) { + return new GuiFluidAutoFiller(player.inventory, inv); + } + }), FLUID_LEVEL_EMITTER(new PartGuiFactory(PartFluidLevelEmitter.class) { @Override protected Object createServerGui(EntityPlayer player, PartFluidLevelEmitter inv) { diff --git a/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java b/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java index 26c066dd..ec81c5e1 100644 --- a/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java +++ b/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java @@ -1,23 +1,72 @@ package com.glodblock.github.inventory.slot; import appeng.container.slot.SlotRestrictedInput; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import org.apache.commons.lang3.tuple.MutablePair; public class FCSlotRestrictedInput extends SlotRestrictedInput { - private ItemStack valid; + + @FunctionalInterface + public interface Filter { + MutablePair isItemValid(final ItemStack inputItem); + } + + private final Filter filter; + private final InventoryPlayer p; + private ItemStack validItem = null; public FCSlotRestrictedInput(ItemStack valid, IInventory i, int slotIndex, int x, int y, InventoryPlayer p) { + this( + (inputItem) -> new MutablePair<>( + valid.getItem() + .getClass() + .isAssignableFrom(inputItem.getItem().getClass()), + valid), + i, + slotIndex, + x, + y, + p); + this.validItem = valid; + } + + public FCSlotRestrictedInput(Filter filter, IInventory i, int slotIndex, int x, int y, InventoryPlayer p) { super(PlacableItemType.INSCRIBER_PLATE, i, slotIndex, x, y, p); - this.valid = valid; + this.filter = filter; + this.p = p; } @Override - public boolean isItemValid(final ItemStack i) { - if (i.getItem().getClass().isAssignableFrom(valid.getItem().getClass())) { - return true; + public boolean isItemValid(final ItemStack inputItem) { + MutablePair result = this.filter.isItemValid(inputItem); + return result.left; + } + + public boolean getAllowEdit() { + return super.canTakeStack(this.p.player); + } + + @Override + public boolean canTakeStack(final EntityPlayer par1EntityPlayer) { + return getAllowEdit(); + } + + @Override + public void onPickupFromSlot(final EntityPlayer p, final ItemStack i) { + if (getAllowEdit()) { + super.onPickupFromSlot(p, i); + } + } + + @Override + public int getIcon() { + if (validItem != null) { + return super.getIcon(); + } else { + return -1; } - return false; } } diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index a4ba903f..d06f374f 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -7,6 +7,7 @@ import com.glodblock.github.common.storage.CellType; public class ItemAndBlockHolder { + public static BlockFluidAutoFiller FLUID_AUTO_FILLER = new BlockFluidAutoFiller().register(); public static BlockFluidDiscretizer DISCRETIZER = new BlockFluidDiscretizer().register(); public static BlockLevelMaintainer LEVEL_MAINTAINER = new BlockLevelMaintainer().register(); public static BlockFluidPatternEncoder ENCODER = new BlockFluidPatternEncoder().register(); diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index 17270398..aed75184 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -13,6 +13,7 @@ public class NameConst { public static final String BLOCK_FLUID_INTERFACE = "fluid_interface"; public static final String BLOCK_INGREDIENT_BUFFER = "ingredient_buffer"; public static final String BLOCK_FLUID_BUFFER = "fluid_buffer"; + public static final String BLOCK_FLUID_AUTO_FILLER = "fluid_auto_filler"; public static final String BLOCK_LARGE_INGREDIENT_BUFFER = "large_ingredient_buffer"; public static final String BLOCK_OC_PATTERN_EDITOR = "oc_pattern_editor"; public static final String BLOCK_LEVEL_MAINTAINER = "level_maintainer"; @@ -81,6 +82,7 @@ public class NameConst { public static final String GUI_LEVEL_MAINTAINER = GUI_KEY + BLOCK_LEVEL_MAINTAINER; public static final String GUI_FLUID_PATTERN_ENCODER = GUI_KEY + BLOCK_FLUID_PATTERN_ENCODER; public static final String GUI_FLUID_PACKET_DECODER = GUI_KEY + BLOCK_FLUID_PACKET_DECODER; + public static final String GUI_FLUID_AUTO_FILLER = GUI_KEY + BLOCK_FLUID_AUTO_FILLER; public static final String GUI_INGREDIENT_BUFFER = GUI_KEY + BLOCK_INGREDIENT_BUFFER; public static final String GUI_LARGE_INGREDIENT_BUFFER = GUI_KEY + BLOCK_LARGE_INGREDIENT_BUFFER; public static final String GUI_FLUID_INTERFACE = GUI_KEY + BLOCK_FLUID_INTERFACE; diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index b7c32bd2..71d753ab 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -36,6 +36,7 @@ tile.oc_pattern_editor.name=OC Pattern Editor tile.level_maintainer.name=ME Level Maintainer tile.fluid_buffer.name=ME Fluid Buffer tile.walrus.name=Walrus +tile.fluid_auto_filler.name=ME Fluid Auto Filler ae2fc.waila.speed=Speed ae2fc.waila.enable=Enable @@ -106,6 +107,7 @@ ae2fc.gui.part_fluid_import=ME Fluid Import Bus ae2fc.gui.part_fluid_export=ME Fluid Export Bus ae2fc.gui.part_fluid_terminal=ME Fluid Terminal ae2fc.gui.part_fluid_storage_bus=ME Fluid Storage Bus +ae2fc.gui.fluid_auto_filler=ME Fluid Auto Filler error.unknown=Unknown diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index 30523cc2..9ed4a2a1 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -36,6 +36,7 @@ tile.oc_pattern_editor.name=OC样板编辑器 tile.level_maintainer.name=ME库存维持器 tile.fluid_buffer.name=ME流体缓存器 tile.walrus.name=海象 +tile.fluid_auto_filler.name=ME流体自动装填器 ae2fc.waila.speed=速度 ae2fc.waila.enable=启用 @@ -106,6 +107,7 @@ ae2fc.gui.part_fluid_import=ME流体输入总线 ae2fc.gui.part_fluid_export=ME流体输出总线 ae2fc.gui.part_fluid_terminal=流体终端 ae2fc.gui.part_fluid_storage_bus=ME流体存储总线 +ae2fc.gui.fluid_auto_filler=ME流体自动装填器 error.unknown=未知流体 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/fluid_auto_filler.png b/src/main/resources/assets/ae2fc/textures/blocks/fluid_auto_filler.png new file mode 100644 index 0000000000000000000000000000000000000000..c66ff872c62124a8ddd3f6b72f473955f4cb69a8 GIT binary patch literal 995 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR=jj9BQ6?`}gnP=4-bd z9UX0LZ6%G0<;@FZ^&({~E2WGo-v(r48bg&0{5Xs%7~iJIl9Ua?WsO6X^h1OdLlg`G z74!mt&KL!wAu!+}P?2L&33S9fPZ!6Kin!eVlYEB^cwCPAH3V@ebTu&l|DWx_v66jP zr;eIl5NpTBqm_?Uk{`HFc^#b8_%%6a?Jh_47IpiH5)-DL5}*F;$+@l7O{E62LYgPJ z^RqS_TyuA6No$6`N}Z&^jk3!VH4+{=PdvGgbK<@5u#(ROe*^cQTW~}v=lRtO#eEAG zH1FP=Id`9}+xAQ@w?dztNzW#Eb&34b`Cb~dmq9hvc+tdO({G^Q@^tlcS?83{1OS3v Bd?5e; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/gui/fluid_auto_filler.png b/src/main/resources/assets/ae2fc/textures/gui/fluid_auto_filler.png new file mode 100644 index 0000000000000000000000000000000000000000..390a3dba10c3e0a7172381e7ff6247d36bc86bf8 GIT binary patch literal 1237 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5C#Tjh5(-sS0EP%%+1Y1Lqof} zyN?|^_W%EXh~OwW8Un*U1d^tF&INjsu_VYZn8D%MjWiG^$=lt9p@UV{1IXbl@Q5sC zVBk9l!i+m6X1@grvX^-Jy0YJA{*@Hhmn+*tcx zd3)^Rm0Os0*VTU!_|WVi5a{y6&ehfOn{u1 Date: Sun, 29 Jan 2023 14:21:56 +0800 Subject: [PATCH 2/9] add certus quartz tank --- .../render/ItemCertusQuartzTankRender.java | 27 +++ .../common/block/BlockCertusQuartzTank.java | 164 +++++++++++++++++ .../common/item/ItemCertusQuartzTank.java | 174 ++++++++++++++++++ .../common/tile/TileCertusQuartzTank.java | 37 ++++ .../github/loader/ItemAndBlockHolder.java | 2 +- .../glodblock/github/loader/RecipeLoader.java | 3 + .../glodblock/github/loader/RenderLoader.java | 2 + .../com/glodblock/github/util/NameConst.java | 1 + .../resources/assets/ae2fc/lang/en_US.lang | 1 + .../resources/assets/ae2fc/lang/zh_CN.lang | 1 + .../blocks/certus_quartz_tank/bottom.png | Bin 0 -> 238 bytes .../blocks/certus_quartz_tank/side.png | Bin 0 -> 141 bytes .../certus_quartz_tank/side_stacked.png | Bin 0 -> 141 bytes .../blocks/certus_quartz_tank/top.png | Bin 0 -> 277 bytes 14 files changed, 411 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java create mode 100644 src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java create mode 100644 src/main/java/com/glodblock/github/common/item/ItemCertusQuartzTank.java create mode 100644 src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/bottom.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_stacked.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/top.png diff --git a/src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java b/src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java new file mode 100644 index 00000000..ba32fddd --- /dev/null +++ b/src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java @@ -0,0 +1,27 @@ +package com.glodblock.github.client.render; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +public class ItemCertusQuartzTankRender implements IItemRenderer { + + public ItemCertusQuartzTankRender() { + + // + // MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ItemAndBlockHolder.CERTUS_QUARTZ_TANK), + // this); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) {} +} diff --git a/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java b/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java new file mode 100644 index 00000000..02f62be3 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java @@ -0,0 +1,164 @@ +package com.glodblock.github.common.block; + +import appeng.api.implementations.items.IAEWrench; +import buildcraft.api.tools.IToolWrench; +import buildcraft.factory.BlockTank; +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.item.ItemCertusQuartzTank; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.common.tile.TileCertusQuartzTank; +import com.glodblock.github.loader.IRegister; +import com.glodblock.github.loader.ItemAndBlockHolder; +import com.glodblock.github.util.NameConst; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import extracells.tileentity.TileEntityCertusTank; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; + +public class BlockCertusQuartzTank extends BlockTank implements IRegister { + + private IIcon textureStackedSide; + + public BlockCertusQuartzTank() { + setBlockName(NameConst.BLOCK_CERTUS_QUARTZ_TANK); + setResistance(1.0F); + setHardness(0.5F); + setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 1.0F, 0.9375F); + } + + public ItemStack getDropWithNBT(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileCertusQuartzTank) { + ItemStack dropStack = new ItemStack(ItemAndBlockHolder.CERTUS_QUARTZ_TANK, 1); + ((TileCertusQuartzTank) te).writeToNBTWithoutCoords(nbt); + if (!nbt.getCompoundTag("tank").hasKey("Empty")) { + dropStack.setTagCompound(nbt); + } + + return dropStack; + } + return null; + } + + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileCertusQuartzTank(); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister par1IconRegister) { + super.registerBlockIcons(par1IconRegister); + textureStackedSide = par1IconRegister.registerIcon(FluidCraft.MODID + ":certus_quartz_tank/side_stacked"); + } + + @Override + public IIcon getIconAbsolute(IBlockAccess iblockaccess, int x, int y, int z, int side, int metadata) { + if (side >= 2 && (iblockaccess.getBlock(x, y - 1, z) instanceof BlockCertusQuartzTank)) { + return textureStackedSide; + } else { + return super.getIconAbsolute(side, metadata); + } + } + + @Override + public boolean onBlockActivated( + World worldObj, + int x, + int y, + int z, + EntityPlayer p, + int blockID, + float offsetX, + float offsetY, + float offsetZ) { + ItemStack current = p.inventory.getCurrentItem(); + + if (p.isSneaking() && current != null) { + try { + if (current.getItem() instanceof IToolWrench + && ((IToolWrench) current.getItem()).canWrench(p, x, y, z)) { + dropBlockAsItem(worldObj, x, y, z, getDropWithNBT(worldObj, x, y, z)); + worldObj.setBlockToAir(x, y, z); + ((IToolWrench) current.getItem()).wrenchUsed(p, x, y, z); + return true; + } + } catch (Throwable e) { + // No IToolWrench + } + if (current.getItem() instanceof IAEWrench + && ((IAEWrench) current.getItem()).canWrench(current, p, x, y, z)) { + dropBlockAsItem(worldObj, x, y, z, getDropWithNBT(worldObj, x, y, z)); + worldObj.setBlockToAir(x, y, z); + return true; + } + } + + if (current != null) { + FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(current); + TileEntityCertusTank tank = (TileEntityCertusTank) worldObj.getTileEntity(x, y, z); + + if (liquid != null) { + int amountFilled = tank.fill(ForgeDirection.UNKNOWN, liquid, true); + + if (amountFilled != 0 && !p.capabilities.isCreativeMode) { + if (current.stackSize > 1) { + p.inventory.mainInventory[p.inventory.currentItem].stackSize -= 1; + p.inventory.addItemStackToInventory(current.getItem().getContainerItem(current)); + } else { + p.inventory.mainInventory[p.inventory.currentItem] = + current.getItem().getContainerItem(current); + } + } + + return true; + + // Handle empty containers + } else { + + FluidStack available = tank.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid; + if (available != null) { + ItemStack filled = FluidContainerRegistry.fillFluidContainer(available, current); + + liquid = FluidContainerRegistry.getFluidForFilledItem(filled); + + if (liquid != null) { + tank.drain(ForgeDirection.UNKNOWN, liquid.amount, true); + if (!p.capabilities.isCreativeMode) { + if (current.stackSize == 1) { + p.inventory.mainInventory[p.inventory.currentItem] = filled; + } else { + p.inventory.mainInventory[p.inventory.currentItem].stackSize--; + if (!p.inventory.addItemStackToInventory(filled)) p.entityDropItem(filled, 0); + } + } + return true; + } + } + } + } + return false; + } + + @Override + public BlockCertusQuartzTank register() { + GameRegistry.registerBlock(this, ItemCertusQuartzTank.class, NameConst.BLOCK_CERTUS_QUARTZ_TANK); + GameRegistry.registerTileEntity(TileCertusQuartzTank.class, NameConst.BLOCK_CERTUS_QUARTZ_TANK); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + public ItemStack stack() { + return new ItemStack(this, 1); + } +} diff --git a/src/main/java/com/glodblock/github/common/item/ItemCertusQuartzTank.java b/src/main/java/com/glodblock/github/common/item/ItemCertusQuartzTank.java new file mode 100644 index 00000000..977bdbf5 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemCertusQuartzTank.java @@ -0,0 +1,174 @@ +package com.glodblock.github.common.item; + +import static com.glodblock.github.common.tile.TileCertusQuartzTank.CAPACITY; + +import com.glodblock.github.common.tile.TileCertusQuartzTank; +import com.glodblock.github.crossmod.waila.Tooltip; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; + +public class ItemCertusQuartzTank extends ItemBlock implements IFluidContainerItem { + private final String tagKey = "tank"; + + private final int capacity = CAPACITY; + + public ItemCertusQuartzTank(Block block) { + super(block); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { + if (stack != null && stack.hasTagCompound()) { + if (FluidStack.loadFluidStackFromNBT(stack.getTagCompound().getCompoundTag(tagKey)) != null) { + FluidStack fs = + FluidStack.loadFluidStackFromNBT(stack.getTagCompound().getCompoundTag(tagKey)); + list.add(Tooltip.fluidFormat(fs.getFluid().getLocalizedName(fs), fs.amount)); + } + } + } + + @Override + public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) { + if (container.stackTagCompound == null + || !container.stackTagCompound.hasKey(tagKey) + || container.stackTagCompound.getCompoundTag(tagKey).hasKey("Empty")) { + return null; + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag(tagKey)); + if (stack == null) { + return null; + } + + int currentAmount = stack.amount; + stack.amount = Math.min(stack.amount, maxDrain); + if (doDrain) { + if (currentAmount == stack.amount) { + container.stackTagCompound.removeTag(tagKey); + + if (container.stackTagCompound.hasNoTags()) { + container.stackTagCompound = null; + } + return stack; + } + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag(tagKey); + fluidTag.setInteger("Amount", currentAmount - stack.amount); + container.stackTagCompound.setTag(tagKey, fluidTag); + } + return stack; + } + + @Override + public int fill(ItemStack container, FluidStack resource, boolean doFill) { + if (resource == null) { + return 0; + } + + if (!doFill) { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey(tagKey)) { + return Math.min(this.capacity, resource.amount); + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag(tagKey)); + + if (stack == null) { + return Math.min(this.capacity, resource.amount); + } + + if (!stack.isFluidEqual(resource)) { + return 0; + } + + return Math.min(this.capacity - stack.amount, resource.amount); + } + + if (container.stackTagCompound == null) { + container.stackTagCompound = new NBTTagCompound(); + } + + if (!container.stackTagCompound.hasKey(tagKey) + || container.stackTagCompound.getCompoundTag(tagKey).hasKey("Empty")) { + NBTTagCompound fluidTag = resource.writeToNBT(new NBTTagCompound()); + + if (this.capacity < resource.amount) { + fluidTag.setInteger("Amount", this.capacity); + container.stackTagCompound.setTag(tagKey, fluidTag); + return this.capacity; + } + + container.stackTagCompound.setTag(tagKey, fluidTag); + return resource.amount; + } + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag(tagKey); + FluidStack stack = FluidStack.loadFluidStackFromNBT(fluidTag); + + if (!stack.isFluidEqual(resource)) { + return 0; + } + + int filled = this.capacity - stack.amount; + if (resource.amount < filled) { + stack.amount += resource.amount; + filled = resource.amount; + } else { + stack.amount = this.capacity; + } + + container.stackTagCompound.setTag(tagKey, stack.writeToNBT(fluidTag)); + return filled; + } + + @Override + public int getCapacity(ItemStack container) { + return this.capacity; + } + + @Override + public FluidStack getFluid(ItemStack container) { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey(tagKey)) { + return null; + } + return FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag(tagKey)); + } + + @Override + public boolean placeBlockAt( + ItemStack stack, + EntityPlayer player, + World world, + int x, + int y, + int z, + int side, + float hitX, + float hitY, + float hitZ, + int metadata) { + if (!world.setBlock(x, y, z, this.field_150939_a, metadata, 3)) { + return false; + } + + if (world.getBlock(x, y, z) == this.field_150939_a) { + this.field_150939_a.onBlockPlacedBy(world, x, y, z, player, stack); + this.field_150939_a.onPostBlockPlaced(world, x, y, z, metadata); + } + + if (stack != null && stack.hasTagCompound()) { + ((TileCertusQuartzTank) world.getTileEntity(x, y, z)).readFromNBTWithoutCoords(stack.getTagCompound()); + } + return true; + } +} diff --git a/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java b/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java new file mode 100644 index 00000000..a9eaecb0 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java @@ -0,0 +1,37 @@ +package com.glodblock.github.common.tile; + +import buildcraft.factory.TileTank; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.FluidContainerRegistry; + +public class TileCertusQuartzTank extends TileTank { + public static final int CAPACITY = FluidContainerRegistry.BUCKET_VOLUME * 32; + + public TileCertusQuartzTank() { + super(); + this.setCapacity(); + } + + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + readFromNBTWithoutCoords(data); + this.setCapacity(); + } + + public void readFromNBTWithoutCoords(NBTTagCompound tag) { + this.tank.readFromNBT(tag); + } + + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + writeToNBTWithoutCoords(data); + } + + public void setCapacity() { + this.tank.setCapacity(CAPACITY); + } + + public void writeToNBTWithoutCoords(NBTTagCompound tag) { + this.tank.writeToNBT(tag); + } +} diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index d06f374f..b60839f4 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -6,7 +6,7 @@ import com.glodblock.github.common.item.*; import com.glodblock.github.common.storage.CellType; public class ItemAndBlockHolder { - + public static BlockCertusQuartzTank CERTUS_QUARTZ_TANK = new BlockCertusQuartzTank().register(); public static BlockFluidAutoFiller FLUID_AUTO_FILLER = new BlockFluidAutoFiller().register(); public static BlockFluidDiscretizer DISCRETIZER = new BlockFluidDiscretizer().register(); public static BlockLevelMaintainer LEVEL_MAINTAINER = new BlockLevelMaintainer().register(); diff --git a/src/main/java/com/glodblock/github/loader/RecipeLoader.java b/src/main/java/com/glodblock/github/loader/RecipeLoader.java index 88a3b45f..bbdf7fa3 100644 --- a/src/main/java/com/glodblock/github/loader/RecipeLoader.java +++ b/src/main/java/com/glodblock/github/loader/RecipeLoader.java @@ -81,6 +81,9 @@ public class RecipeLoader implements Runnable { AE2_INTERFACE)); GameRegistry.addShapelessRecipe(FLUID_INTERFACE.stack(), INTERFACE.stack()); GameRegistry.addShapelessRecipe(INTERFACE.stack(), FLUID_INTERFACE.stack()); + GameRegistry.addRecipe( + new ShapedOreRecipe(CERTUS_QUARTZ_TANK.stack(), "GGG", "G G", "GGG", 'G', AE2_QUARTZ_GLASS)); + GameRegistry.addShapelessRecipe(FLUID_AUTO_FILLER.stack(), FLUID_TERMINAL, ENCODER); GameRegistry.addRecipe(new ShapedOreRecipe( DISCRETIZER.stack(), "IPI", diff --git a/src/main/java/com/glodblock/github/loader/RenderLoader.java b/src/main/java/com/glodblock/github/loader/RenderLoader.java index 02725842..125dc248 100644 --- a/src/main/java/com/glodblock/github/loader/RenderLoader.java +++ b/src/main/java/com/glodblock/github/loader/RenderLoader.java @@ -1,5 +1,6 @@ package com.glodblock.github.loader; +import com.glodblock.github.client.render.ItemCertusQuartzTankRender; import com.glodblock.github.client.render.ItemDropRender; import com.glodblock.github.client.render.ItemPacketRender; import com.glodblock.github.client.render.ItemWalrusRender; @@ -11,5 +12,6 @@ public class RenderLoader implements Runnable { new ItemDropRender(); new ItemPacketRender(); new ItemWalrusRender(); + new ItemCertusQuartzTankRender(); } } diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index aed75184..48d6aa1e 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -7,6 +7,7 @@ import net.minecraft.util.StatCollector; public class NameConst { + public static final String BLOCK_CERTUS_QUARTZ_TANK = "certus_quartz_tank"; public static final String BLOCK_FLUID_DISCRETIZER = "fluid_discretizer"; public static final String BLOCK_FLUID_PATTERN_ENCODER = "fluid_pattern_encoder"; public static final String BLOCK_FLUID_PACKET_DECODER = "fluid_packet_decoder"; diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 71d753ab..06881d12 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -37,6 +37,7 @@ tile.level_maintainer.name=ME Level Maintainer tile.fluid_buffer.name=ME Fluid Buffer tile.walrus.name=Walrus tile.fluid_auto_filler.name=ME Fluid Auto Filler +tile.certus_quartz_tank.name=Certus Quartz Tank ae2fc.waila.speed=Speed ae2fc.waila.enable=Enable diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index 9ed4a2a1..bdb6bb67 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -37,6 +37,7 @@ tile.level_maintainer.name=ME库存维持器 tile.fluid_buffer.name=ME流体缓存器 tile.walrus.name=海象 tile.fluid_auto_filler.name=ME流体自动装填器 +tile.certus_quartz_tank.name=赛特斯石英水槽 ae2fc.waila.speed=速度 ae2fc.waila.enable=启用 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/bottom.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..68881f617bac173ca355b80b89841221977987ac GIT binary patch literal 238 zcmVt!1D2JKU^P-0kRpSd4`3~0el8zoVdck^!qQI&xF^#M1WBPsA&Kr za-5O?;ClYCu`w|G{b!JK;tInbJo*_KnGOE2FvIz91Ag-hF|d7n*Z==7BLfoy?yLdQ o{D)r{(}24vkhD!-z`(!&0BqSc7;Uo5@&Et;07*qoM6N<$f+s9z82|tP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8bd0e6036bd23f4279bffb87c81cec3132cfb5 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr`&KDG3P)1qB5^&O5MK z6g*&1=JvV$@9%F(Ps2kOFAC;p3i~X0eCcjpl4_JaG*JKm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_stacked.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_stacked.png new file mode 100644 index 0000000000000000000000000000000000000000..804526ef48f50f9ec8be77ea7c83231c141d12a7 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr`&KDG3P)1qB5^&O5MK z6g*&1=JvV$@9%F(Ps2kOFAC;p3i~X0eCcjpl4ESDHm31f-O(EQ>YObq%dGn&y7t9)QfA=fSpZ7EqQY z(lkX?RXl+HOy6v`IM=j8i*EFK=K@+Tb2UQ8d`} bI{~-=ako_fSlDAj00000NkvXXu0mjfjxKko literal 0 HcmV?d00001 From 99f8e980178b64fc6aca7015fe115a4906cc1099 Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Sun, 29 Jan 2023 16:30:27 +0800 Subject: [PATCH 3/9] spotless apply --- .../github/client/gui/GuiFluidAutoFiller.java | 15 ++-- .../client/gui/base/FCGuiEncodeTerminal.java | 2 +- .../container/ContainerFluidAutoFiller.java | 13 ++- .../common/block/BlockCertusQuartzTank.java | 48 +++++----- .../common/block/BlockFluidAutoFiller.java | 16 ++-- .../common/item/ItemCertusQuartzTank.java | 34 +++---- .../parts/base/FCFluidEncodeTerminal.java | 33 +++++++ .../common/tile/TileCertusQuartzTank.java | 4 +- .../common/tile/TileFluidAutoFiller.java | 64 ++++++------- .../github/inventory/gui/GuiType.java | 1 + .../inventory/slot/FCSlotRestrictedInput.java | 7 +- .../github/loader/ItemAndBlockHolder.java | 1 + .../glodblock/github/loader/RecipeLoader.java | 89 ++++++++++--------- .../network/CPacketFluidPatternTermBtns.java | 10 ++- 14 files changed, 190 insertions(+), 147 deletions(-) diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java index 8368eb05..8b5ac201 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidAutoFiller.java @@ -1,17 +1,20 @@ package com.glodblock.github.client.gui; -import appeng.client.gui.AEBaseMEGui; -import appeng.core.localization.GuiText; -import com.glodblock.github.FluidCraft; -import com.glodblock.github.client.gui.container.ContainerFluidAutoFiller; -import com.glodblock.github.common.tile.TileFluidAutoFiller; -import com.glodblock.github.util.NameConst; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; +import appeng.client.gui.AEBaseMEGui; +import appeng.core.localization.GuiText; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.client.gui.container.ContainerFluidAutoFiller; +import com.glodblock.github.common.tile.TileFluidAutoFiller; +import com.glodblock.github.util.NameConst; + public class GuiFluidAutoFiller extends AEBaseMEGui { + protected EntityPlayer player; private static final ResourceLocation TEX_BG = FluidCraft.resource("textures/gui/fluid_auto_filler.png"); diff --git a/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java b/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java index 289afee7..2815f3d0 100644 --- a/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java +++ b/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java @@ -88,7 +88,7 @@ public abstract class FCGuiEncodeTerminal extends GuiItemMonitor { FluidCraft.proxy.netHandler.sendToServer( new CPacketFluidPatternTermBtns( "PatternTerminal.Prioritize", - container.prioritize ? PRIORITY_DISABLE : PRIORITY_ENABLE)); + isShiftKeyDown() ? "2" : (container.prioritize ? PRIORITY_DISABLE : PRIORITY_ENABLE))); } else if (this.invertBtn == btn) { FluidCraft.proxy.netHandler.sendToServer( new CPacketFluidPatternTermBtns("PatternTerminal.Invert", container.inverted ? "0" : "1")); diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java index b36d6cab..a6b4f7f2 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidAutoFiller.java @@ -1,16 +1,21 @@ package com.glodblock.github.client.gui.container; -import appeng.container.AEBaseContainer; -import appeng.container.slot.SlotFake; -import com.glodblock.github.common.tile.TileFluidAutoFiller; -import com.glodblock.github.util.Util; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; + import org.apache.commons.lang3.tuple.MutablePair; +import appeng.container.AEBaseContainer; +import appeng.container.slot.SlotFake; + +import com.glodblock.github.common.tile.TileFluidAutoFiller; +import com.glodblock.github.util.Util; + public class ContainerFluidAutoFiller extends AEBaseContainer { + public static class FakeSlot extends SlotFake { + public FakeSlot(IInventory inv, int idx, int x, int y) { super(inv, idx, x, y); } diff --git a/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java b/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java index 02f62be3..c8a4b498 100644 --- a/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java +++ b/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java @@ -1,19 +1,5 @@ package com.glodblock.github.common.block; -import appeng.api.implementations.items.IAEWrench; -import buildcraft.api.tools.IToolWrench; -import buildcraft.factory.BlockTank; -import com.glodblock.github.FluidCraft; -import com.glodblock.github.common.item.ItemCertusQuartzTank; -import com.glodblock.github.common.tabs.FluidCraftingTabs; -import com.glodblock.github.common.tile.TileCertusQuartzTank; -import com.glodblock.github.loader.IRegister; -import com.glodblock.github.loader.ItemAndBlockHolder; -import com.glodblock.github.util.NameConst; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import extracells.tileentity.TileEntityCertusTank; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -26,6 +12,22 @@ import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; +import appeng.api.implementations.items.IAEWrench; +import buildcraft.api.tools.IToolWrench; +import buildcraft.factory.BlockTank; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.item.ItemCertusQuartzTank; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.common.tile.TileCertusQuartzTank; +import com.glodblock.github.loader.IRegister; +import com.glodblock.github.loader.ItemAndBlockHolder; +import com.glodblock.github.util.NameConst; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + public class BlockCertusQuartzTank extends BlockTank implements IRegister { private IIcon textureStackedSide; @@ -72,16 +74,8 @@ public class BlockCertusQuartzTank extends BlockTank implements IRegister items = new ArrayList(); + List fluids = new ArrayList(); + for (ItemStack is : this.crafting) { + if (is == null) continue; + if (is.getItem() instanceof ItemFluidPacket) { + fluids.add(is); + } else { + items.add(is); + } + } + if (this.prioritize) { + fluids.addAll(items); + items.clear(); + } else { + items.addAll(fluids); + fluids.clear(); + } + + for (int i = 0; i < this.crafting.getSizeInventory(); i++) { + if (this.crafting.getStackInSlot(i) == null) break; + if (items.isEmpty()) { + this.crafting.setInventorySlotContents(i, fluids.get(i)); + } else { + this.crafting.setInventorySlotContents(i, items.get(i)); + } + } + saveChanges(); + } } diff --git a/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java b/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java index a9eaecb0..7c48a9f2 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java +++ b/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java @@ -1,10 +1,12 @@ package com.glodblock.github.common.tile; -import buildcraft.factory.TileTank; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidContainerRegistry; +import buildcraft.factory.TileTank; + public class TileCertusQuartzTank extends TileTank { + public static final int CAPACITY = FluidContainerRegistry.BUCKET_VOLUME * 32; public TileCertusQuartzTank() { diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java index 49b60c22..e4340917 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java @@ -2,6 +2,21 @@ package com.glodblock.github.common.tile; import static com.glodblock.github.loader.RecipeLoader.BUCKET; +import javax.annotation.Nonnull; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.tuple.MutablePair; + import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; @@ -35,29 +50,18 @@ import appeng.tile.events.TileEventType; import appeng.tile.grid.AENetworkInvTile; import appeng.tile.inventory.AppEngInternalInventory; import appeng.tile.inventory.InvOperation; + import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.util.Util; -import javax.annotation.Nonnull; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import org.apache.commons.lang3.tuple.MutablePair; public class TileFluidAutoFiller extends AENetworkInvTile implements ICraftingProvider, IMEMonitorHandlerReceiver, IGridTickable { + private final AppEngInternalInventory inventory = new AppEngInternalInventory(this, 1); private final BaseActionSource source = new MachineSource(this); private IItemList fluids = AEApi.instance().storage().createFluidList(); public ItemStack containerItem; - private final Item encodedPattern = - AEApi.instance().definitions().items().encodedPattern().maybeItem().orNull(); + private final Item encodedPattern = AEApi.instance().definitions().items().encodedPattern().maybeItem().orNull(); private IAEItemStack returnStack; private boolean isPowered; @@ -132,15 +136,15 @@ public class TileFluidAutoFiller extends AENetworkInvTile public void provideCrafting(ICraftingProviderHelper craftingTracker) { IStorageGrid storage = getStorageGrid(); if (storage == null) return; - IItemList fluidStorage = - this.fluids.isEmpty() ? storage.getFluidInventory().getStorageList() : this.fluids; + IItemList fluidStorage = this.fluids.isEmpty() ? storage.getFluidInventory().getStorageList() + : this.fluids; for (IAEFluidStack fluidStack : fluidStorage) { Fluid fluid = fluidStack.getFluid(); if (fluid == null) continue; int maxCapacity = Util.FluidUtil.getCapacity(this.containerItem, fluid); if (maxCapacity == 0) continue; - MutablePair filled = - Util.FluidUtil.fillStack(this.containerItem.copy(), new FluidStack(fluid, maxCapacity)); + MutablePair filled = Util.FluidUtil + .fillStack(this.containerItem.copy(), new FluidStack(fluid, maxCapacity)); if (filled.right == null) continue; ItemStack pattern = getPattern(this.containerItem, filled.right); ICraftingPatternItem patter = (ICraftingPatternItem) pattern.getItem(); @@ -175,8 +179,8 @@ public class TileFluidAutoFiller extends AENetworkInvTile @Override public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table) { - this.returnStack = - AEApi.instance().storage().createItemStack(patternDetails.getCondensedOutputs()[0].getItemStack()); + this.returnStack = AEApi.instance().storage() + .createItemStack(patternDetails.getCondensedOutputs()[0].getItemStack()); try { this.getProxy().getTick().alertDevice(this.getProxy().getNode()); } catch (GridAccessException ignored) { @@ -196,12 +200,11 @@ public class TileFluidAutoFiller extends AENetworkInvTile } @Override - public void postChange( - IBaseMonitor monitor, Iterable change, BaseActionSource source) { + public void postChange(IBaseMonitor monitor, Iterable change, + BaseActionSource source) { if (this.getProxy().isActive() && this.getStorageGrid() != null) { boolean hasChanged = false; - IItemList stored = this.getStorageGrid() - .getFluidInventory() + IItemList stored = this.getStorageGrid().getFluidInventory() .getAvailableItems(AEApi.instance().storage().createFluidList()); for (IAEFluidStack tmp : change) { if (stored.findPrecise(tmp) == null || this.fluids.findPrecise(tmp) == null) { @@ -216,8 +219,7 @@ public class TileFluidAutoFiller extends AENetworkInvTile private boolean postEvent() { try { - this.getProxy() - .getGrid() + this.getProxy().getGrid() .postEvent(new MENetworkCraftingPatternChange(this, getGridNode(ForgeDirection.UNKNOWN))); return true; } catch (GridAccessException ignored) { @@ -247,8 +249,7 @@ public class TileFluidAutoFiller extends AENetworkInvTile if (newState != this.isPowered && newState) { this.getProxy().getStorage().getFluidInventory().addListener(this, null); } - } catch (final GridAccessException ignored) { - } + } catch (final GridAccessException ignored) {} if (newState != this.isPowered) { this.isPowered = newState; this.markForUpdate(); @@ -259,8 +260,7 @@ public class TileFluidAutoFiller extends AENetworkInvTile public void gridChanged() { try { this.getProxy().getStorage().getFluidInventory().removeListener(this); - } catch (final GridAccessException ignored) { - } + } catch (final GridAccessException ignored) {} super.gridChanged(); } @@ -274,8 +274,8 @@ public class TileFluidAutoFiller extends AENetworkInvTile if (this.getStorageGrid() == null) { return TickRateModulation.SLOWER; } - IAEItemStack nodAdded = - getStorageGrid().getItemInventory().injectItems(this.returnStack, Actionable.SIMULATE, this.source); + IAEItemStack nodAdded = getStorageGrid().getItemInventory() + .injectItems(this.returnStack, Actionable.SIMULATE, this.source); if (nodAdded == null) { getStorageGrid().getItemInventory().injectItems(this.returnStack, Actionable.MODULATE, this.source); this.returnStack = null; diff --git a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java index 774731e9..179eb0b2 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableList; public enum GuiType { FLUID_AUTO_FILLER(new TileGuiFactory(TileFluidAutoFiller.class) { + @Override protected Object createServerGui(EntityPlayer player, TileFluidAutoFiller inv) { return new ContainerFluidAutoFiller(player.inventory, inv); diff --git a/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java b/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java index f12906d7..eb75133a 100644 --- a/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java +++ b/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java @@ -1,10 +1,10 @@ package com.glodblock.github.inventory.slot; -import appeng.container.slot.SlotRestrictedInput; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; + import org.apache.commons.lang3.tuple.MutablePair; import appeng.container.slot.SlotRestrictedInput; @@ -13,6 +13,7 @@ public class FCSlotRestrictedInput extends SlotRestrictedInput { @FunctionalInterface public interface Filter { + MutablePair isItemValid(final ItemStack inputItem); } @@ -23,9 +24,7 @@ public class FCSlotRestrictedInput extends SlotRestrictedInput { public FCSlotRestrictedInput(ItemStack valid, IInventory i, int slotIndex, int x, int y, InventoryPlayer p) { this( (inputItem) -> new MutablePair<>( - valid.getItem() - .getClass() - .isAssignableFrom(inputItem.getItem().getClass()), + valid.getItem().getClass().isAssignableFrom(inputItem.getItem().getClass()), valid), i, slotIndex, diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index 42e91167..d9cb81c7 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -6,6 +6,7 @@ import com.glodblock.github.common.item.*; import com.glodblock.github.common.storage.CellType; public class ItemAndBlockHolder { + public static BlockCertusQuartzTank CERTUS_QUARTZ_TANK = new BlockCertusQuartzTank().register(); public static BlockFluidAutoFiller FLUID_AUTO_FILLER = new BlockFluidAutoFiller().register(); public static BlockFluidDiscretizer DISCRETIZER = new BlockFluidDiscretizer().register(); diff --git a/src/main/java/com/glodblock/github/loader/RecipeLoader.java b/src/main/java/com/glodblock/github/loader/RecipeLoader.java index b780e2dd..d25d751f 100644 --- a/src/main/java/com/glodblock/github/loader/RecipeLoader.java +++ b/src/main/java/com/glodblock/github/loader/RecipeLoader.java @@ -128,50 +128,53 @@ public class RecipeLoader implements Runnable { AE2_INTERFACE)); GameRegistry.addShapelessRecipe(FLUID_INTERFACE.stack(), INTERFACE.stack()); GameRegistry.addShapelessRecipe(INTERFACE.stack(), FLUID_INTERFACE.stack()); - GameRegistry.addRecipe( - new ShapedOreRecipe(CERTUS_QUARTZ_TANK.stack(), "GGG", "G G", "GGG", 'G', AE2_QUARTZ_GLASS)); + GameRegistry + .addRecipe(new ShapedOreRecipe(CERTUS_QUARTZ_TANK.stack(), "GGG", "G G", "GGG", 'G', AE2_QUARTZ_GLASS)); GameRegistry.addShapelessRecipe(FLUID_AUTO_FILLER.stack(), FLUID_TERMINAL, ENCODER); - GameRegistry.addRecipe(new ShapedOreRecipe( - DISCRETIZER.stack(), - "IPI", - "TMT", - "IPI", - 'I', - "ingotIron", - 'P', - AE2_PROCESS_ENG, - 'T', - AE2_STORAGE_BUS, - 'M', - AE2_CONDENSER)); - GameRegistry.addRecipe(new ShapedOreRecipe( - DECODER.stack(), - "IHI", - "CFC", - "IPI", - 'I', - "ingotIron", - 'H', - Blocks.hopper, - 'C', - AE2_GLASS_CABLE, - 'F', - INTERFACE, - 'P', - AE2_PROCESS_CAL)); - GameRegistry.addRecipe(new ShapedOreRecipe( - ENCODER.stack(), - "LPL", - "IWI", - "III", - 'I', - "ingotIron", - 'L', - "blockLapis", - 'P', - AE2_PROCESS_ENG, - 'W', - AE2_WORK_BENCH)); + GameRegistry.addRecipe( + new ShapedOreRecipe( + DISCRETIZER.stack(), + "IPI", + "TMT", + "IPI", + 'I', + "ingotIron", + 'P', + AE2_PROCESS_ENG, + 'T', + AE2_STORAGE_BUS, + 'M', + AE2_CONDENSER)); + GameRegistry.addRecipe( + new ShapedOreRecipe( + DECODER.stack(), + "IHI", + "CFC", + "IPI", + 'I', + "ingotIron", + 'H', + Blocks.hopper, + 'C', + AE2_GLASS_CABLE, + 'F', + INTERFACE, + 'P', + AE2_PROCESS_CAL)); + GameRegistry.addRecipe( + new ShapedOreRecipe( + ENCODER.stack(), + "LPL", + "IWI", + "III", + 'I', + "ingotIron", + 'L', + "blockLapis", + 'P', + AE2_PROCESS_ENG, + 'W', + AE2_WORK_BENCH)); GameRegistry.addShapelessRecipe(FLUID_STORAGE_BUS.stack(), FLUID_INTERFACE, STICKY_PISTON, PISTON); GameRegistry.addShapelessRecipe(FLUID_STORAGE_BUS.stack(), INTERFACE, STICKY_PISTON, PISTON); GameRegistry.addRecipe( diff --git a/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java b/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java index 7097f7d1..cb963008 100644 --- a/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java +++ b/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java @@ -106,7 +106,15 @@ public class CPacketFluidPatternTermBtns implements IMessage { cpt.getPatternTerminal().setActivePage(Integer.parseInt(Value)); break; case "PatternTerminal.Prioritize": - cpt.getPatternTerminal().setPrioritization(Value.equals("1")); + switch (Value) { + case "0": + case "1": + cpt.getPatternTerminal().setPrioritization(Value.equals("1")); + break; + case "2": + cpt.getPatternTerminal().sortCraftingItems(); + break; + } break; } } else if (Name.equals("Terminal.Cpu") && c instanceof ContainerFluidCraftConfirm) { From 482298021e92c0a6ee06041028c63317605ad397 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Mon, 30 Jan 2023 18:07:57 +0800 Subject: [PATCH 4/9] tank --- .gitignore | 1 + .../java/com/glodblock/github/FluidCraft.java | 2 +- .../render/ItemCertusQuartzTankRender.java | 90 +++++- .../client/render/ItemWalrusRender.java | 13 +- .../render/RenderBlockCertusQuartzTank.java | 54 ++++ .../client/render/tank/FluidTankRenderer.java | 121 ++++++++ .../client/render/tank/ModelCertusTank.java | 144 +++++++++ .../client/render/tank/RenderEntityBlock.java | 169 +++++++++++ .../common/block/BaseBlockContainer.java | 8 +- .../common/block/BlockCertusQuartzTank.java | 183 +++++++----- .../common/item/ItemCertusQuartzTank.java | 66 ++--- .../common/tile/TileCertusQuartzTank.java | 274 ++++++++++++++++-- .../github/loader/ChannelLoader.java | 12 + .../glodblock/github/util/FluidSorters.java | 36 +-- .../com/glodblock/github/util/RenderUtil.java | 7 + .../java/com/glodblock/github/util/Util.java | 4 + .../blocks/certus_quartz_tank/bottom.png | Bin 238 -> 297 bytes .../blocks/certus_quartz_tank/cube.png | Bin 0 -> 230 bytes .../blocks/certus_quartz_tank/map.png | Bin 0 -> 710 bytes .../blocks/certus_quartz_tank/side.png | Bin 141 -> 177 bytes .../blocks/certus_quartz_tank/side_bottom.png | Bin 0 -> 204 bytes .../blocks/certus_quartz_tank/side_mid.png | Bin 0 -> 182 bytes .../certus_quartz_tank/side_stacked.png | Bin 141 -> 0 bytes .../blocks/certus_quartz_tank/side_top.png | Bin 0 -> 189 bytes .../blocks/certus_quartz_tank/top.png | Bin 277 -> 329 bytes 25 files changed, 1010 insertions(+), 174 deletions(-) create mode 100644 src/main/java/com/glodblock/github/client/render/RenderBlockCertusQuartzTank.java create mode 100644 src/main/java/com/glodblock/github/client/render/tank/FluidTankRenderer.java create mode 100644 src/main/java/com/glodblock/github/client/render/tank/ModelCertusTank.java create mode 100644 src/main/java/com/glodblock/github/client/render/tank/RenderEntityBlock.java create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/cube.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/map.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_bottom.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_mid.png delete mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_stacked.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_top.png diff --git a/.gitignore b/.gitignore index 7e4570ab..39a19e4a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ out/ *.ipr *.iws run/ +build/ diff --git a/src/main/java/com/glodblock/github/FluidCraft.java b/src/main/java/com/glodblock/github/FluidCraft.java index 5c3061a6..8529c5d6 100644 --- a/src/main/java/com/glodblock/github/FluidCraft.java +++ b/src/main/java/com/glodblock/github/FluidCraft.java @@ -28,7 +28,7 @@ import cpw.mods.fml.common.network.NetworkRegistry; modid = FluidCraft.MODID, version = FluidCraft.VERSION, name = FluidCraft.MODNAME, - dependencies = "required-after:appliedenergistics2;after:waila") + dependencies = "required-after:appliedenergistics2;required-after:BuildCraft|Factory;required-after:CoFHCore;after:waila") public class FluidCraft { public static final String MODID = "GRADLETOKEN_MODID"; diff --git a/src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java b/src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java index ba32fddd..eaaa37c7 100644 --- a/src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java +++ b/src/main/java/com/glodblock/github/client/render/ItemCertusQuartzTankRender.java @@ -1,20 +1,38 @@ package com.glodblock.github.client.render; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import org.lwjgl.opengl.GL11; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.client.render.tank.ModelCertusTank; +import com.glodblock.github.common.tile.TileCertusQuartzTank; +import com.glodblock.github.loader.ItemAndBlockHolder; +import cpw.mods.fml.client.registry.ClientRegistry; public class ItemCertusQuartzTankRender implements IItemRenderer { - public ItemCertusQuartzTankRender() { + private final ModelCertusTank model = new ModelCertusTank(); - // - // MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ItemAndBlockHolder.CERTUS_QUARTZ_TANK), - // this); + public ItemCertusQuartzTankRender() { + ClientRegistry.bindTileEntitySpecialRenderer(TileCertusQuartzTank.class, new RenderBlockCertusQuartzTank()); + MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ItemAndBlockHolder.CERTUS_QUARTZ_TANK), this); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return true; + return type != ItemRenderType.EQUIPPED_FIRST_PERSON; } @Override @@ -23,5 +41,65 @@ public class ItemCertusQuartzTankRender implements IItemRenderer { } @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) {} + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Minecraft.getMinecraft().renderEngine + .bindTexture(FluidCraft.resource("textures/blocks/certus_quartz_tank/map.png")); + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + GL11.glScalef(1, -1, -1); + this.model.render(0.0625f); + GL11.glScalef(1, -1, 1); + this.model.render(0.0625f); + + if (item != null && item.hasTagCompound()) { + FluidStack storedFluid = FluidStack + .loadFluidStackFromNBT(item.getTagCompound().getCompoundTag("tileEntity")); + int tankCapacity = 32000; + + if (storedFluid != null && storedFluid.getFluid() != null) { + IIcon fluidIcon = storedFluid.getFluid().getIcon(); + if (fluidIcon == null) fluidIcon = FluidRegistry.LAVA.getIcon(); + Tessellator tessellator = Tessellator.instance; + RenderBlocks renderer = new RenderBlocks(); + GL11.glScalef(1, 1, -1); + renderer.setRenderBounds( + 0.08F, + 0.001F, + 0.08F, + 0.92F, + (float) storedFluid.amount / (float) tankCapacity * 0.999F, + 0.92F); + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + Block waterBlock = FluidRegistry.WATER.getBlock(); + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F( + (storedFluid.getFluid().getColor() >> 16 & 0xFF) / 255.0F, + (storedFluid.getFluid().getColor() >> 8 & 0xFF) / 255.0F, + (storedFluid.getFluid().getColor() & 0xFF) / 255.0F, + 1.0F); + tessellator.setNormal(0.0F, -1F, 0.0F); + renderer.renderFaceYNeg(waterBlock, 0.0D, 0.0D, 0.0D, fluidIcon); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(waterBlock, 0.0D, 0.0D, 0.0D, fluidIcon); + tessellator.setNormal(0.0F, 0.0F, -1F); + renderer.renderFaceZNeg(waterBlock, 0.0D, 0.0D, 0.0D, fluidIcon); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(waterBlock, 0.0D, 0.0D, 0.0D, fluidIcon); + tessellator.setNormal(-1F, 0.0F, 0.0F); + renderer.renderFaceXNeg(waterBlock, 0.0D, 0.0D, 0.0D, fluidIcon); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(waterBlock, 0.0D, 0.0D, 0.0D, fluidIcon); + tessellator.draw(); + } + } + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } } diff --git a/src/main/java/com/glodblock/github/client/render/ItemWalrusRender.java b/src/main/java/com/glodblock/github/client/render/ItemWalrusRender.java index bc09137e..6a6ff280 100644 --- a/src/main/java/com/glodblock/github/client/render/ItemWalrusRender.java +++ b/src/main/java/com/glodblock/github/client/render/ItemWalrusRender.java @@ -27,25 +27,19 @@ public class ItemWalrusRender implements IItemRenderer { } @Override - public boolean handleRenderType(ItemStack item, IItemRenderer.ItemRenderType type) { + public boolean handleRenderType(ItemStack item, ItemRenderType type) { return true; } @Override - public void renderItem(IItemRenderer.ItemRenderType type, ItemStack item, Object... data) { + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { Minecraft.getMinecraft().renderEngine.bindTexture(this.textureWalrus); GL11.glPushMatrix(); switch (type) { - case ENTITY: - break; - case EQUIPPED: - break; case EQUIPPED_FIRST_PERSON: GL11.glRotated(180, 0, 1, 0); GL11.glTranslatef(-1F, 0.5F, -0.5F); break; - case FIRST_PERSON_MAP: - break; case INVENTORY: GL11.glTranslatef(-0.5F, -0.5F, -0.1F); break; @@ -57,8 +51,7 @@ public class ItemWalrusRender implements IItemRenderer { } @Override - public boolean shouldUseRenderHelper(IItemRenderer.ItemRenderType type, ItemStack item, - IItemRenderer.ItemRendererHelper helper) { + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, IItemRenderer.ItemRendererHelper helper) { return true; } } diff --git a/src/main/java/com/glodblock/github/client/render/RenderBlockCertusQuartzTank.java b/src/main/java/com/glodblock/github/client/render/RenderBlockCertusQuartzTank.java new file mode 100644 index 00000000..77100c16 --- /dev/null +++ b/src/main/java/com/glodblock/github/client/render/RenderBlockCertusQuartzTank.java @@ -0,0 +1,54 @@ +package com.glodblock.github.client.render; + +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidStack; + +import org.lwjgl.opengl.GL11; + +import com.glodblock.github.client.render.tank.FluidTankRenderer; +import com.glodblock.github.common.tile.TileCertusQuartzTank; +import com.glodblock.github.util.RenderUtil; +import com.glodblock.github.util.Util; + +public class RenderBlockCertusQuartzTank extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float f) { + TileCertusQuartzTank tank = (TileCertusQuartzTank) tileentity; + + FluidStack liquid = tank.tank.getFluid(); + if (liquid == null || liquid.getFluid() == null || liquid.amount <= 0) { + return; + } + + int color = liquid.getFluid().getColor(liquid); + + int[] displayList = FluidTankRenderer.getFluidDisplayLists(liquid, tileentity.getWorldObj(), false); + if (displayList == null) { + return; + } + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + bindTexture(TextureMap.locationBlocksTexture); + RenderUtil.setGLColorFromInt(color); + + GL11.glTranslatef((float) x + 0.0625F, (float) y + 0.5F, (float) z + 0.0625F); + GL11.glScalef(0.875F, 0.99F, 0.875F); + GL11.glTranslatef(0, -0.5F, 0); + + int dl = (int) ((float) liquid.amount / (float) (tank.tank.getCapacity()) + * (FluidTankRenderer.DISPLAY_STAGES - 1)); + GL11.glCallList(displayList[Util.clamp(dl, 0, FluidTankRenderer.DISPLAY_STAGES - 1)]); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/glodblock/github/client/render/tank/FluidTankRenderer.java b/src/main/java/com/glodblock/github/client/render/tank/FluidTankRenderer.java new file mode 100644 index 00000000..baad1e66 --- /dev/null +++ b/src/main/java/com/glodblock/github/client/render/tank/FluidTankRenderer.java @@ -0,0 +1,121 @@ +package com.glodblock.github.client.render.tank; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.init.Blocks; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.lwjgl.opengl.GL11; + +import com.glodblock.github.util.RenderUtil; + +public class FluidTankRenderer { + + public static final int DISPLAY_STAGES = 100; + private static final Map flowingRenderCache = new HashMap<>(); + private static final Map stillRenderCache = new HashMap<>(); + private static final RenderEntityBlock.RenderInfo liquidBlock = new RenderEntityBlock.RenderInfo(); + + public static void onTextureReload() { + for (int[] ia : flowingRenderCache.values()) { + for (int i : ia) { + GL11.glDeleteLists(i, 1); + } + } + flowingRenderCache.clear(); + + for (int[] ia : stillRenderCache.values()) { + for (int i : ia) { + GL11.glDeleteLists(i, 1); + } + } + stillRenderCache.clear(); + } + + public static IIcon getFluidTexture(FluidStack fluidStack, boolean flowing) { + if (fluidStack == null) { + return null; + } + return getFluidTexture(fluidStack.getFluid(), flowing); + } + + public static IIcon getFluidTexture(Fluid fluid, boolean flowing) { + if (fluid == null) { + return null; + } + IIcon icon = flowing ? fluid.getFlowingIcon() : fluid.getStillIcon(); + if (icon == null) { + icon = ((TextureMap) Minecraft.getMinecraft().getTextureManager() + .getTexture(TextureMap.locationBlocksTexture)).getAtlasSprite("missingno"); + } + return icon; + } + + public static void setColorForFluidStack(FluidStack fluidstack) { + if (fluidstack == null) { + return; + } + int color = fluidstack.getFluid().getColor(fluidstack); + RenderUtil.setGLColorFromInt(color); + } + + public static int[] getFluidDisplayLists(FluidStack fluidStack, World world, boolean flowing) { + if (fluidStack == null) { + return null; + } + Fluid fluid = fluidStack.getFluid(); + if (fluid == null) { + return null; + } + Map cache = flowing ? flowingRenderCache : stillRenderCache; + int[] diplayLists = cache.get(fluid); + if (diplayLists != null) { + return diplayLists; + } + + diplayLists = new int[DISPLAY_STAGES]; + + if (fluid.getBlock() != null) { + liquidBlock.baseBlock = fluid.getBlock(); + } else { + liquidBlock.baseBlock = Blocks.water; + } + liquidBlock.texture = getFluidTexture(fluidStack, flowing); + + cache.put(fluid, diplayLists); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_CULL_FACE); + + for (int s = 0; s < DISPLAY_STAGES; ++s) { + diplayLists[s] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(diplayLists[s], 4864 /* GL_COMPILE */); + + liquidBlock.minX = 0.01f; + liquidBlock.minY = 0; + liquidBlock.minZ = 0.01f; + + liquidBlock.maxX = 0.99f; + liquidBlock.maxY = Math.max(s, 1) / (float) DISPLAY_STAGES; + liquidBlock.maxZ = 0.99f; + + RenderEntityBlock.INSTANCE.renderBlock(liquidBlock); + GL11.glEndList(); + } + + GL11.glColor4f(1, 1, 1, 1); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + + return diplayLists; + } +} diff --git a/src/main/java/com/glodblock/github/client/render/tank/ModelCertusTank.java b/src/main/java/com/glodblock/github/client/render/tank/ModelCertusTank.java new file mode 100644 index 00000000..2ae7804e --- /dev/null +++ b/src/main/java/com/glodblock/github/client/render/tank/ModelCertusTank.java @@ -0,0 +1,144 @@ +package com.glodblock.github.client.render.tank; + +import net.minecraft.block.Block; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; + +import org.lwjgl.opengl.GL11; + +import com.glodblock.github.common.tile.TileCertusQuartzTank; + +public class ModelCertusTank extends ModelBase { + + ModelRenderer Shape1; + + public ModelCertusTank() { + this.textureWidth = 64; + this.textureHeight = 64; + + this.Shape1 = new ModelRenderer(this, 0, 0); + this.Shape1.addBox(0F, 0F, 0F, 14, 16, 14); + this.Shape1.setRotationPoint(-7F, -8F, -7F); + this.Shape1.setTextureSize(this.textureWidth, this.textureHeight); + this.Shape1.mirror = true; + setRotation(this.Shape1, 0F, 0F, 0F); + + } + + public void render(float f) { + this.Shape1.render(f); + } + + public void renderFluid(TileEntity tileEntity, double x, double y, double z, RenderBlocks renderer) { + Tessellator tessellator = Tessellator.instance; + if (tileEntity != null + && ((TileCertusQuartzTank) tileEntity).getTankInfo(ForgeDirection.UNKNOWN)[0].fluid != null) { + Fluid storedFluid = ((TileCertusQuartzTank) tileEntity).getRenderFluid(); + float scale = ((TileCertusQuartzTank) tileEntity).getRenderScale(); + if (storedFluid != null && scale > 0) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + Block id = Block.getBlockById(FluidRegistry.WATER.getID()); + IIcon fluidIcon = storedFluid.getIcon(); + if (fluidIcon == null) fluidIcon = FluidRegistry.LAVA.getIcon(); + renderer.setRenderBounds(0.08F, 0.001F, 0.08F, 0.92, scale * 0.999F, 0.92F); + tessellator.setColorRGBA_F( + (storedFluid.getColor() >> 16 & 0xFF) / 255.0F, + (storedFluid.getColor() >> 8 & 0xFF) / 255.0F, + (storedFluid.getColor() & 0xFF) / 255.0F, + 1.0F); + tessellator.setNormal(0.0F, -1F, 0.0F); + renderer.renderFaceYNeg(id, x, y, z, fluidIcon); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(id, x, y, z, fluidIcon); + tessellator.setNormal(0.0F, 0.0F, -1F); + renderer.renderFaceZNeg(id, x, y, z, fluidIcon); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(id, x, y, z, fluidIcon); + tessellator.setNormal(-1F, 0.0F, 0.0F); + renderer.renderFaceXNeg(id, x, y, z, fluidIcon); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(id, x, y, z, fluidIcon); + } + } + } + + public void renderInnerBlock(Block block, int x, int y, int z, RenderBlocks renderer, IBlockAccess world) { + Tessellator tessellator = Tessellator.instance; + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + tessellator.setBrightness(15728640); + boolean tankUp = world.getTileEntity(x, y + 1, z) instanceof TileCertusQuartzTank; + boolean tankDown = world.getTileEntity(x, y - 1, z) instanceof TileCertusQuartzTank; + int meta = 0; + if (tankUp && tankDown) meta = 3; + else if (tankUp) meta = 2; + else if (tankDown) meta = 1; + if (!tankUp) { + tessellator.setNormal(0, -1, 0); + renderer.renderFaceYNeg(block, x, y + 0.99F, z, block.getIcon(1, 0)); + } + if (!tankDown) { + tessellator.setNormal(0, 1, 0); + renderer.renderFaceYPos(block, x, y - 0.99F, z, block.getIcon(0, 0)); + } + IIcon sideIcon = block.getIcon(3, meta); + tessellator.setNormal(0, 0, -1); + renderer.renderFaceZNeg(block, x, y, z + 0.875F, sideIcon); + tessellator.setNormal(0, 0, 1); + renderer.renderFaceZPos(block, x, y, z - 0.875F, sideIcon); + tessellator.setNormal(-1, 0, 0); + renderer.renderFaceXNeg(block, x + 0.875F, y, z, sideIcon); + tessellator.setNormal(1, 0, 0); + renderer.renderFaceXPos(block, x - 0.875F, y, z, sideIcon); + GL11.glPopMatrix(); + } + + public void renderOuterBlock(Block block, int x, int y, int z, RenderBlocks renderer, IBlockAccess world) { + Tessellator tessellator = Tessellator.instance; + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + boolean tankUp = world.getTileEntity(x, y + 1, z) instanceof TileCertusQuartzTank; + boolean tankDown = world.getTileEntity(x, y - 1, z) instanceof TileCertusQuartzTank; + int meta = 0; + if (tankUp && tankDown) meta = 3; + else if (tankUp) meta = 2; + else if (tankDown) meta = 1; + if (!tankDown) { + tessellator.setNormal(0.0F, -1F, 0.0F); + renderer.renderFaceYNeg(block, x, y, z, block.getIcon(0, 0)); + } + if (!tankUp) { + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, x, y, z, block.getIcon(1, 0)); + } + + IIcon sideIcon = block.getIcon(3, meta); + tessellator.setNormal(0.0F, 0.0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, sideIcon); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, x, y, z, sideIcon); + tessellator.setNormal(-1F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, x, y, z, sideIcon); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, x, y, z, sideIcon); + GL11.glPopMatrix(); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + +} diff --git a/src/main/java/com/glodblock/github/client/render/tank/RenderEntityBlock.java b/src/main/java/com/glodblock/github/client/render/tank/RenderEntityBlock.java new file mode 100644 index 00000000..c11107a6 --- /dev/null +++ b/src/main/java/com/glodblock/github/client/render/tank/RenderEntityBlock.java @@ -0,0 +1,169 @@ +package com.glodblock.github.client.render.tank; + +import java.util.Arrays; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.EnumSkyBlock; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class RenderEntityBlock extends Render { + + public static RenderEntityBlock INSTANCE = new RenderEntityBlock(); + protected RenderBlocks renderBlocks; + + private RenderEntityBlock() { + renderBlocks = field_147909_c; + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + throw new UnsupportedOperationException("Not supported yet."); + } + + public static class RenderInfo { + + public double minX = 0.0F; + public double minY = 0.0F; + public double minZ = 0.0F; + public double maxX = 1.0F; + public double maxY = 1.0F; + public double maxZ = 1.0F; + public Block baseBlock = Blocks.sand; + public IIcon texture = null; + public IIcon[] textureArray = null; + public boolean[] renderSide = new boolean[] { true, true, true, true, true, true }; + public int light = -1; + public int brightness = -1; + + public RenderInfo() {} + + public RenderInfo(Block template, IIcon[] texture) { + this(); + this.baseBlock = template; + this.textureArray = texture; + } + + public RenderInfo(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) { + this(); + setBounds(minX, minY, minZ, maxX, maxY, maxZ); + } + + public void setSkyBlockLight(World world, int x, int y, int z, int light) { + this.brightness = world.getSkyBlockTypeBrightness(EnumSkyBlock.Sky, x, y, z) << 16 | light; + } + + public float getBlockBrightness(IBlockAccess iblockaccess, int i, int j, int k) { + return baseBlock.getMixedBrightnessForBlock(iblockaccess, i, j, k); + } + + public final void setBounds(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { + this.minX = minX; + this.minY = minY; + this.minZ = minZ; + this.maxX = maxX; + this.maxY = maxY; + this.maxZ = maxZ; + } + + public final void setRenderSingleSide(int side) { + Arrays.fill(renderSide, false); + renderSide[side] = true; + } + + public final void setRenderAllSides() { + Arrays.fill(renderSide, true); + } + + public void rotate() { + double temp = minX; + minX = minZ; + minZ = temp; + + temp = maxX; + maxX = maxZ; + maxZ = temp; + } + + public void reverseX() { + double temp = minX; + minX = 1 - maxX; + maxX = 1 - temp; + } + + public void reverseZ() { + double temp = minZ; + minZ = 1 - maxZ; + maxZ = 1 - temp; + } + + public IIcon getBlockTextureFromSide(int i) { + if (texture != null) { + return texture; + } + + int index = i; + + if (textureArray == null || textureArray.length == 0) { + return baseBlock.getBlockTextureFromSide(index); + } else { + if (index >= textureArray.length) { + index = 0; + } + + return textureArray[index]; + } + } + } + + @Override + public void doRender(Entity entity, double x, double y, double z, float f, float f1) { + // NO-OP + } + + public void renderBlock(RenderInfo info) { + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + + renderBlocks.setRenderBounds(info.minX, info.minY, info.minZ, info.maxX, info.maxY, info.maxZ); + + if (info.light != -1) { + tessellator.setBrightness(info.light << 20 | info.light << 4); + } else if (info.brightness != -1) { + tessellator.setBrightness(info.brightness << 4); + } + + if (info.renderSide[0]) { + tessellator.setNormal(0, -1, 0); + renderBlocks.renderFaceYNeg(info.baseBlock, 0, 0, 0, info.getBlockTextureFromSide(0)); + } + if (info.renderSide[1]) { + tessellator.setNormal(0, 1, 0); + renderBlocks.renderFaceYPos(info.baseBlock, 0, 0, 0, info.getBlockTextureFromSide(1)); + } + if (info.renderSide[2]) { + tessellator.setNormal(0, 0, -1); + renderBlocks.renderFaceZNeg(info.baseBlock, 0, 0, 0, info.getBlockTextureFromSide(2)); + } + if (info.renderSide[3]) { + tessellator.setNormal(0, 0, 1); + renderBlocks.renderFaceZPos(info.baseBlock, 0, 0, 0, info.getBlockTextureFromSide(3)); + } + if (info.renderSide[4]) { + tessellator.setNormal(-1, 0, 0); + renderBlocks.renderFaceXNeg(info.baseBlock, 0, 0, 0, info.getBlockTextureFromSide(4)); + } + if (info.renderSide[5]) { + tessellator.setNormal(1, 0, 0); + renderBlocks.renderFaceXPos(info.baseBlock, 0, 0, 0, info.getBlockTextureFromSide(5)); + } + tessellator.draw(); + } +} diff --git a/src/main/java/com/glodblock/github/common/block/BaseBlockContainer.java b/src/main/java/com/glodblock/github/common/block/BaseBlockContainer.java index a3be7566..f4170e63 100644 --- a/src/main/java/com/glodblock/github/common/block/BaseBlockContainer.java +++ b/src/main/java/com/glodblock/github/common/block/BaseBlockContainer.java @@ -9,10 +9,14 @@ import net.minecraft.item.ItemStack; public abstract class BaseBlockContainer extends BlockContainer { - public BaseBlockContainer(Material p_i45386_1_) { - super(p_i45386_1_); + public BaseBlockContainer(Material material) { + super(material); } public void addInformation(ItemStack itemStack, EntityPlayer player, List toolTip, boolean advancedToolTips) {} + + public ItemStack stack() { + return new ItemStack(this, 1); + } } diff --git a/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java b/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java index c8a4b498..89ff8c3a 100644 --- a/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java +++ b/src/main/java/com/glodblock/github/common/block/BlockCertusQuartzTank.java @@ -1,11 +1,16 @@ package com.glodblock.github.common.block; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -13,13 +18,11 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import appeng.api.implementations.items.IAEWrench; -import buildcraft.api.tools.IToolWrench; -import buildcraft.factory.BlockTank; -import com.glodblock.github.FluidCraft; import com.glodblock.github.common.item.ItemCertusQuartzTank; import com.glodblock.github.common.tabs.FluidCraftingTabs; import com.glodblock.github.common.tile.TileCertusQuartzTank; +import com.glodblock.github.loader.ChannelLoader; import com.glodblock.github.loader.IRegister; import com.glodblock.github.loader.ItemAndBlockHolder; import com.glodblock.github.util.NameConst; @@ -28,98 +31,116 @@ import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BlockCertusQuartzTank extends BlockTank implements IRegister { +public class BlockCertusQuartzTank extends BaseBlockContainer implements IRegister { - private IIcon textureStackedSide; + IIcon breakIcon; + IIcon topIcon; + IIcon bottomIcon; + IIcon sideIcon; + IIcon sideMiddleIcon; + IIcon sideTopIcon; + IIcon sideBottomIcon; public BlockCertusQuartzTank() { + super(Material.glass); setBlockName(NameConst.BLOCK_CERTUS_QUARTZ_TANK); - setResistance(1.0F); - setHardness(0.5F); + setResistance(10.0F); + setHardness(2.0F); setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 1.0F, 0.9375F); } - public ItemStack getDropWithNBT(World world, int x, int y, int z) { - NBTTagCompound nbt = new NBTTagCompound(); - TileEntity te = world.getTileEntity(x, y, z); - if (te instanceof TileCertusQuartzTank) { - ItemStack dropStack = new ItemStack(ItemAndBlockHolder.CERTUS_QUARTZ_TANK, 1); - ((TileCertusQuartzTank) te).writeToNBTWithoutCoords(nbt); - if (!nbt.getCompoundTag("tank").hasKey("Empty")) { - dropStack.setTagCompound(nbt); - } + @Override + public boolean canRenderInPass(int pass) { + return true; + } + @Override + public TileEntity createNewTileEntity(World var1, int var2) { + return new TileCertusQuartzTank(); + } + + public ItemStack getDropWithNBT(World world, int x, int y, int z) { + NBTTagCompound tileEntity = new NBTTagCompound(); + TileEntity worldTE = world.getTileEntity(x, y, z); + if (worldTE instanceof TileCertusQuartzTank) { + ItemStack dropStack = new ItemStack(ItemAndBlockHolder.CERTUS_QUARTZ_TANK, 1); + + ((TileCertusQuartzTank) worldTE).writeToNBTWithoutCoords(tileEntity); + + if (!tileEntity.hasKey("Empty")) { + dropStack.setTagCompound(new NBTTagCompound()); + dropStack.stackTagCompound.setTag("tileEntity", tileEntity); + } return dropStack; + } return null; } - public TileEntity createNewTileEntity(World world, int metadata) { - return new TileCertusQuartzTank(); - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) { - super.registerBlockIcons(par1IconRegister); - textureStackedSide = par1IconRegister.registerIcon(FluidCraft.MODID + ":certus_quartz_tank/side_stacked"); - } - @Override - public IIcon getIconAbsolute(IBlockAccess iblockaccess, int x, int y, int z, int side, int metadata) { - if (side >= 2 && (iblockaccess.getBlock(x, y - 1, z) instanceof BlockCertusQuartzTank)) { - return textureStackedSide; - } else { - return super.getIconAbsolute(side, metadata); + public IIcon getIcon(int side, int meta) { + switch (meta) { + case 1: + return this.sideTopIcon; + case 2: + return this.sideBottomIcon; + case 3: + return this.sideMiddleIcon; + default: + return side == 0 ? this.bottomIcon : side == 1 ? this.topIcon : this.sideIcon; } } @Override - public boolean onBlockActivated(World worldObj, int x, int y, int z, EntityPlayer p, int blockID, float offsetX, - float offsetY, float offsetZ) { - ItemStack current = p.inventory.getCurrentItem(); + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + return getDropWithNBT(world, x, y, z); + } - if (p.isSneaking() && current != null) { - try { - if (current.getItem() instanceof IToolWrench - && ((IToolWrench) current.getItem()).canWrench(p, x, y, z)) { - dropBlockAsItem(worldObj, x, y, z, getDropWithNBT(worldObj, x, y, z)); - worldObj.setBlockToAir(x, y, z); - ((IToolWrench) current.getItem()).wrenchUsed(p, x, y, z); - return true; - } - } catch (Throwable e) { - // No IToolWrench - } + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileCertusQuartzTank) { + TileCertusQuartzTank tank = (TileCertusQuartzTank) tile; + return tank.getFluidLightLevel(); + } + return super.getLightValue(world, x, y, z); + } + + @Override + public boolean onBlockActivated(World worldObj, int x, int y, int z, EntityPlayer entityplayer, int blockID, + float offsetX, float offsetY, float offsetZ) { + ItemStack current = entityplayer.inventory.getCurrentItem(); + + if (entityplayer.isSneaking() && current != null) { if (current.getItem() instanceof IAEWrench - && ((IAEWrench) current.getItem()).canWrench(current, p, x, y, z)) { + && ((IAEWrench) current.getItem()).canWrench(current, entityplayer, x, y, z)) { dropBlockAsItem(worldObj, x, y, z, getDropWithNBT(worldObj, x, y, z)); worldObj.setBlockToAir(x, y, z); return true; } } - if (current != null) { FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(current); TileCertusQuartzTank tank = (TileCertusQuartzTank) worldObj.getTileEntity(x, y, z); if (liquid != null) { int amountFilled = tank.fill(ForgeDirection.UNKNOWN, liquid, true); - - if (amountFilled != 0 && !p.capabilities.isCreativeMode) { + if (amountFilled != 0 && !entityplayer.capabilities.isCreativeMode && current.getItem() != null) { if (current.stackSize > 1) { - p.inventory.mainInventory[p.inventory.currentItem].stackSize -= 1; - p.inventory.addItemStackToInventory(current.getItem().getContainerItem(current)); + entityplayer.inventory.mainInventory[entityplayer.inventory.currentItem].stackSize -= 1; + entityplayer.inventory.addItemStackToInventory(current.getItem().getContainerItem(current)); } else { - p.inventory.mainInventory[p.inventory.currentItem] = current.getItem() + entityplayer.inventory.mainInventory[entityplayer.inventory.currentItem] = current.getItem() .getContainerItem(current); } } - return true; - - // Handle empty containers } else { - FluidStack available = tank.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid; if (available != null) { ItemStack filled = FluidContainerRegistry.fillFluidContainer(available, current); @@ -128,12 +149,13 @@ public class BlockCertusQuartzTank extends BlockTank implements IRegister= 500) { + ChannelLoader.sendPacketToAllPlayers(getDescriptionPacket(), this.worldObj); + this.lastBeforeUpdate = current.copy(); + } else if (this.lastBeforeUpdate.amount < this.tank.getCapacity() + && current.amount == this.tank.getCapacity() + || this.lastBeforeUpdate.amount == this.tank.getCapacity() + && current.amount < this.tank.getCapacity()) { + ChannelLoader.sendPacketToAllPlayers(getDescriptionPacket(), this.worldObj); + this.lastBeforeUpdate = current.copy(); + } + } else { + ChannelLoader.sendPacketToAllPlayers(getDescriptionPacket(), this.worldObj); + this.lastBeforeUpdate = current.copy(); + } + } else if (this.lastBeforeUpdate != null) { + ChannelLoader.sendPacketToAllPlayers(getDescriptionPacket(), this.worldObj); + this.lastBeforeUpdate = null; + } + } + } + + public FluidStack drain(FluidStack fluid, boolean doDrain, boolean findMainTank) { + if (findMainTank) { + int yOff = 0; + TileEntity offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord + yOff, this.zCoord); + TileCertusQuartzTank mainTank = this; + while (true) { + if (offTE instanceof TileCertusQuartzTank) { + Fluid offFluid = ((TileCertusQuartzTank) offTE).getFluid(); + if (offFluid != null && offFluid == fluid.getFluid()) { + mainTank = (TileCertusQuartzTank) this.worldObj + .getTileEntity(this.xCoord, this.yCoord + yOff, this.zCoord); + yOff++; + offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord + yOff, this.zCoord); + continue; + } + } + break; + } + + return mainTank != null ? mainTank.drain(fluid, doDrain, false) : null; + } + + FluidStack drained = this.tank.drain(fluid.amount, doDrain); + compareAndUpdate(); + + if (drained == null || drained.amount < fluid.amount) { + TileEntity offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord - 1, this.zCoord); + if (offTE instanceof TileCertusQuartzTank) { + TileCertusQuartzTank tank = (TileCertusQuartzTank) offTE; + FluidStack externallyDrained = tank.drain( + new FluidStack(fluid.getFluid(), fluid.amount - (drained != null ? drained.amount : 0)), + doDrain, + false); + + if (externallyDrained != null) return new FluidStack( + fluid.getFluid(), + (drained != null ? drained.amount : 0) + externallyDrained.amount); + else return drained; + } + } + + return drained; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + if (this.tank.getFluid() == null || resource == null || resource.getFluid() != this.tank.getFluid().getFluid()) + return null; + + return drain(resource, doDrain, true); + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + if (this.tank.getFluid() == null) return null; + + return drain(from, new FluidStack(this.tank.getFluid(), maxDrain), doDrain); + } + + public int fill(FluidStack fluid, boolean doFill, boolean findMainTank) { + if (findMainTank) { + int yOff = 0; + TileEntity offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord - yOff, this.zCoord); + TileCertusQuartzTank mainTank = this; + while (true) { + if (offTE instanceof TileCertusQuartzTank) { + Fluid offFluid = ((TileCertusQuartzTank) offTE).getFluid(); + if (offFluid == null || offFluid == fluid.getFluid()) { + mainTank = (TileCertusQuartzTank) this.worldObj + .getTileEntity(this.xCoord, this.yCoord - yOff, this.zCoord); + yOff++; + offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord - yOff, this.zCoord); + continue; + } + } + break; + } + + return mainTank != null ? mainTank.fill(fluid, doFill, false) : 0; + } + + int filled = this.tank.fill(fluid, doFill); + compareAndUpdate(); + + if (filled < fluid.amount) { + TileEntity offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord + 1, this.zCoord); + if (offTE instanceof TileCertusQuartzTank) { + TileCertusQuartzTank tank = (TileCertusQuartzTank) offTE; + return filled + tank.fill(new FluidStack(fluid.getFluid(), fluid.amount - filled), doFill, false); + } + } + + return filled; + } + + /* IFluidHandler */ + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + if (resource == null || this.tank.getFluid() != null && resource.getFluid() != this.tank.getFluid().getFluid()) + return 0; + return fill(resource, doFill, true); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbtTag = new NBTTagCompound(); + writeToNBT(nbtTag); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, nbtTag); + } + + public Fluid getFluid() { + FluidStack tankFluid = this.tank.getFluid(); + return tankFluid != null && tankFluid.amount > 0 ? tankFluid.getFluid() : null; + } + + public Fluid getRenderFluid() { + return this.tank.getFluid() != null ? this.tank.getFluid().getFluid() : null; + } + + public float getRenderScale() { + return (float) this.tank.getFluidAmount() / this.tank.getCapacity(); + } + + public FluidTankInfo[] getTankInfo(boolean goToMainTank) { + if (!goToMainTank) return new FluidTankInfo[] { this.tank.getInfo() }; + + int amount = 0, capacity = 0; + Fluid fluid = null; + + int yOff = 0; + TileEntity offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord - yOff, this.zCoord); + TileCertusQuartzTank mainTank; + while (true) { + if (offTE instanceof TileCertusQuartzTank) { + if (((TileCertusQuartzTank) offTE).getFluid() == null + || ((TileCertusQuartzTank) offTE).getFluid() == getFluid()) { + yOff++; + offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord - yOff, this.zCoord); + continue; + } + } + break; + } + + yOff = 0; + offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord + yOff, this.zCoord); + while (true) { + if (offTE instanceof TileCertusQuartzTank) { + mainTank = (TileCertusQuartzTank) offTE; + if (mainTank.getFluid() == null || mainTank.getFluid() == getFluid()) { + FluidTankInfo info = mainTank.getTankInfo(false)[0]; + if (info != null) { + capacity += info.capacity; + if (info.fluid != null) { + amount += info.fluid.amount; + if (info.fluid.getFluid() != null) fluid = info.fluid.getFluid(); + } + } + yOff++; + offTE = this.worldObj.getTileEntity(this.xCoord, this.yCoord + yOff, this.zCoord); + continue; + } + } + break; + } + + return new FluidTankInfo[] { + new FluidTankInfo(fluid != null ? new FluidStack(fluid, amount) : null, capacity) }; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return getTankInfo(true); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) { + this.worldObj.markBlockRangeForRenderUpdate( + this.xCoord, + this.yCoord, + this.zCoord, + this.xCoord, + this.yCoord, + this.zCoord); + readFromNBT(packet.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + readFromNBTWithoutCoords(tag); } public void readFromNBTWithoutCoords(NBTTagCompound tag) { this.tank.readFromNBT(tag); } - public void writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - writeToNBTWithoutCoords(data); - } - - public void setCapacity() { - this.tank.setCapacity(CAPACITY); + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + writeToNBTWithoutCoords(tag); } public void writeToNBTWithoutCoords(NBTTagCompound tag) { diff --git a/src/main/java/com/glodblock/github/loader/ChannelLoader.java b/src/main/java/com/glodblock/github/loader/ChannelLoader.java index 1ecdaa0a..198bd0ff 100644 --- a/src/main/java/com/glodblock/github/loader/ChannelLoader.java +++ b/src/main/java/com/glodblock/github/loader/ChannelLoader.java @@ -1,5 +1,9 @@ package com.glodblock.github.loader; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.Packet; +import net.minecraft.world.World; + import com.glodblock.github.FluidCraft; import com.glodblock.github.network.*; import cpw.mods.fml.relauncher.Side; @@ -47,4 +51,12 @@ public class ChannelLoader implements Runnable { FluidCraft.proxy.netHandler .registerMessage(new SPacketSetItemAmount.Handler(), SPacketSetItemAmount.class, id++, Side.CLIENT); } + + public static void sendPacketToAllPlayers(Packet packet, World world) { + for (Object player : world.playerEntities) { + if (player instanceof EntityPlayerMP) { + ((EntityPlayerMP) player).playerNetServerHandler.sendPacket(packet); + } + } + } } diff --git a/src/main/java/com/glodblock/github/util/FluidSorters.java b/src/main/java/com/glodblock/github/util/FluidSorters.java index bc48429a..c6577697 100644 --- a/src/main/java/com/glodblock/github/util/FluidSorters.java +++ b/src/main/java/com/glodblock/github/util/FluidSorters.java @@ -38,15 +38,11 @@ public class FluidSorters { } }; - public static final Comparator CONFIG_BASED_SORT_BY_NAME = new Comparator() { - - @Override - public int compare(final IAEItemStack o1, final IAEItemStack o2) { - if (getDirection() == SortDir.ASCENDING) { - return Platform.getItemDisplayName(o1).compareToIgnoreCase(Platform.getItemDisplayName(o2)); - } - return Platform.getItemDisplayName(o2).compareToIgnoreCase(Platform.getItemDisplayName(o1)); + public static final Comparator CONFIG_BASED_SORT_BY_NAME = (o1, o2) -> { + if (getDirection() == SortDir.ASCENDING) { + return Platform.getItemDisplayName(o1).compareToIgnoreCase(Platform.getItemDisplayName(o2)); } + return Platform.getItemDisplayName(o2).compareToIgnoreCase(Platform.getItemDisplayName(o1)); }; public static final Comparator CONFIG_BASED_SORT_BY_SIZE = new Comparator() { @@ -89,33 +85,15 @@ public class FluidSorters { } public static int compareInt(final int a, final int b) { - if (a == b) { - return 0; - } - if (a < b) { - return -1; - } - return 1; + return Integer.compare(a, b); } public static int compareLong(final long a, final long b) { - if (a == b) { - return 0; - } - if (a < b) { - return -1; - } - return 1; + return Long.compare(a, b); } public static int compareDouble(final double a, final double b) { - if (a == b) { - return 0; - } - if (a < b) { - return -1; - } - return 1; + return Double.compare(a, b); } private static SortDir getDirection() { diff --git a/src/main/java/com/glodblock/github/util/RenderUtil.java b/src/main/java/com/glodblock/github/util/RenderUtil.java index c5a58544..49edf57e 100644 --- a/src/main/java/com/glodblock/github/util/RenderUtil.java +++ b/src/main/java/com/glodblock/github/util/RenderUtil.java @@ -72,4 +72,11 @@ public final class RenderUtil { public static List listFormattedStringToWidth(String str) { return Minecraft.getMinecraft().fontRenderer.listFormattedStringToWidth(str, 150); } + + public static void setGLColorFromInt(int color) { + float red = (color >> 16 & 255) / 255.0F; + float green = (color >> 8 & 255) / 255.0F; + float blue = (color & 255) / 255.0F; + GL11.glColor4f(red, green, blue, 1.0F); + } } diff --git a/src/main/java/com/glodblock/github/util/Util.java b/src/main/java/com/glodblock/github/util/Util.java index 84863459..75996c79 100644 --- a/src/main/java/com/glodblock/github/util/Util.java +++ b/src/main/java/com/glodblock/github/util/Util.java @@ -218,6 +218,10 @@ public final class Util { } } + public static int clamp(int value, int min, int max) { + return value < min ? min : (Math.min(value, max)); + } + public static class FluidUtil { public static IAEFluidStack createAEFluidStack(Fluid fluid) { diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/bottom.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/bottom.png index 68881f617bac173ca355b80b89841221977987ac..692f9b79271a1449e00b2691d21f997b836641e4 100644 GIT binary patch delta 270 zcmV+p0rCFs0jUCzB!32COGiWi{{a60|De66lK=n!32;bRa{vGi!T#rqiM2UsWp0DnbM_)o&d7@;P!x!#~` z59x+zh*uhvX6Ozj03ZOA?IDQH4BtdsCd!q)S0OhQ(hXqv=Ca$G7~oj9kZufKE*;_@ z@J)bt-su|(8P*yYIX~4cD0WC9$yp_HfJ-xI+gE-Rka+zXtP)VVo&&mliJ#~JYGXAO U%0gZd00000Ne4wvM6N<$f_3g{0RR91 delta 210 zcmV;@04@Ki0`38jB!9I@L_t(Ijboq`FoN_uI5_+#$D9KP4luI7ILfovFtB`l$H4Ua z7hX;OSlJl<@Cz~AO$`C_;Rb*-GyeHg_>bZL1$+iD{`q6T^6_myTpx@9vKgd#hK0@n zdq|KvkihE{-7<{>cRe1wZ^b+awbXI4Ci^Y?KbzQS$cCx9;*S3yWA7J#;zopr0LeB-vH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/map.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/map.png new file mode 100644 index 0000000000000000000000000000000000000000..e02664e56811a2d0ee40fc67307765667d43bfa1 GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L2E{@KZ#fq}`% z)5S5QBJS-p-#jTtf!11+cS))e>5r8geneL=OP5Wokybh#m?Y@xm-CcmpL4q0tFVBV zQ@blJ8lPFbB>(fXQ2+f|CSP2=UdHmUHHQfQ{+GR}6kKy3DeSh{y=9M>Zzfmn$S6a=$u_J2jrL@fp zA4uA?GvAn>Cp=+oHHXdOx9e^*AJ9~O(VkyFZ+1d?yTf7QiYj{smTmLWK9@gdoWouq z*Kmx%uI{*d!S$Ly|1SRSSNL~dyxTQu{q^691~=|MC^c^Iua!7ZV&%K}W{y3}9HZvg zmUa8g#25ZvF3rQJXlqq3=v2Y8kfle1c}Gp9@8UF$AF2;pYz6jR4u3f7#&>z|h&QRV zO2@x&t66XD*tFxS@~s!A4gWS}{`^sNS}fr}v{?yPt>vVO0|RG)M`SSr1K%MKW)#)%Y5)qdmw5WRvfpDA zWDu}E^~Ur7P{_{H#WBRyiFB}nX4_mdKI;Vst0Jm5*`Tzg` delta 112 zcmV-$0FVE%0gVBWBxzJhL_t(IjbmhBU|?`?aQM$a1~_ow03!=b+y4Fg8A&n1(a{lX zDHBYf%3Vl`u^1$p8B|Nji6V3@Z@T`=l`LFR&t(>Lc5>jGr8lx61w2N(gB4IZlB SW~RUZ0000a)($X?><>&kwQQIO42fx$_>6etww>Eak-aXL9AAt9llpy0=QyF$P7 z=l)CyVpD4PeZ=yv_2*zOJ{gMxCm4(y8eJGJA7&BG*k7@HcEnkUEcaN0S51jen!W^^ rKNDIl8L6whQx9lNf+bITEgJz>gTe~DWM4f(4azR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_mid.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_mid.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5d2b445f928d62d73ec37493c17c84f7eee569 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DjSK$uZf!>a)($X?><>&kwQQIO4wH*bT$VW5z+r;B5V#p&b(ASfs(_;J7Pqn|nR z#07sJ&CO$HZ~tGwD8e_9VOcxp&5)p&hO1iw#d~%oNbFGfd!={hk*s3@-ksbG$Ig3O U%gKEc2O7uV>FVdQ&MBb@0Gx$6^Z)<= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_stacked.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/side_stacked.png deleted file mode 100644 index 804526ef48f50f9ec8be77ea7c83231c141d12a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr`&KDG3P)1qB5^&O5MK z6g*&1=JvV$@9%F(Ps2kOFAC;p3i~X0eCcjpl4a)($X?><>&kwQQIJhqEW_)}8K97tr;B5V#p&dfgoK2Gf`T9C9oQ@i z9xx~~?_@jh#o!>zE&Y2h)xwP1ZUu_>>`IW>sqptoFXxdgKl{>Ty`HljDN@RveLw0S c9AI=~5D|6X7RzC01T>Yw)78&qol`;+012c!1^@s6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/top.png b/src/main/resources/assets/ae2fc/textures/blocks/certus_quartz_tank/top.png index b83065904703ed28b9ca694efff87f8fbd3d2037..602bfa55be8b81c2c34ab959d617631b90b1e826 100644 GIT binary patch delta 302 zcmV+}0nz@I0?7i9B!32COGiWi{{a60|De66lK=n!32;bRa{vGi!T0A_}&!Y4TgB6>PVFCDZe?d=T8vczBN0&SyI{SJPYLI3~&07*qoM6N<$g5vyt An*aa+ delta 249 zcmVNGfXtrf!M1G{P?jaqG(}ZaJb?a8=EHn(l5$0sn0wlBgXu2x^E~fC zdw{N3WXXCqUYfPl{6v`IM=j8i*EFK=K@+Tb2UQ8d`}I{~-=ako_fSlDAj00000NkvXXu0mjf?Y4C? From a22814940b1ae70f2a3b2e0c370eb10dcab256a6 Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Mon, 30 Jan 2023 22:52:25 +0800 Subject: [PATCH 5/9] add wireless fluid terminal --- ...GuiFluidPatternTerminalCraftingStatus.java | 5 + .../client/gui/GuiFluidPortableCell.java | 7 +- .../container/base/FCContainerMonitor.java | 7 + .../common/item/ItemPortableFluidCell.java | 2 +- .../item/ItemWirelessFluidTerminal.java | 94 +++++++++++++ .../common/tile/TileFluidAutoFiller.java | 20 ++- .../github/inventory/gui/GuiType.java | 19 ++- .../github/inventory/gui/ItemGuiFactory.java | 4 +- .../inventory/gui/PartItemGuiFactory.java | 79 +++++++++++ .../github/inventory/item/IItemInventory.java | 3 +- .../inventory/item/IWirelessTerminal.java | 9 ++ .../inventory/item/WirelessTerminal.java | 126 ++++++++++++++++++ .../github/loader/ItemAndBlockHolder.java | 1 + .../glodblock/github/loader/RecipeLoader.java | 1 + .../github/network/CPacketSwitchGuis.java | 27 ++-- .../com/glodblock/github/util/NameConst.java | 1 + .../java/com/glodblock/github/util/Util.java | 66 +++++++++ .../resources/assets/ae2fc/lang/en_US.lang | 1 + .../items/wireless_fluid_terminal.png | Bin 0 -> 355 bytes 19 files changed, 449 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java create mode 100644 src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java create mode 100644 src/main/java/com/glodblock/github/inventory/item/IWirelessTerminal.java create mode 100644 src/main/java/com/glodblock/github/inventory/item/WirelessTerminal.java create mode 100644 src/main/resources/assets/ae2fc/textures/items/wireless_fluid_terminal.png diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java index c0ac8608..d590602e 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java @@ -13,6 +13,7 @@ import com.glodblock.github.common.parts.PartFluidPatternTerminalEx; import com.glodblock.github.common.parts.PartFluidTerminal; import com.glodblock.github.inventory.InventoryHandler; import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.WirelessTerminal; import com.glodblock.github.loader.ItemAndBlockHolder; import com.glodblock.github.util.Ae2ReflectClient; @@ -34,7 +35,10 @@ public class GuiFluidPatternTerminalCraftingStatus extends GuiCraftingStatus { Ae2ReflectClient.rewriteIcon(this, new ItemStack(ItemAndBlockHolder.FLUID_TERMINAL_EX, 1)); else if (host instanceof PartFluidTerminal) { Ae2ReflectClient.rewriteIcon(this, new ItemStack(ItemAndBlockHolder.FLUID_TERM, 1)); + } else if (host instanceof WirelessTerminal) { + Ae2ReflectClient.rewriteIcon(this, new ItemStack(ItemAndBlockHolder.WIRELESS_FLUID_TERM, 1)); } + super.initGui(); originalGuiBtn = Ae2ReflectClient.getOriginalGuiButton(this); } @@ -46,6 +50,7 @@ public class GuiFluidPatternTerminalCraftingStatus extends GuiCraftingStatus { else if (host instanceof PartFluidPatternTerminalEx) InventoryHandler.switchGui(GuiType.FLUID_PATTERN_TERMINAL_EX); else if (host instanceof PartFluidTerminal) InventoryHandler.switchGui(GuiType.FLUID_TERMINAL); + else if (host instanceof WirelessTerminal) InventoryHandler.switchGui(GuiType.WIRELESS_FLUID_TERMINAL); } else { super.actionPerformed(btn); } diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidPortableCell.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidPortableCell.java index 7f04ccde..b5b95fff 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidPortableCell.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidPortableCell.java @@ -6,6 +6,7 @@ import appeng.container.slot.AppEngSlot; import com.glodblock.github.client.gui.container.ContainerFluidPortableCell; import com.glodblock.github.inventory.item.IFluidPortableCell; +import com.glodblock.github.inventory.item.IWirelessTerminal; public class GuiFluidPortableCell extends GuiFluidTerminal { @@ -20,6 +21,10 @@ public class GuiFluidPortableCell extends GuiFluidTerminal { @Override protected int getMaxRows() { - return 3; + if (this.container.getHost() instanceof IWirelessTerminal) { + return super.getMaxRows(); + } else { + return 3; + } } } diff --git a/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerMonitor.java b/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerMonitor.java index 6217f96e..9013a721 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerMonitor.java +++ b/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerMonitor.java @@ -32,6 +32,8 @@ import appeng.util.ConfigManager; import appeng.util.IConfigManagerHost; import appeng.util.Platform; +import com.glodblock.github.inventory.item.IWirelessTerminal; + public abstract class FCContainerMonitor> extends AEBaseContainer implements IConfigManagerHost, IConfigurableObject, IMEMonitorHandlerReceiver { @@ -98,6 +100,7 @@ public abstract class FCContainerMonitor> extends AEBaseCo this.updatePowerStatus(); final boolean oldAccessible = this.canAccessViewCells; this.canAccessViewCells = this.host instanceof WirelessTerminalGuiObject + || this.host instanceof IWirelessTerminal || this.hasAccess(SecurityPermissions.BUILD, false); if (this.canAccessViewCells != oldAccessible) { for (int y = 0; y < 5; y++) { @@ -214,4 +217,8 @@ public abstract class FCContainerMonitor> extends AEBaseCo this.getGui().updateSetting(manager, settingName, newValue); } } + + public ITerminalHost getHost() { + return this.host; + } } diff --git a/src/main/java/com/glodblock/github/common/item/ItemPortableFluidCell.java b/src/main/java/com/glodblock/github/common/item/ItemPortableFluidCell.java index 492cafb8..4714fc15 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemPortableFluidCell.java +++ b/src/main/java/com/glodblock/github/common/item/ItemPortableFluidCell.java @@ -192,7 +192,7 @@ public class ItemPortableFluidCell extends AEBasePoweredItem } @Override - public Object getInventory(ItemStack stack, World world, int x, int y, int z) { + public Object getInventory(ItemStack stack, World world, int x, int y, int z, EntityPlayer player) { return new PortableFluidCellInventory(stack, x); } diff --git a/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java new file mode 100644 index 00000000..505df3fe --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java @@ -0,0 +1,94 @@ +package com.glodblock.github.common.item; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.AEApi; +import appeng.api.features.ILocatable; +import appeng.api.features.IWirelessTermHandler; +import appeng.api.features.IWirelessTermRegistry; +import appeng.core.localization.PlayerMessages; +import appeng.items.tools.powered.ToolWirelessTerminal; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.inventory.InventoryHandler; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.IItemInventory; +import com.glodblock.github.inventory.item.WirelessTerminal; +import com.glodblock.github.loader.IRegister; +import com.glodblock.github.util.BlockPos; +import com.glodblock.github.util.NameConst; +import cpw.mods.fml.common.registry.GameRegistry; + +public class ItemWirelessFluidTerminal extends ToolWirelessTerminal + implements IItemInventory, IRegister { + + public ItemWirelessFluidTerminal() { + super(); + AEApi.instance().registries().wireless().registerWirelessHandler(this); + setUnlocalizedName(NameConst.ITEM_WIRELESS_FLUID_TERMINAL); + setTextureName(FluidCraft.resource(NameConst.ITEM_WIRELESS_FLUID_TERMINAL).toString()); + } + + @Override + public ItemStack onItemRightClick(final ItemStack item, final World w, final EntityPlayer player) { + IWirelessTermRegistry term = AEApi.instance().registries().wireless(); + if (!term.isWirelessTerminal(item)) { + player.addChatMessage(PlayerMessages.DeviceNotWirelessTerminal.get()); + return item; + } + final IWirelessTermHandler handler = term.getWirelessTerminalHandler(item); + final String unparsedKey = handler.getEncryptionKey(item); + if (unparsedKey.isEmpty()) { + player.addChatMessage(PlayerMessages.DeviceNotLinked.get()); + return item; + } + final long parsedKey = Long.parseLong(unparsedKey); + final ILocatable securityStation = AEApi.instance().registries().locatable().getLocatableBy(parsedKey); + if (securityStation == null) { + player.addChatMessage(PlayerMessages.StationCanNotBeLocated.get()); + return item; + } + if (handler.hasPower(player, 0.5, item)) { + InventoryHandler.openGui( + player, + w, + new BlockPos((int) player.posX, (int) player.posY, (int) player.posZ), + ForgeDirection.UNKNOWN, + GuiType.WIRELESS_FLUID_TERMINAL); + } else { + player.addChatMessage(PlayerMessages.DeviceNotPowered.get()); + } + + return item; + } + + @Override + public boolean canHandle(final ItemStack is) { + return is.getItem() == this; + } + + @Override + public ItemWirelessFluidTerminal register() { + GameRegistry.registerItem(this, NameConst.ITEM_WIRELESS_FLUID_TERMINAL, FluidCraft.MODID); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + @Override + public Object getInventory(ItemStack stack, World world, int x, int y, int z, EntityPlayer player) { + try { + return new WirelessTerminal(stack, new BlockPos(x, y, z, world), player); + } catch (Exception e) { + player.addChatMessage(PlayerMessages.OutOfRange.get()); + return null; + } + } + + public ItemStack stack() { + return new ItemStack(this, 1); + } +} diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java index e4340917..376a133c 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java @@ -60,7 +60,6 @@ public class TileFluidAutoFiller extends AENetworkInvTile private final AppEngInternalInventory inventory = new AppEngInternalInventory(this, 1); private final BaseActionSource source = new MachineSource(this); private IItemList fluids = AEApi.instance().storage().createFluidList(); - public ItemStack containerItem; private final Item encodedPattern = AEApi.instance().definitions().items().encodedPattern().maybeItem().orNull(); private IAEItemStack returnStack; private boolean isPowered; @@ -74,7 +73,14 @@ public class TileFluidAutoFiller extends AENetworkInvTile getProxy().setIdlePowerUsage(1D); getProxy().setFlags(GridFlags.REQUIRE_CHANNEL); inventory.setInventorySlotContents(0, BUCKET); - this.containerItem = getInventory().getStackInSlot(0); + } + + public ItemStack getContainerItem() { + return getInventory().getStackInSlot(0); + } + + public void setContainerItem(ItemStack is) { + getInventory().setInventorySlotContents(0, is); } @Override @@ -92,8 +98,8 @@ public class TileFluidAutoFiller extends AENetworkInvTile public void updatePattern() { ItemStack is = inventory.getStackInSlot(0); - if (is == null || this.containerItem.isItemEqual(is)) return; - this.containerItem = is; + if (is == null || this.getContainerItem().isItemEqual(is)) return; + this.setContainerItem(is); postEvent(); } @@ -141,12 +147,12 @@ public class TileFluidAutoFiller extends AENetworkInvTile for (IAEFluidStack fluidStack : fluidStorage) { Fluid fluid = fluidStack.getFluid(); if (fluid == null) continue; - int maxCapacity = Util.FluidUtil.getCapacity(this.containerItem, fluid); + int maxCapacity = Util.FluidUtil.getCapacity(this.getContainerItem(), fluid); if (maxCapacity == 0) continue; MutablePair filled = Util.FluidUtil - .fillStack(this.containerItem.copy(), new FluidStack(fluid, maxCapacity)); + .fillStack(this.getContainerItem().copy(), new FluidStack(fluid, maxCapacity)); if (filled.right == null) continue; - ItemStack pattern = getPattern(this.containerItem, filled.right); + ItemStack pattern = getPattern(this.getContainerItem(), filled.right); ICraftingPatternItem patter = (ICraftingPatternItem) pattern.getItem(); craftingTracker.addCraftingOption(this, patter.getPatternForItem(pattern, getWorldObj())); } diff --git a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java index 179eb0b2..acae829e 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java @@ -22,6 +22,7 @@ import com.glodblock.github.common.parts.base.FCSharedFluidBus; import com.glodblock.github.common.tile.*; import com.glodblock.github.inventory.IDualHost; import com.glodblock.github.inventory.item.IFluidPortableCell; +import com.glodblock.github.inventory.item.IWirelessTerminal; import com.google.common.collect.ImmutableList; public enum GuiType { @@ -169,15 +170,15 @@ public enum GuiType { } }), - CRAFTING_STATUS(new PartGuiFactory(FCPart.class) { + CRAFTING_STATUS(new PartItemGuiFactory(ITerminalHost.class) { @Override - protected Object createServerGui(EntityPlayer player, FCPart inv) { + protected Object createServerGui(EntityPlayer player, ITerminalHost inv) { return new ContainerCraftingStatus(player.inventory, inv); } @Override - protected Object createClientGui(EntityPlayer player, FCPart inv) { + protected Object createClientGui(EntityPlayer player, ITerminalHost inv) { return new GuiFluidPatternTerminalCraftingStatus(player.inventory, inv); } }), @@ -207,6 +208,18 @@ public enum GuiType { return new GuiFluidPortableCell(player.inventory, inv); } }), + WIRELESS_FLUID_TERMINAL(new ItemGuiFactory(IWirelessTerminal.class) { + + @Override + protected Object createServerGui(EntityPlayer player, IWirelessTerminal inv) { + return new ContainerFluidPortableCell(player.inventory, inv); + } + + @Override + protected Object createClientGui(EntityPlayer player, IWirelessTerminal inv) { + return new GuiFluidPortableCell(player.inventory, inv); + } + }), FLUID_PATTERN_TERMINAL(new PartGuiFactory(ITerminalHost.class) { diff --git a/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java b/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java index 01354288..6017171a 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java +++ b/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java @@ -32,7 +32,7 @@ public abstract class ItemGuiFactory implements IGuiFactory { if (item == null || !(item.getItem() instanceof IItemInventory)) { return null; } - T inv = getInventory(((IItemInventory) item.getItem()).getInventory(item, world, x, y, z)); + T inv = getInventory(((IItemInventory) item.getItem()).getInventory(item, world, x, y, z, player)); if (inv == null) { return null; } @@ -59,7 +59,7 @@ public abstract class ItemGuiFactory implements IGuiFactory { if (item == null || !(item.getItem() instanceof IItemInventory)) { return null; } - T inv = getInventory(((IItemInventory) item.getItem()).getInventory(item, world, x, y, z)); + T inv = getInventory(((IItemInventory) item.getItem()).getInventory(item, world, x, y, z, player)); return inv != null ? createClientGui(player, inv) : null; } diff --git a/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java b/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java new file mode 100644 index 00000000..47b8d443 --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java @@ -0,0 +1,79 @@ +package com.glodblock.github.inventory.gui; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.tuple.MutablePair; + +import appeng.container.AEBaseContainer; +import appeng.container.ContainerOpenContext; + +import com.glodblock.github.inventory.item.IItemInventory; +import com.glodblock.github.util.Util; + +public abstract class PartItemGuiFactory extends PartGuiFactory { + + PartItemGuiFactory(Class invClass) { + super(invClass); + } + + @Nullable + protected T getItemInventory(Object inv) { + return invClass.isInstance(inv) ? invClass.cast(inv) : null; + } + + @Nullable + @Override + public Object createServerGui(EntityPlayer player, World world, int x, int y, int z, ForgeDirection face) { + MutablePair result = Util.GuiHelper.decodeType(y); + + if (result.left == Util.GuiHelper.GuiType.ITEM) { + ItemStack item = player.getHeldItem(); + if (item == null || !(item.getItem() instanceof IItemInventory)) { + return null; + } + T inv = getItemInventory( + ((IItemInventory) item.getItem()).getInventory(item, world, x, result.right, z, player)); + if (inv == null) { + return null; + } + Object gui = createServerGui(player, inv); + if (gui instanceof AEBaseContainer) { + ContainerOpenContext ctx = new ContainerOpenContext(inv); + ctx.setWorld(world); + ctx.setX(x); + ctx.setY(y); + ctx.setZ(z); + ctx.setSide(face); + ((AEBaseContainer) gui).setOpenContext(ctx); + } + return gui; + } else { + return super.createServerGui(player, world, x, result.right, z, face); + } + + } + + @Nullable + @Override + public Object createClientGui(EntityPlayer player, World world, int x, int y, int z, ForgeDirection face) { + MutablePair result = Util.GuiHelper.decodeType(y); + if (result.left == Util.GuiHelper.GuiType.ITEM) { + ItemStack item = player.getHeldItem(); + if (item == null || !(item.getItem() instanceof IItemInventory)) { + return null; + } + T inv = getItemInventory( + ((IItemInventory) item.getItem()).getInventory(item, world, x, result.right, z, player)); + return inv != null ? createClientGui(player, inv) : null; + } else { + return super.createClientGui(player, world, x, result.right, z, face); + } + + } + +} diff --git a/src/main/java/com/glodblock/github/inventory/item/IItemInventory.java b/src/main/java/com/glodblock/github/inventory/item/IItemInventory.java index e6b85ac4..f1bf2bed 100644 --- a/src/main/java/com/glodblock/github/inventory/item/IItemInventory.java +++ b/src/main/java/com/glodblock/github/inventory/item/IItemInventory.java @@ -1,9 +1,10 @@ package com.glodblock.github.inventory.item; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public interface IItemInventory { - Object getInventory(ItemStack stack, World world, int x, int y, int z); + Object getInventory(ItemStack stack, World world, int x, int y, int z, EntityPlayer player); } diff --git a/src/main/java/com/glodblock/github/inventory/item/IWirelessTerminal.java b/src/main/java/com/glodblock/github/inventory/item/IWirelessTerminal.java new file mode 100644 index 00000000..1c4d1317 --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/item/IWirelessTerminal.java @@ -0,0 +1,9 @@ +package com.glodblock.github.inventory.item; + +import appeng.api.implementations.tiles.IViewCellStorage; +import appeng.api.networking.IGridHost; +import appeng.tile.inventory.IAEAppEngInventory; + +public interface IWirelessTerminal extends IFluidPortableCell, IViewCellStorage, IAEAppEngInventory, IGridHost { + +} diff --git a/src/main/java/com/glodblock/github/inventory/item/WirelessTerminal.java b/src/main/java/com/glodblock/github/inventory/item/WirelessTerminal.java new file mode 100644 index 00000000..268e9b16 --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/item/WirelessTerminal.java @@ -0,0 +1,126 @@ +package com.glodblock.github.inventory.item; + +import java.util.Objects; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.config.*; +import appeng.api.implementations.items.IAEItemPowerStorage; +import appeng.api.networking.IGridNode; +import appeng.api.storage.IMEInventoryHandler; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.MEMonitorHandler; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AECableType; +import appeng.api.util.IConfigManager; +import appeng.items.contents.WirelessTerminalViewCells; +import appeng.items.tools.powered.ToolWirelessTerminal; +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.tile.inventory.InvOperation; +import appeng.util.ConfigManager; +import appeng.util.Platform; + +import com.glodblock.github.util.BlockPos; +import com.glodblock.github.util.Util; + +public class WirelessTerminal extends MEMonitorHandler implements IWirelessTerminal { + + private final ItemStack target; + private final IAEItemPowerStorage ips; + private final EntityPlayer p; + private final int inventorySlot; + private final AppEngInternalInventory viewCell; + private final BlockPos pos; + private final StorageChannel channel; + + @SuppressWarnings("unchecked") + public WirelessTerminal(final ItemStack is, BlockPos pos, EntityPlayer player) { + super( + (IMEInventoryHandler) Objects + .requireNonNull(Util.getWirelessInv(is, pos, StorageChannel.FLUIDS))); + this.ips = (ToolWirelessTerminal) is.getItem(); + this.target = is; + this.p = player; + this.pos = pos; + this.inventorySlot = p.inventory.currentItem; + this.viewCell = new WirelessTerminalViewCells(is); + this.channel = StorageChannel.FLUIDS; + } + + @Override + public ItemStack getItemStack() { + return this.target; + } + + @Override + public double extractAEPower(double amt, Actionable mode, PowerMultiplier usePowerMultiplier) { + amt = usePowerMultiplier.multiply(amt); + if (mode == Actionable.SIMULATE) { + return usePowerMultiplier.divide(Math.min(amt, this.ips.getAECurrentPower(this.target))); + } + return usePowerMultiplier.divide(this.ips.extractAEPower(this.target, amt)); + } + + @Override + public IMEMonitor getItemInventory() { + return null; + } + + @Override + public IMEMonitor getFluidInventory() { + return this; + } + + @Override + public IConfigManager getConfigManager() { + final ConfigManager out = new ConfigManager((manager, settingName, newValue) -> { + final NBTTagCompound data = Platform.openNbtData(this.target); + manager.writeToNBT(data); + }); + out.registerSetting(Settings.SORT_BY, SortOrder.NAME); + out.registerSetting(Settings.VIEW_MODE, ViewItems.ALL); + out.registerSetting(Settings.SORT_DIRECTION, SortDir.ASCENDING); + out.readFromNBT((NBTTagCompound) Platform.openNbtData(this.target).copy()); + return out; + } + + @Override + public int getInventorySlot() { + return this.inventorySlot; + } + + @Override + public IInventory getViewCellStorage() { + return this.viewCell; + } + + @Override + public IGridNode getGridNode(ForgeDirection dir) { + return Util.getWirelessGrid(this.target, this.pos, this.channel); + } + + @Override + public AECableType getCableConnectionType(ForgeDirection dir) { + return AECableType.NONE; + } + + @Override + public void securityBreak() { + this.getGridNode(ForgeDirection.UNKNOWN).getMachine().securityBreak(); + } + + @Override + public void saveChanges() { + + } + + @Override + public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, + ItemStack newStack) {} +} diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index d9cb81c7..cff959ab 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -32,6 +32,7 @@ public class ItemAndBlockHolder { public static ItemFluidStorageMonitor FLUID_STORAGE_MONITOR = new ItemFluidStorageMonitor().register(); public static ItemFluidConversionMonitor FLUID_CONVERSION_MONITOR = new ItemFluidConversionMonitor().register(); public static ItemPortableFluidCell PORTABLE_FLUID_CELL = new ItemPortableFluidCell().register(); + public static ItemWirelessFluidTerminal WIRELESS_FLUID_TERM = new ItemWirelessFluidTerminal().register(); public static ItemFluidPacket PACKET = new ItemFluidPacket().register(); public static ItemBasicFluidStorageCell CELL1K = new ItemBasicFluidStorageCell(CellType.Cell1kPart, 1).register(); public static ItemBasicFluidStorageCell CELL4K = new ItemBasicFluidStorageCell(CellType.Cell4kPart, 4).register(); diff --git a/src/main/java/com/glodblock/github/loader/RecipeLoader.java b/src/main/java/com/glodblock/github/loader/RecipeLoader.java index d25d751f..82ab27f7 100644 --- a/src/main/java/com/glodblock/github/loader/RecipeLoader.java +++ b/src/main/java/com/glodblock/github/loader/RecipeLoader.java @@ -128,6 +128,7 @@ public class RecipeLoader implements Runnable { AE2_INTERFACE)); GameRegistry.addShapelessRecipe(FLUID_INTERFACE.stack(), INTERFACE.stack()); GameRegistry.addShapelessRecipe(INTERFACE.stack(), FLUID_INTERFACE.stack()); + GameRegistry.addShapelessRecipe(WIRELESS_FLUID_TERM.stack(), AE2_TERMINAL, BUFFER.stack()); GameRegistry .addRecipe(new ShapedOreRecipe(CERTUS_QUARTZ_TANK.stack(), "GGG", "G G", "GGG", 'G', AE2_QUARTZ_GLASS)); GameRegistry.addShapelessRecipe(FLUID_AUTO_FILLER.stack(), FLUID_TERMINAL, ENCODER); diff --git a/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java b/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java index ed9bd861..d4fc285e 100644 --- a/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java +++ b/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java @@ -14,6 +14,7 @@ import appeng.container.ContainerOpenContext; import com.glodblock.github.inventory.InventoryHandler; import com.glodblock.github.inventory.gui.GuiType; import com.glodblock.github.util.BlockPos; +import com.glodblock.github.util.Util; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; @@ -60,15 +61,25 @@ public class CPacketSwitchGuis implements IMessage { return null; } TileEntity te = context.getTile(); - if (te == null) { - return null; + if (te != null) { + InventoryHandler.openGui( + player, + player.worldObj, + new BlockPos(te), + Objects.requireNonNull(context.getSide()), + message.guiType); + } else { + InventoryHandler.openGui( + player, + player.worldObj, + new BlockPos( + (int) player.posX, + Util.GuiHelper.encodeType((int) player.posY, Util.GuiHelper.GuiType.ITEM), + (int) player.posZ), + Objects.requireNonNull(context.getSide()), + message.guiType); } - InventoryHandler.openGui( - player, - player.worldObj, - new BlockPos(te), - Objects.requireNonNull(context.getSide()), - message.guiType); + return null; } } diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index c63698e0..9b9c7d2a 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -36,6 +36,7 @@ public class NameConst { public static final String ITEM_FLUID_PACKET = "fluid_packet"; public static final String ITEM_FLUID_STORAGE = "fluid_storage"; public static final String ITEM_FLUID_PORTABLE_CELL = "portable_fluid_cell"; + public static final String ITEM_WIRELESS_FLUID_TERMINAL = "wireless_fluid_terminal"; public static final String ITEM_FLUID_PART = "fluid_part"; public static final String TT_KEY = FluidCraft.MODID + ".tooltip."; diff --git a/src/main/java/com/glodblock/github/util/Util.java b/src/main/java/com/glodblock/github/util/Util.java index 75996c79..ed4bb923 100644 --- a/src/main/java/com/glodblock/github/util/Util.java +++ b/src/main/java/com/glodblock/github/util/Util.java @@ -15,17 +15,25 @@ import org.apache.commons.lang3.tuple.MutablePair; import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; +import appeng.api.implementations.tiles.IWirelessAccessPoint; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; import appeng.api.networking.security.ISecurityGrid; +import appeng.api.networking.storage.IBaseMonitor; +import appeng.api.networking.storage.IStorageGrid; import appeng.api.parts.IPart; +import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEStack; +import appeng.api.util.WorldCoord; import appeng.tile.networking.TileCableBus; +import appeng.tile.networking.TileWireless; import appeng.util.item.AEFluidStack; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.common.item.ItemWirelessFluidTerminal; import com.glodblock.github.inventory.IAEFluidTank; import cpw.mods.fml.common.ModContainer; @@ -34,6 +42,39 @@ import io.netty.buffer.ByteBuf; public final class Util { + public static IGridNode getWirelessGrid(ItemStack is, BlockPos pos, StorageChannel channel) { + String key = ((ItemWirelessFluidTerminal) is.getItem()).getEncryptionKey(is); + IGridHost securityTerminal = (IGridHost) AEApi.instance().registries().locatable() + .getLocatableBy(Long.parseLong(key)); + if (securityTerminal == null) return null; + return securityTerminal.getGridNode(ForgeDirection.UNKNOWN); + } + + @SuppressWarnings("unchecked") + public static IBaseMonitor>> getWirelessInv(ItemStack is, BlockPos pos, + StorageChannel channel) { + IGridNode gridNode = getWirelessGrid(is, pos, channel); + if (gridNode == null) return null; + IGrid grid = gridNode.getGrid(); + if (grid == null) return null; + for (IGridNode node : grid.getMachines(TileWireless.class)) { + IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node.getMachine(); + WorldCoord distance = accessPoint.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); + int squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; + if (squaredDistance <= accessPoint.getRange() * accessPoint.getRange()) { + IStorageGrid gridCache = grid.getCache(IStorageGrid.class); + if (gridCache != null) { + if (channel == StorageChannel.FLUIDS) { + return gridCache.getFluidInventory(); + } else { + return gridCache.getItemInventory(); + } + } + } + } + return null; + } + public static int findItemInPlayerInvSlot(EntityPlayer player, ItemStack itemStack) { for (int i = 0; i < player.inventory.mainInventory.length; i++) { if (player.inventory.mainInventory[i] != null && player.inventory.mainInventory[i] == itemStack) return i; @@ -218,6 +259,31 @@ public final class Util { } } + public static class GuiHelper { + + public enum GuiType { + TILE, + ITEM + } + + private static final int value = 1 << 30; + + public static int encodeType(int y, GuiType type) { + if (y > (1 << 28)) { + throw new IllegalArgumentException("out of range"); + } + return value | (type.ordinal() << 29) | y; + } + + public static MutablePair decodeType(int y) { + if (y > (1 << 28)) { + return new MutablePair<>(GuiType.values()[y >> 29 & 1], y - (3 << 29 & y)); + } else { + return new MutablePair<>(GuiType.TILE, y); + } + } + } + public static int clamp(int value, int min, int max) { return value < min ? min : (Math.min(value, max)); } diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index a37d433d..656ed926 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -11,6 +11,7 @@ item.part_fluid_level_emitter.name=ME Fluid Level Emitter item.part_fluid_storage_monitor.name=ME Fluid Storage Monitor item.part_fluid_conversion_monitor.name=ME Fluid Conversion Monitor item.portable_fluid_cell.name=Portable Fluid Cell +item.wireless_fluid_terminal.name=Wireless Fluid Terminal item.fluid_packet.name=Fluid Packet item.fluid_storage.1.name=%s1k%s ME Fluid Storage Cell item.fluid_storage.4.name=%s4k%s ME Fluid Storage Cell diff --git a/src/main/resources/assets/ae2fc/textures/items/wireless_fluid_terminal.png b/src/main/resources/assets/ae2fc/textures/items/wireless_fluid_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..138c8056adef751504d2065557130b04903c51bf GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z_$#98Qbry z%m)femAFQf1m~xflqVLYG6W=M=9TFAxrQi|8S9zq85+8Ob}|R5+U)7#7-Hdnbdn?2 zAp-%|V%b)`T?W$T!7RC^U-{ycwcjgS_8*sgzFb&mNnp01Jdfn5`S(5R&-y=jJ$LI| z{x<#R()wl>zgc&@@Mqf=SG--_PPQZV_6bXoUm>%rLd}jp(01Z@8v@O1TaS?83{1OSMNc~k%Z literal 0 HcmV?d00001 From 2eb1854edac023a1d220f1ee2d45610ea4ead538 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Tue, 31 Jan 2023 10:49:19 +0800 Subject: [PATCH 6/9] network update flag --- .../com/glodblock/github/common/parts/base/FCPartMonitor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/glodblock/github/common/parts/base/FCPartMonitor.java b/src/main/java/com/glodblock/github/common/parts/base/FCPartMonitor.java index f7f2070f..653160d2 100644 --- a/src/main/java/com/glodblock/github/common/parts/base/FCPartMonitor.java +++ b/src/main/java/com/glodblock/github/common/parts/base/FCPartMonitor.java @@ -111,14 +111,16 @@ public abstract class FCPartMonitor extends AbstractPartDisplay implements IPart boolean needRedraw = super.readFromStream(data); final boolean isLocked = data.readBoolean(); - needRedraw = this.isLocked != isLocked; + needRedraw |= this.isLocked != isLocked; this.isLocked = isLocked; final boolean val = data.readBoolean(); if (val) { + needRedraw |= this.configuredFluid == null; this.configuredFluid = AEFluidStack.loadFluidStackFromPacket(data); } else { + needRedraw |= this.configuredFluid != null; this.configuredFluid = null; } From 7f53e011842d509908c5c580fa6341024ac458dc Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Tue, 31 Jan 2023 15:50:45 +0800 Subject: [PATCH 7/9] add wireless fluid pattern terminal --- ...GuiFluidPatternTerminalCraftingStatus.java | 11 +- .../client/gui/GuiPatternPortableCell.java | 12 + .../ContainerPatternPortableCell.java | 69 ++++ .../base/FCContainerEncodeTerminal.java | 11 +- .../common/item/ItemBaseWirelessTerminal.java | 85 +++++ .../item/ItemWirelessFluidTerminal.java | 69 +--- .../item/ItemWirelessPatternTerminal.java | 50 +++ .../parts/base/FCFluidEncodeTerminal.java | 3 +- .../inventory/ItemBiggerAppEngInventory.java | 25 ++ .../WirelessFluidPatternTerminalPatterns.java | 22 ++ .../github/inventory/gui/GuiType.java | 12 + .../github/inventory/gui/ItemGuiFactory.java | 4 + .../item/IWirelessPatternTerminal.java | 5 + .../inventory/item/PatternTerminal.java | 44 +++ ...rminal.java => WirelessFluidTerminal.java} | 15 +- .../item/WirelessPatternTerminal.java | 309 ++++++++++++++++++ .../github/loader/ItemAndBlockHolder.java | 1 + .../glodblock/github/nei/NEI_FC_Config.java | 5 + .../network/CPacketFluidPatternTermBtns.java | 1 + .../github/network/CPacketSwitchGuis.java | 6 +- .../com/glodblock/github/util/NameConst.java | 1 + .../java/com/glodblock/github/util/Util.java | 30 +- .../resources/assets/ae2fc/lang/en_US.lang | 1 + .../resources/assets/ae2fc/lang/zh_CN.lang | 8 +- .../items/wireless_fluid_pattern_terminal.png | Bin 0 -> 15831 bytes 25 files changed, 708 insertions(+), 91 deletions(-) create mode 100644 src/main/java/com/glodblock/github/client/gui/GuiPatternPortableCell.java create mode 100644 src/main/java/com/glodblock/github/client/gui/container/ContainerPatternPortableCell.java create mode 100644 src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java create mode 100644 src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java create mode 100644 src/main/java/com/glodblock/github/inventory/ItemBiggerAppEngInventory.java create mode 100644 src/main/java/com/glodblock/github/inventory/WirelessFluidPatternTerminalPatterns.java create mode 100644 src/main/java/com/glodblock/github/inventory/item/IWirelessPatternTerminal.java create mode 100644 src/main/java/com/glodblock/github/inventory/item/PatternTerminal.java rename src/main/java/com/glodblock/github/inventory/item/{WirelessTerminal.java => WirelessFluidTerminal.java} (89%) create mode 100644 src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java create mode 100644 src/main/resources/assets/ae2fc/textures/items/wireless_fluid_pattern_terminal.png diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java index d590602e..f93c569c 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidPatternTerminalCraftingStatus.java @@ -13,7 +13,8 @@ import com.glodblock.github.common.parts.PartFluidPatternTerminalEx; import com.glodblock.github.common.parts.PartFluidTerminal; import com.glodblock.github.inventory.InventoryHandler; import com.glodblock.github.inventory.gui.GuiType; -import com.glodblock.github.inventory.item.WirelessTerminal; +import com.glodblock.github.inventory.item.WirelessFluidTerminal; +import com.glodblock.github.inventory.item.WirelessPatternTerminal; import com.glodblock.github.loader.ItemAndBlockHolder; import com.glodblock.github.util.Ae2ReflectClient; @@ -35,8 +36,10 @@ public class GuiFluidPatternTerminalCraftingStatus extends GuiCraftingStatus { Ae2ReflectClient.rewriteIcon(this, new ItemStack(ItemAndBlockHolder.FLUID_TERMINAL_EX, 1)); else if (host instanceof PartFluidTerminal) { Ae2ReflectClient.rewriteIcon(this, new ItemStack(ItemAndBlockHolder.FLUID_TERM, 1)); - } else if (host instanceof WirelessTerminal) { + } else if (host instanceof WirelessFluidTerminal) { Ae2ReflectClient.rewriteIcon(this, new ItemStack(ItemAndBlockHolder.WIRELESS_FLUID_TERM, 1)); + } else if (host instanceof WirelessPatternTerminal) { + Ae2ReflectClient.rewriteIcon(this, new ItemStack(ItemAndBlockHolder.WIRELESS_PATTERN_TERM, 1)); } super.initGui(); @@ -50,7 +53,9 @@ public class GuiFluidPatternTerminalCraftingStatus extends GuiCraftingStatus { else if (host instanceof PartFluidPatternTerminalEx) InventoryHandler.switchGui(GuiType.FLUID_PATTERN_TERMINAL_EX); else if (host instanceof PartFluidTerminal) InventoryHandler.switchGui(GuiType.FLUID_TERMINAL); - else if (host instanceof WirelessTerminal) InventoryHandler.switchGui(GuiType.WIRELESS_FLUID_TERMINAL); + else if (host instanceof WirelessFluidTerminal) InventoryHandler.switchGui(GuiType.WIRELESS_FLUID_TERMINAL); + else if (host instanceof WirelessPatternTerminal) + InventoryHandler.switchGui(GuiType.WIRELESS_FLUID_PATTERN_TERMINAL); } else { super.actionPerformed(btn); } diff --git a/src/main/java/com/glodblock/github/client/gui/GuiPatternPortableCell.java b/src/main/java/com/glodblock/github/client/gui/GuiPatternPortableCell.java new file mode 100644 index 00000000..aca7de2b --- /dev/null +++ b/src/main/java/com/glodblock/github/client/gui/GuiPatternPortableCell.java @@ -0,0 +1,12 @@ +package com.glodblock.github.client.gui; + +import net.minecraft.entity.player.InventoryPlayer; + +import com.glodblock.github.inventory.item.IWirelessTerminal; + +public class GuiPatternPortableCell extends GuiFluidPatternTerminal { + + public GuiPatternPortableCell(InventoryPlayer inventoryPlayer, IWirelessTerminal te) { + super(inventoryPlayer, te); + } +} diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerPatternPortableCell.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerPatternPortableCell.java new file mode 100644 index 00000000..319efe07 --- /dev/null +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerPatternPortableCell.java @@ -0,0 +1,69 @@ +package com.glodblock.github.client.gui.container; + +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; + +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.util.Platform; + +import com.glodblock.github.inventory.item.IWirelessTerminal; + +public class ContainerPatternPortableCell extends ContainerFluidPatternTerminal { + + private double powerMultiplier = 0.5; + private final IWirelessTerminal civ; + private int ticks = 0; + private final int slot; + + public ContainerPatternPortableCell(InventoryPlayer ip, IWirelessTerminal monitorable) { + super(ip, monitorable); + if (monitorable != null) { + final int slotIndex = monitorable.getInventorySlot(); + this.lockPlayerInventorySlot(slotIndex); + this.slot = slotIndex; + } else { + this.slot = -1; + this.lockPlayerInventorySlot(ip.currentItem); + } + this.civ = monitorable; + } + + public void detectAndSendChanges() { + final ItemStack currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() + : this.getPlayerInv().getStackInSlot(this.slot); + if (this.civ != null) { + if (currentItem != this.civ.getItemStack()) { + if (currentItem != null) { + if (Platform.isSameItem(this.civ.getItemStack(), currentItem)) { + this.getPlayerInv() + .setInventorySlotContents(this.getPlayerInv().currentItem, this.civ.getItemStack()); + } else { + this.setValidContainer(false); + } + } else { + this.setValidContainer(false); + } + } + } else { + this.setValidContainer(false); + } + this.ticks++; + if (this.ticks > 10 && this.civ != null) { + this.civ.extractAEPower( + this.getPowerMultiplier() * this.ticks, + Actionable.MODULATE, + PowerMultiplier.CONFIG); + this.ticks = 0; + } + super.detectAndSendChanges(); + } + + private double getPowerMultiplier() { + return this.powerMultiplier; + } + + void setPowerMultiplier(final double powerMultiplier) { + this.powerMultiplier = powerMultiplier; + } +} diff --git a/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java b/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java index d51fb67b..b05db36e 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java +++ b/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java @@ -36,8 +36,8 @@ import com.glodblock.github.client.gui.container.ContainerItemMonitor; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidEncodedPattern; import com.glodblock.github.common.item.ItemFluidPacket; -import com.glodblock.github.common.parts.base.FCFluidEncodeTerminal; import com.glodblock.github.inventory.IPatternConsumer; +import com.glodblock.github.inventory.item.PatternTerminal; import com.glodblock.github.loader.ItemAndBlockHolder; import com.glodblock.github.util.FluidPatternDetails; import com.glodblock.github.util.Util; @@ -45,7 +45,7 @@ import com.glodblock.github.util.Util; public abstract class FCContainerEncodeTerminal extends ContainerItemMonitor implements IAEAppEngInventory, IOptionalSlotHost, IContainerCraftingPacket, IPatternConsumer { - protected final FCFluidEncodeTerminal patternTerminal; + protected final PatternTerminal patternTerminal; protected final AppEngInternalInventory cOut = new AppEngInternalInventory(null, 1); protected final IInventory crafting; protected final SlotRestrictedInput patternSlotIN; @@ -77,7 +77,7 @@ public abstract class FCContainerEncodeTerminal extends ContainerItemMonitor public FCContainerEncodeTerminal(final InventoryPlayer ip, final ITerminalHost monitorable) { super(ip, monitorable); - this.patternTerminal = (FCFluidEncodeTerminal) monitorable; + this.patternTerminal = (PatternTerminal) monitorable; this.inverted = patternTerminal.isInverted(); final IInventory patternInv = this.patternTerminal.getInventoryByName("pattern"); this.crafting = this.patternTerminal.getInventoryByName("crafting"); @@ -170,7 +170,7 @@ public abstract class FCContainerEncodeTerminal extends ContainerItemMonitor } } - public FCFluidEncodeTerminal getPatternTerminal() { + public PatternTerminal getPatternTerminal() { return this.patternTerminal; } @@ -368,13 +368,11 @@ public abstract class FCContainerEncodeTerminal extends ContainerItemMonitor for (final ItemStack encodedPatternStack : AEApi.instance().definitions().items().encodedPattern() .maybeStack(1).asSet()) { output = encodedPatternStack; - this.patternSlotOUT.putStack(output); } } else if (output.getItem() instanceof ItemFluidEncodedPattern) { for (final ItemStack encodedPatternStack : AEApi.instance().definitions().items().encodedPattern() .maybeStack(1).asSet()) { output = encodedPatternStack; - this.patternSlotOUT.putStack(output); } } @@ -399,6 +397,7 @@ public abstract class FCContainerEncodeTerminal extends ContainerItemMonitor encodedValue.setBoolean("beSubstitute", this.beSubstitute); encodedValue.setBoolean("prioritize", this.prioritize); output.setTagCompound(encodedValue); + this.patternSlotOUT.putStack(output); } protected ItemStack[] getInputs() { diff --git a/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java new file mode 100644 index 00000000..025a32d2 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java @@ -0,0 +1,85 @@ +package com.glodblock.github.common.item; + +import java.util.Optional; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.AEApi; +import appeng.api.features.ILocatable; +import appeng.api.features.IWirelessTermHandler; +import appeng.api.features.IWirelessTermRegistry; +import appeng.core.localization.PlayerMessages; +import appeng.items.tools.powered.ToolWirelessTerminal; + +import com.glodblock.github.inventory.InventoryHandler; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.IItemInventory; +import com.glodblock.github.util.BlockPos; + +public class ItemBaseWirelessTerminal extends ToolWirelessTerminal implements IItemInventory { + + protected GuiType type; + + public ItemBaseWirelessTerminal(GuiType t) { + super(); + this.type = Optional.of(t).get(); + } + + @Override + public ItemStack onItemRightClick(final ItemStack item, final World w, final EntityPlayer player) { + IWirelessTermRegistry term = AEApi.instance().registries().wireless(); + if (!term.isWirelessTerminal(item)) { + player.addChatMessage(PlayerMessages.DeviceNotWirelessTerminal.get()); + return item; + } + final IWirelessTermHandler handler = term.getWirelessTerminalHandler(item); + final String unparsedKey = handler.getEncryptionKey(item); + if (unparsedKey.isEmpty()) { + player.addChatMessage(PlayerMessages.DeviceNotLinked.get()); + return item; + } + final long parsedKey = Long.parseLong(unparsedKey); + final ILocatable securityStation = AEApi.instance().registries().locatable().getLocatableBy(parsedKey); + if (securityStation == null) { + player.addChatMessage(PlayerMessages.StationCanNotBeLocated.get()); + return item; + } + if (handler.hasPower(player, 0.5, item)) { + InventoryHandler.openGui( + player, + w, + new BlockPos(player.inventory.currentItem, 0, 0), + ForgeDirection.UNKNOWN, + this.type); + } else { + player.addChatMessage(PlayerMessages.DeviceNotPowered.get()); + } + + return item; + } + + @Override + public boolean canHandle(final ItemStack is) { + return is.getItem() == this; + } + + public ItemStack stack() { + return new ItemStack(this, 1); + } + + @Override + public Object getInventory(ItemStack stack, World world, int x, int y, int z, EntityPlayer player) { + return null; + } + + public void setGuiType(GuiType type) { + this.type = type; + } + + public GuiType guiGuiType() { + return this.type; + } +} diff --git a/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java index 505df3fe..5a95384e 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java +++ b/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java @@ -3,74 +3,31 @@ package com.glodblock.github.common.item; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; import appeng.api.AEApi; -import appeng.api.features.ILocatable; -import appeng.api.features.IWirelessTermHandler; -import appeng.api.features.IWirelessTermRegistry; +import appeng.api.networking.IGridNode; import appeng.core.localization.PlayerMessages; -import appeng.items.tools.powered.ToolWirelessTerminal; +import appeng.util.Platform; import com.glodblock.github.FluidCraft; import com.glodblock.github.common.tabs.FluidCraftingTabs; -import com.glodblock.github.inventory.InventoryHandler; import com.glodblock.github.inventory.gui.GuiType; -import com.glodblock.github.inventory.item.IItemInventory; -import com.glodblock.github.inventory.item.WirelessTerminal; +import com.glodblock.github.inventory.item.WirelessFluidTerminal; import com.glodblock.github.loader.IRegister; -import com.glodblock.github.util.BlockPos; import com.glodblock.github.util.NameConst; +import com.glodblock.github.util.Util; import cpw.mods.fml.common.registry.GameRegistry; -public class ItemWirelessFluidTerminal extends ToolWirelessTerminal - implements IItemInventory, IRegister { +public class ItemWirelessFluidTerminal extends ItemBaseWirelessTerminal + implements IRegister { public ItemWirelessFluidTerminal() { - super(); + super(GuiType.WIRELESS_FLUID_TERMINAL); AEApi.instance().registries().wireless().registerWirelessHandler(this); setUnlocalizedName(NameConst.ITEM_WIRELESS_FLUID_TERMINAL); setTextureName(FluidCraft.resource(NameConst.ITEM_WIRELESS_FLUID_TERMINAL).toString()); } - @Override - public ItemStack onItemRightClick(final ItemStack item, final World w, final EntityPlayer player) { - IWirelessTermRegistry term = AEApi.instance().registries().wireless(); - if (!term.isWirelessTerminal(item)) { - player.addChatMessage(PlayerMessages.DeviceNotWirelessTerminal.get()); - return item; - } - final IWirelessTermHandler handler = term.getWirelessTerminalHandler(item); - final String unparsedKey = handler.getEncryptionKey(item); - if (unparsedKey.isEmpty()) { - player.addChatMessage(PlayerMessages.DeviceNotLinked.get()); - return item; - } - final long parsedKey = Long.parseLong(unparsedKey); - final ILocatable securityStation = AEApi.instance().registries().locatable().getLocatableBy(parsedKey); - if (securityStation == null) { - player.addChatMessage(PlayerMessages.StationCanNotBeLocated.get()); - return item; - } - if (handler.hasPower(player, 0.5, item)) { - InventoryHandler.openGui( - player, - w, - new BlockPos((int) player.posX, (int) player.posY, (int) player.posZ), - ForgeDirection.UNKNOWN, - GuiType.WIRELESS_FLUID_TERMINAL); - } else { - player.addChatMessage(PlayerMessages.DeviceNotPowered.get()); - } - - return item; - } - - @Override - public boolean canHandle(final ItemStack is) { - return is.getItem() == this; - } - @Override public ItemWirelessFluidTerminal register() { GameRegistry.registerItem(this, NameConst.ITEM_WIRELESS_FLUID_TERMINAL, FluidCraft.MODID); @@ -81,14 +38,14 @@ public class ItemWirelessFluidTerminal extends ToolWirelessTerminal @Override public Object getInventory(ItemStack stack, World world, int x, int y, int z, EntityPlayer player) { try { - return new WirelessTerminal(stack, new BlockPos(x, y, z, world), player); + IGridNode gridNode = Util.getWirelessGrid(stack); + if (gridNode != null) { + return new WirelessFluidTerminal(stack, x, gridNode, player); + } } catch (Exception e) { - player.addChatMessage(PlayerMessages.OutOfRange.get()); - return null; + if (Platform.isClient()) player.addChatMessage(PlayerMessages.OutOfRange.get()); } + return null; } - public ItemStack stack() { - return new ItemStack(this, 1); - } } diff --git a/src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java new file mode 100644 index 00000000..6caf4e22 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java @@ -0,0 +1,50 @@ +package com.glodblock.github.common.item; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import appeng.api.AEApi; +import appeng.api.networking.IGridNode; +import appeng.core.localization.PlayerMessages; +import appeng.util.Platform; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.WirelessPatternTerminal; +import com.glodblock.github.loader.IRegister; +import com.glodblock.github.util.NameConst; +import com.glodblock.github.util.Util; +import cpw.mods.fml.common.registry.GameRegistry; + +public class ItemWirelessPatternTerminal extends ItemBaseWirelessTerminal + implements IRegister { + + public ItemWirelessPatternTerminal() { + super(GuiType.WIRELESS_FLUID_PATTERN_TERMINAL); + AEApi.instance().registries().wireless().registerWirelessHandler(this); + setUnlocalizedName(NameConst.ITEM_WIRELESS_FLUID_PATTERN_TERMINAL); + setTextureName(FluidCraft.resource(NameConst.ITEM_WIRELESS_FLUID_PATTERN_TERMINAL).toString()); + } + + @Override + public ItemWirelessPatternTerminal register() { + GameRegistry.registerItem(this, NameConst.ITEM_WIRELESS_FLUID_PATTERN_TERMINAL, FluidCraft.MODID); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + @Override + public Object getInventory(ItemStack stack, World world, int x, int y, int z, EntityPlayer player) { + try { + IGridNode gridNode = Util.getWirelessGrid(stack); + if (gridNode != null) { + return new WirelessPatternTerminal(stack, x, gridNode, player); + } + } catch (Exception e) { + if (Platform.isClient()) player.addChatMessage(PlayerMessages.OutOfRange.get()); + } + return null; + } +} diff --git a/src/main/java/com/glodblock/github/common/parts/base/FCFluidEncodeTerminal.java b/src/main/java/com/glodblock/github/common/parts/base/FCFluidEncodeTerminal.java index 75e6ff4f..dc8e9c36 100644 --- a/src/main/java/com/glodblock/github/common/parts/base/FCFluidEncodeTerminal.java +++ b/src/main/java/com/glodblock/github/common/parts/base/FCFluidEncodeTerminal.java @@ -11,8 +11,9 @@ import appeng.api.storage.data.IAEItemStack; import appeng.tile.inventory.AppEngInternalInventory; import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.inventory.item.PatternTerminal; -public abstract class FCFluidEncodeTerminal extends FCPart { +public abstract class FCFluidEncodeTerminal extends FCPart implements PatternTerminal { protected AppEngInternalInventory crafting; protected AppEngInternalInventory output; diff --git a/src/main/java/com/glodblock/github/inventory/ItemBiggerAppEngInventory.java b/src/main/java/com/glodblock/github/inventory/ItemBiggerAppEngInventory.java new file mode 100644 index 00000000..ab897af2 --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/ItemBiggerAppEngInventory.java @@ -0,0 +1,25 @@ +package com.glodblock.github.inventory; + +import net.minecraft.item.ItemStack; + +import appeng.tile.inventory.BiggerAppEngInventory; +import appeng.util.Platform; + +public class ItemBiggerAppEngInventory extends BiggerAppEngInventory { + + private final ItemStack is; + private final String name; + + public ItemBiggerAppEngInventory(ItemStack is, String name, int size) { + super(null, size); + this.name = name; + this.is = is; + this.readFromNBT(Platform.openNbtData(is), name); + } + + @Override + public void markDirty() { + this.writeToNBT(Platform.openNbtData(is), this.name); + } + +} diff --git a/src/main/java/com/glodblock/github/inventory/WirelessFluidPatternTerminalPatterns.java b/src/main/java/com/glodblock/github/inventory/WirelessFluidPatternTerminalPatterns.java new file mode 100644 index 00000000..b95cbdfa --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/WirelessFluidPatternTerminalPatterns.java @@ -0,0 +1,22 @@ +package com.glodblock.github.inventory; + +import net.minecraft.item.ItemStack; + +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.util.Platform; + +public class WirelessFluidPatternTerminalPatterns extends AppEngInternalInventory { + + private final ItemStack is; + + public WirelessFluidPatternTerminalPatterns(final ItemStack is) { + super(null, 2); + this.is = is; + this.readFromNBT(Platform.openNbtData(is), "pattern"); + } + + @Override + public void markDirty() { + this.writeToNBT(Platform.openNbtData(is), "pattern"); + } +} diff --git a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java index acae829e..540e9afc 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java @@ -220,6 +220,18 @@ public enum GuiType { return new GuiFluidPortableCell(player.inventory, inv); } }), + WIRELESS_FLUID_PATTERN_TERMINAL(new ItemGuiFactory(IWirelessTerminal.class) { + + @Override + protected Object createServerGui(EntityPlayer player, IWirelessTerminal inv) { + return new ContainerPatternPortableCell(player.inventory, inv); + } + + @Override + protected Object createClientGui(EntityPlayer player, IWirelessTerminal inv) { + return new GuiPatternPortableCell(player.inventory, inv); + } + }), FLUID_PATTERN_TERMINAL(new PartGuiFactory(ITerminalHost.class) { diff --git a/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java b/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java index 6017171a..a6e4cc98 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java +++ b/src/main/java/com/glodblock/github/inventory/gui/ItemGuiFactory.java @@ -2,6 +2,7 @@ package com.glodblock.github.inventory.gui; import javax.annotation.Nullable; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -60,6 +61,9 @@ public abstract class ItemGuiFactory implements IGuiFactory { return null; } T inv = getInventory(((IItemInventory) item.getItem()).getInventory(item, world, x, y, z, player)); + if (inv == null && Minecraft.getMinecraft().currentScreen != null) { + player.closeScreen(); + } return inv != null ? createClientGui(player, inv) : null; } diff --git a/src/main/java/com/glodblock/github/inventory/item/IWirelessPatternTerminal.java b/src/main/java/com/glodblock/github/inventory/item/IWirelessPatternTerminal.java new file mode 100644 index 00000000..cf845429 --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/item/IWirelessPatternTerminal.java @@ -0,0 +1,5 @@ +package com.glodblock.github.inventory.item; + +public interface IWirelessPatternTerminal extends IWirelessTerminal, PatternTerminal { + +} diff --git a/src/main/java/com/glodblock/github/inventory/item/PatternTerminal.java b/src/main/java/com/glodblock/github/inventory/item/PatternTerminal.java new file mode 100644 index 00000000..a2ea143b --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/item/PatternTerminal.java @@ -0,0 +1,44 @@ +package com.glodblock.github.inventory.item; + +import net.minecraft.inventory.IInventory; + +import appeng.api.storage.data.IAEItemStack; + +public interface PatternTerminal { + + boolean isInverted(); + + IInventory getInventoryByName(final String name); + + boolean canBeSubstitute(); + + boolean isPrioritize(); + + boolean isSubstitution(); + + boolean shouldCombine(); + + void onChangeCrafting(IAEItemStack[] newCrafting, IAEItemStack[] newOutput); + + void setCraftingRecipe(final boolean craftingMode); + + void setSubstitution(boolean canSubstitute); + + void setBeSubstitute(boolean canBeSubstitute); + + void setCombineMode(boolean shouldCombine); + + void setPrioritization(boolean canPrioritize); + + void setInverted(boolean inverted); + + int getActivePage(); + + void setActivePage(int activePage); + + boolean isCraftingRecipe(); + + void sortCraftingItems(); + + default void saveSettings() {} +} diff --git a/src/main/java/com/glodblock/github/inventory/item/WirelessTerminal.java b/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java similarity index 89% rename from src/main/java/com/glodblock/github/inventory/item/WirelessTerminal.java rename to src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java index 268e9b16..4a1425fb 100644 --- a/src/main/java/com/glodblock/github/inventory/item/WirelessTerminal.java +++ b/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java @@ -26,29 +26,28 @@ import appeng.tile.inventory.InvOperation; import appeng.util.ConfigManager; import appeng.util.Platform; -import com.glodblock.github.util.BlockPos; import com.glodblock.github.util.Util; -public class WirelessTerminal extends MEMonitorHandler implements IWirelessTerminal { +public class WirelessFluidTerminal extends MEMonitorHandler implements IWirelessTerminal { private final ItemStack target; private final IAEItemPowerStorage ips; private final EntityPlayer p; private final int inventorySlot; private final AppEngInternalInventory viewCell; - private final BlockPos pos; private final StorageChannel channel; + private final IGridNode grid; @SuppressWarnings("unchecked") - public WirelessTerminal(final ItemStack is, BlockPos pos, EntityPlayer player) { + public WirelessFluidTerminal(final ItemStack is, final int slot, IGridNode gridNode, EntityPlayer player) { super( (IMEInventoryHandler) Objects - .requireNonNull(Util.getWirelessInv(is, pos, StorageChannel.FLUIDS))); + .requireNonNull(Util.getWirelessInv(is, player, StorageChannel.FLUIDS))); this.ips = (ToolWirelessTerminal) is.getItem(); + this.grid = gridNode; this.target = is; this.p = player; - this.pos = pos; - this.inventorySlot = p.inventory.currentItem; + this.inventorySlot = slot; this.viewCell = new WirelessTerminalViewCells(is); this.channel = StorageChannel.FLUIDS; } @@ -102,7 +101,7 @@ public class WirelessTerminal extends MEMonitorHandler implements @Override public IGridNode getGridNode(ForgeDirection dir) { - return Util.getWirelessGrid(this.target, this.pos, this.channel); + return this.grid; } @Override diff --git a/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java b/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java new file mode 100644 index 00000000..1c73e4c2 --- /dev/null +++ b/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java @@ -0,0 +1,309 @@ +package com.glodblock.github.inventory.item; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.config.*; +import appeng.api.implementations.items.IAEItemPowerStorage; +import appeng.api.networking.IGridNode; +import appeng.api.storage.IMEInventoryHandler; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.MEMonitorHandler; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AECableType; +import appeng.api.util.IConfigManager; +import appeng.items.contents.WirelessTerminalViewCells; +import appeng.items.tools.powered.ToolWirelessTerminal; +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.tile.inventory.InvOperation; +import appeng.util.ConfigManager; +import appeng.util.Platform; + +import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.inventory.ItemBiggerAppEngInventory; +import com.glodblock.github.inventory.WirelessFluidPatternTerminalPatterns; +import com.glodblock.github.util.Util; + +public class WirelessPatternTerminal extends MEMonitorHandler implements IWirelessPatternTerminal { + + private final ItemStack target; + private final IAEItemPowerStorage ips; + private final EntityPlayer p; + private final int inventorySlot; + private final AppEngInternalInventory viewCell; + private final StorageChannel channel; + private final IGridNode grid; + + protected AppEngInternalInventory crafting; + protected AppEngInternalInventory output; + protected final WirelessFluidPatternTerminalPatterns pattern; + + protected boolean craftingMode = true; + protected boolean substitute = false; + protected boolean combine = false; + protected boolean prioritize = false; + protected boolean inverted = false; + protected boolean beSubstitute = false; + protected int activePage = 0; + + @SuppressWarnings("unchecked") + public WirelessPatternTerminal(final ItemStack is, final int slot, IGridNode gridNode, EntityPlayer player) { + super( + (IMEInventoryHandler) Objects + .requireNonNull(Util.getWirelessInv(is, player, StorageChannel.ITEMS))); + this.ips = (ToolWirelessTerminal) is.getItem(); + this.grid = gridNode; + this.target = is; + this.p = player; + this.inventorySlot = slot; + this.viewCell = new WirelessTerminalViewCells(is); + this.channel = StorageChannel.ITEMS; + this.pattern = new WirelessFluidPatternTerminalPatterns(is); + this.crafting = new ItemBiggerAppEngInventory(is, "crafting", 9); + this.output = new ItemBiggerAppEngInventory(is, "output", 3); + } + + @Override + public ItemStack getItemStack() { + return this.target; + } + + @Override + public double extractAEPower(double amt, Actionable mode, PowerMultiplier usePowerMultiplier) { + amt = usePowerMultiplier.multiply(amt); + if (mode == Actionable.SIMULATE) { + return usePowerMultiplier.divide(Math.min(amt, this.ips.getAECurrentPower(this.target))); + } + return usePowerMultiplier.divide(this.ips.extractAEPower(this.target, amt)); + } + + @Override + public IMEMonitor getItemInventory() { + return this; + } + + @Override + public IMEMonitor getFluidInventory() { + return null; + } + + public void readFromNBT() { + NBTTagCompound data = Platform.openNbtData(this.target); + this.setCraftingRecipe(data.getBoolean("craftingMode")); + this.setSubstitution(data.getBoolean("substitute")); + this.setCombineMode(data.getBoolean("combine")); + this.setBeSubstitute(data.getBoolean("beSubstitute")); + this.setPrioritization(data.getBoolean("priorization")); + this.setInverted(data.getBoolean("inverted")); + this.setActivePage(data.getInteger("activePage")); + } + + public void writeToNBT() { + NBTTagCompound data = Platform.openNbtData(this.target); + data.setBoolean("craftingMode", this.craftingMode); + data.setBoolean("substitute", this.substitute); + data.setBoolean("combine", this.combine); + data.setBoolean("beSubstitute", this.beSubstitute); + data.setBoolean("priorization", this.prioritize); + data.setBoolean("inverted", this.inverted); + data.setInteger("activePage", this.activePage); + } + + @Override + public IConfigManager getConfigManager() { + final ConfigManager out = new ConfigManager((manager, settingName, newValue) -> { + final NBTTagCompound data = Platform.openNbtData(this.target); + manager.writeToNBT(data); + + }); + out.registerSetting(Settings.SORT_BY, SortOrder.NAME); + out.registerSetting(Settings.VIEW_MODE, ViewItems.ALL); + out.registerSetting(Settings.SORT_DIRECTION, SortDir.ASCENDING); + out.readFromNBT((NBTTagCompound) Platform.openNbtData(this.target).copy()); + this.readFromNBT(); + return out; + } + + @Override + public int getInventorySlot() { + return this.inventorySlot; + } + + @Override + public IInventory getViewCellStorage() { + return this.viewCell; + } + + @Override + public IGridNode getGridNode(ForgeDirection dir) { + return this.grid; + } + + @Override + public AECableType getCableConnectionType(ForgeDirection dir) { + return AECableType.NONE; + } + + @Override + public void securityBreak() { + this.getGridNode(ForgeDirection.UNKNOWN).getMachine().securityBreak(); + } + + @Override + public void saveChanges() { + + } + + @Override + public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, + ItemStack newStack) {} + + @Override + public boolean isInverted() { + return this.inverted; + } + + @Override + public IInventory getInventoryByName(String name) { + if (name.equals("crafting")) { + return this.crafting; + } + + if (name.equals("output")) { + return this.output; + } + + if (name.equals("pattern")) { + return this.pattern; + } + + return null; + } + + @Override + public boolean canBeSubstitute() { + return this.beSubstitute; + } + + @Override + public boolean isPrioritize() { + return this.prioritize; + } + + @Override + public boolean isSubstitution() { + return this.substitute; + } + + @Override + public boolean shouldCombine() { + return this.combine; + } + + @Override + public void onChangeCrafting(IAEItemStack[] newCrafting, IAEItemStack[] newOutput) { + IInventory crafting = this.getInventoryByName("crafting"); + IInventory output = this.getInventoryByName("output"); + if (crafting instanceof AppEngInternalInventory && output instanceof AppEngInternalInventory) { + for (int x = 0; x < crafting.getSizeInventory() && x < newCrafting.length; x++) { + final IAEItemStack item = newCrafting[x]; + crafting.setInventorySlotContents(x, item == null ? null : item.getItemStack()); + } + for (int x = 0; x < output.getSizeInventory() && x < newOutput.length; x++) { + final IAEItemStack item = newOutput[x]; + output.setInventorySlotContents(x, item == null ? null : item.getItemStack()); + } + } + } + + @Override + public void setCraftingRecipe(boolean craftingMode) { + this.craftingMode = craftingMode; + } + + @Override + public void setSubstitution(boolean canSubstitute) { + this.substitute = canSubstitute; + } + + @Override + public void setBeSubstitute(boolean canBeSubstitute) { + this.beSubstitute = canBeSubstitute; + } + + @Override + public void setCombineMode(boolean shouldCombine) { + this.combine = shouldCombine; + } + + @Override + public void setPrioritization(boolean canPrioritize) { + this.prioritize = canPrioritize; + } + + @Override + public void setInverted(boolean inverted) { + this.inverted = inverted; + } + + @Override + public int getActivePage() { + return this.activePage; + } + + @Override + public void setActivePage(int activePage) { + this.activePage = activePage; + } + + @Override + public boolean isCraftingRecipe() { + return this.craftingMode; + } + + @Override + public void sortCraftingItems() { + List items = new ArrayList(); + List fluids = new ArrayList(); + for (ItemStack is : this.crafting) { + if (is == null) continue; + if (is.getItem() instanceof ItemFluidPacket) { + fluids.add(is); + } else { + items.add(is); + } + } + if (this.prioritize) { + fluids.addAll(items); + items.clear(); + } else { + items.addAll(fluids); + fluids.clear(); + } + + for (int i = 0; i < this.crafting.getSizeInventory(); i++) { + if (this.crafting.getStackInSlot(i) == null) break; + if (items.isEmpty()) { + this.crafting.setInventorySlotContents(i, fluids.get(i)); + } else { + this.crafting.setInventorySlotContents(i, items.get(i)); + } + } + saveChanges(); + } + + @Override + public void saveSettings() { + this.writeToNBT(); + } + +} diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index cff959ab..114487c2 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -33,6 +33,7 @@ public class ItemAndBlockHolder { public static ItemFluidConversionMonitor FLUID_CONVERSION_MONITOR = new ItemFluidConversionMonitor().register(); public static ItemPortableFluidCell PORTABLE_FLUID_CELL = new ItemPortableFluidCell().register(); public static ItemWirelessFluidTerminal WIRELESS_FLUID_TERM = new ItemWirelessFluidTerminal().register(); + public static ItemWirelessPatternTerminal WIRELESS_PATTERN_TERM = new ItemWirelessPatternTerminal().register(); public static ItemFluidPacket PACKET = new ItemFluidPacket().register(); public static ItemBasicFluidStorageCell CELL1K = new ItemBasicFluidStorageCell(CellType.Cell1kPart, 1).register(); public static ItemBasicFluidStorageCell CELL4K = new ItemBasicFluidStorageCell(CellType.Cell4kPart, 4).register(); diff --git a/src/main/java/com/glodblock/github/nei/NEI_FC_Config.java b/src/main/java/com/glodblock/github/nei/NEI_FC_Config.java index 0f9c0358..d4e42279 100644 --- a/src/main/java/com/glodblock/github/nei/NEI_FC_Config.java +++ b/src/main/java/com/glodblock/github/nei/NEI_FC_Config.java @@ -6,6 +6,7 @@ import codechicken.nei.api.IConfigureNEI; import com.glodblock.github.FluidCraft; import com.glodblock.github.client.gui.GuiFluidPatternTerminal; import com.glodblock.github.client.gui.GuiFluidPatternTerminalEx; +import com.glodblock.github.client.gui.GuiPatternPortableCell; import com.glodblock.github.nei.recipes.FluidRecipe; public class NEI_FC_Config implements IConfigureNEI { @@ -15,6 +16,10 @@ public class NEI_FC_Config implements IConfigureNEI { API.registerNEIGuiHandler(new NEIGuiHandler()); for (String identifier : FluidRecipe.getSupportRecipes()) { + API.registerGuiOverlayHandler( + GuiPatternPortableCell.class, + FluidPatternTerminalRecipeTransferHandler.INSTANCE, + identifier); API.registerGuiOverlayHandler( GuiFluidPatternTerminal.class, FluidPatternTerminalRecipeTransferHandler.INSTANCE, diff --git a/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java b/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java index cb963008..1e20c96f 100644 --- a/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java +++ b/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java @@ -117,6 +117,7 @@ public class CPacketFluidPatternTermBtns implements IMessage { } break; } + cpt.getPatternTerminal().saveSettings(); } else if (Name.equals("Terminal.Cpu") && c instanceof ContainerFluidCraftConfirm) { final ContainerFluidCraftConfirm qk = (ContainerFluidCraftConfirm) c; qk.cycleCpu(Value.equals("Next")); diff --git a/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java b/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java index d4fc285e..94dc7004 100644 --- a/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java +++ b/src/main/java/com/glodblock/github/network/CPacketSwitchGuis.java @@ -73,9 +73,9 @@ public class CPacketSwitchGuis implements IMessage { player, player.worldObj, new BlockPos( - (int) player.posX, - Util.GuiHelper.encodeType((int) player.posY, Util.GuiHelper.GuiType.ITEM), - (int) player.posZ), + player.inventory.currentItem, + Util.GuiHelper.encodeType(0, Util.GuiHelper.GuiType.ITEM), + 0), Objects.requireNonNull(context.getSide()), message.guiType); } diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index 9b9c7d2a..a164ab25 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -37,6 +37,7 @@ public class NameConst { public static final String ITEM_FLUID_STORAGE = "fluid_storage"; public static final String ITEM_FLUID_PORTABLE_CELL = "portable_fluid_cell"; public static final String ITEM_WIRELESS_FLUID_TERMINAL = "wireless_fluid_terminal"; + public static final String ITEM_WIRELESS_FLUID_PATTERN_TERMINAL = "wireless_fluid_pattern_terminal"; public static final String ITEM_FLUID_PART = "fluid_part"; public static final String TT_KEY = FluidCraft.MODID + ".tooltip."; diff --git a/src/main/java/com/glodblock/github/util/Util.java b/src/main/java/com/glodblock/github/util/Util.java index ed4bb923..2cc4039e 100644 --- a/src/main/java/com/glodblock/github/util/Util.java +++ b/src/main/java/com/glodblock/github/util/Util.java @@ -27,13 +27,13 @@ import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEStack; import appeng.api.util.WorldCoord; +import appeng.items.tools.powered.ToolWirelessTerminal; import appeng.tile.networking.TileCableBus; import appeng.tile.networking.TileWireless; import appeng.util.item.AEFluidStack; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; -import com.glodblock.github.common.item.ItemWirelessFluidTerminal; import com.glodblock.github.inventory.IAEFluidTank; import cpw.mods.fml.common.ModContainer; @@ -42,24 +42,28 @@ import io.netty.buffer.ByteBuf; public final class Util { - public static IGridNode getWirelessGrid(ItemStack is, BlockPos pos, StorageChannel channel) { - String key = ((ItemWirelessFluidTerminal) is.getItem()).getEncryptionKey(is); - IGridHost securityTerminal = (IGridHost) AEApi.instance().registries().locatable() - .getLocatableBy(Long.parseLong(key)); - if (securityTerminal == null) return null; - return securityTerminal.getGridNode(ForgeDirection.UNKNOWN); + public static IGridNode getWirelessGrid(ItemStack is) { + if (is.getItem() instanceof ToolWirelessTerminal) { + String key = ((ToolWirelessTerminal) is.getItem()).getEncryptionKey(is); + IGridHost securityTerminal = (IGridHost) AEApi.instance().registries().locatable() + .getLocatableBy(Long.parseLong(key)); + if (securityTerminal == null) return null; + return securityTerminal.getGridNode(ForgeDirection.UNKNOWN); + } + return null; } @SuppressWarnings("unchecked") - public static IBaseMonitor>> getWirelessInv(ItemStack is, BlockPos pos, - StorageChannel channel) { - IGridNode gridNode = getWirelessGrid(is, pos, channel); + public static IBaseMonitor>> getWirelessInv(ItemStack is, + EntityPlayer player, StorageChannel channel) { + IGridNode gridNode = getWirelessGrid(is); if (gridNode == null) return null; IGrid grid = gridNode.getGrid(); if (grid == null) return null; for (IGridNode node : grid.getMachines(TileWireless.class)) { IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node.getMachine(); - WorldCoord distance = accessPoint.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); + WorldCoord distance = accessPoint.getLocation() + .subtract((int) player.posX, (int) player.posY, (int) player.posZ); int squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; if (squaredDistance <= accessPoint.getRange() * accessPoint.getRange()) { IStorageGrid gridCache = grid.getCache(IStorageGrid.class); @@ -269,14 +273,14 @@ public final class Util { private static final int value = 1 << 30; public static int encodeType(int y, GuiType type) { - if (y > (1 << 28)) { + if (Math.abs(y) > (1 << 28)) { throw new IllegalArgumentException("out of range"); } return value | (type.ordinal() << 29) | y; } public static MutablePair decodeType(int y) { - if (y > (1 << 28)) { + if (Math.abs(y) > (1 << 28)) { return new MutablePair<>(GuiType.values()[y >> 29 & 1], y - (3 << 29 & y)); } else { return new MutablePair<>(GuiType.TILE, y); diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 656ed926..ee866791 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -12,6 +12,7 @@ item.part_fluid_storage_monitor.name=ME Fluid Storage Monitor item.part_fluid_conversion_monitor.name=ME Fluid Conversion Monitor item.portable_fluid_cell.name=Portable Fluid Cell item.wireless_fluid_terminal.name=Wireless Fluid Terminal +item.wireless_fluid_pattern_terminal.name=Wireless Fluid Pattern Terminal item.fluid_packet.name=Fluid Packet item.fluid_storage.1.name=%s1k%s ME Fluid Storage Cell item.fluid_storage.4.name=%s4k%s ME Fluid Storage Cell diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index 1e1f56f8..8351d7aa 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -10,6 +10,9 @@ item.part_fluid_storage_bus.name=ME流体存储总线 item.part_fluid_level_emitter.name=ME流体发信器 item.part_fluid_storage_monitor.name=ME流体存储监控器 item.part_fluid_conversion_monitor.name=ME流体交换监控器 +item.portable_fluid_cell.name=便携流体单元 +item.wireless_fluid_terminal.name=无线流体终端 +item.wireless_fluid_pattern_terminal.name=无线样板终端 item.fluid_packet.name=流体封包 item.fluid_storage.1.name=%s1k%s-ME流体存储元件 item.fluid_storage.4.name=%s4k%s-ME流体存储元件 @@ -18,6 +21,7 @@ item.fluid_storage.64.name=%s64k%s-ME流体存储元件 item.fluid_storage.256.name=%s256k%s-ME流体存储元件 item.fluid_storage.1024.name=%s1024k%s-ME流体存储元件 item.fluid_storage.4096.name=%s4096k%s-ME流体存储元件 +item.fluid_storage.16384.name=%s16384k%s-ME流体存储元件 item.fluid_part.0.name=%s1k%s-ME流体存储组件 item.fluid_part.1.name=%s4k%s-ME流体存储组件 item.fluid_part.2.name=%s16k%s-ME流体存储组件 @@ -25,6 +29,7 @@ item.fluid_part.3.name=%s64k%s-ME流体存储组件 item.fluid_part.4.name=%s256k%s-ME流体存储组件 item.fluid_part.5.name=%s1024k%s-ME流体存储组件 item.fluid_part.6.name=%s4096k%s-ME流体存储组件 +item.fluid_part.7.name=%s16384k%s-ME流体存储组件 tile.fluid_discretizer.name=ME流体离散器 tile.fluid_pattern_encoder.name=流体适配型样板编码台 @@ -66,7 +71,8 @@ ae2fc.tooltip.level_maintainer.request_size=§6缓存量§r ae2fc.tooltip.level_maintainer.request_size.hint=数量定义了在请求器开始请求新合成之前应该保留多少物品。 ae2fc.tooltip.cell_contents=内含流体: -ae2fc.tooltip.cell_empty=Cell is empty +ae2fc.tooltip.cell_empty=空存储 +ae2fc.tooltip.cell_portable=右键打开GUI,它就像一个背包,但你需要在使用前给它充能。 ae2fc.tooltip.fluid_terminal=我们不再需要EC2了吗? ae2fc.tooltip.invalid_fluid=流体无效! ae2fc.tooltip.encode_pattern=编写样板 diff --git a/src/main/resources/assets/ae2fc/textures/items/wireless_fluid_pattern_terminal.png b/src/main/resources/assets/ae2fc/textures/items/wireless_fluid_pattern_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..8b47dcbd9f6296e4f3168d0306a693ce0c0bc6e2 GIT binary patch literal 15831 zcmeI3eQ*=U6~Hf;kKl3awoDB}+9E4yViQhxrw_|_kp;%GBa_HAwnA)%uhZSiJ|pQ= z-Px8s&0szXcrp+|GMF%vKuIt#G;T@@jFXVSv@R_jaN2}INkVBU#7Pqfu@j&TxO?(gk;x__>ts`8P0GN)$}1aVJ=+f@zk2JLhAMEI?=wGG1C zhO-I6F*_ROh2=ms_&~iB zDmGqu{Vk(G5{r#b*gUi+TnZW_cUuJ1v{ibAw&emV8fQB*9Z?QC2m+NiM1z5l!bOXX zF~1!AtqoH~Lu`t=yx3Tx1vJ!pstl!a1Q=|lLQ&fH=EUPk#7?{3U@&cH zMJ;QF2!@fSwN$*VVL(*_MQ(}+psX2g<-T;gS0#TkIioyjnlaZ7qS6>%8>tr6cXhYrNBXq%Ds1H~_BCqmy zr|+z(V_2J78mHW3+j4Wy7vVqC?l|H*Pl5wB648NUPoF*EY_Q zMNAP3cW)O2;Ai}_of!#~;_S9SKZ;1Oo%4Z|Ioe)CZ7*il?zdSBNjncjQUq2r$@+Pb zG@C^q?X!t+35gJC+}sw*EopggMbe<!lFbWo#4lgmQQq%`TgBLs2(DduCxXlVc;T-S)Zip?6^i6Z;e7Cr(> z>R~bUTH5Uq|20fHBGTzEc+R>y?^!HYUBJRd}> z<3fPoMI9HO52Dp^Awck=jtkER(dxJmAb3&7h3A84bzBG#yr|>C^Fg#aE(8c()N$eY zAX*(40t7GWxbS=st&R%;f){mMcs__$$AtjFi#jemA4IF;LV(~!9T%PtqSbLBK=7iD z3(p79>bMXfcoB;$Gx=sJ2*KA;Ti|=Aowic~d}q}lxT`$`(e^`vXkSebH-_N-BZ6q6 z3F6~r@O9U%1Tj_KytKERAjWO1aFuwYXFutD>(P7pX~$+?eWOv?b8LRj@rTuprdPB7 zGABR#=!&2Hde_j(y8ZV*n!E1&=H6L#zIC@UwlwFf{aaQ|IGW$fxh-W&UVd=R6n4Xs z3r*2y_f^jP!I{Px(N^}{)EBQ@yK(i&?N3c8IpSG3!ydTVdAOgF4p;RK_MH5*W6mc# zr}r}}t}V$p->dXGZJ%2X-um~^5B99A?Q9Ky`Jc=0>{l*Jrff?78TU44rnJKTecy zSrV}~8op4C#IysSE@#gu-y;^BKI9wPl0CR}MRah&+Ld{R?EVi}T4_!JK6y9s@Uo@}d zxy{u*$G^PP810s(XSx2mmfPCZ0qO$5pKm(Rm+^LkwZS@_5C;a}z_PmBE~z}{2%WX< z!~?q`-_09;VBrRp^KdV8E!da0W{0=?&w)ZFE8}w6)O5huImei+C0Rh#lfdv z8t*4geRy-b_rUD(i(k3eOV@MyhX&@nTyyo6n-AYACdR*$_1uOxR_=tSn5ZbLbal^N Gw(7riyqwGc literal 0 HcmV?d00001 From 8081eb2c2c82e017e5d5e96f02145923251e2715 Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Wed, 1 Feb 2023 15:14:34 +0800 Subject: [PATCH 8/9] all done? --- .../common/item/ItemBaseWirelessTerminal.java | 38 +++++++++++ .../inventory/gui/PartItemGuiFactory.java | 16 ++--- .../inventory/item/WirelessFluidTerminal.java | 4 ++ .../item/WirelessPatternTerminal.java | 4 ++ .../glodblock/github/loader/RecipeLoader.java | 10 ++- .../loader/recipe/WirelessTerminal.java | 66 +++++++++++++++++++ .../com/glodblock/github/util/NameConst.java | 2 + .../java/com/glodblock/github/util/Util.java | 54 ++++++++++----- .../resources/assets/ae2fc/lang/en_US.lang | 1 + .../resources/assets/ae2fc/lang/zh_CN.lang | 1 + 10 files changed, 172 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/glodblock/github/loader/recipe/WirelessTerminal.java diff --git a/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java index 025a32d2..c252ee6d 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java +++ b/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java @@ -1,9 +1,15 @@ package com.glodblock.github.common.item; +import static com.glodblock.github.loader.recipe.WirelessTerminal.getInfinityBoosterCard; +import static com.glodblock.github.util.Util.hasInfinityBoosterCard; + +import java.util.List; import java.util.Optional; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -18,10 +24,15 @@ import com.glodblock.github.inventory.InventoryHandler; import com.glodblock.github.inventory.gui.GuiType; import com.glodblock.github.inventory.item.IItemInventory; import com.glodblock.github.util.BlockPos; +import com.glodblock.github.util.NameConst; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class ItemBaseWirelessTerminal extends ToolWirelessTerminal implements IItemInventory { protected GuiType type; + public static String infinityBoosterCard = "infinityBoosterCard"; public ItemBaseWirelessTerminal(GuiType t) { super(); @@ -30,6 +41,7 @@ public class ItemBaseWirelessTerminal extends ToolWirelessTerminal implements II @Override public ItemStack onItemRightClick(final ItemStack item, final World w, final EntityPlayer player) { + if (player.isSneaking()) return removeInfinityBoosterCard(player, item); IWirelessTermRegistry term = AEApi.instance().registries().wireless(); if (!term.isWirelessTerminal(item)) { player.addChatMessage(PlayerMessages.DeviceNotWirelessTerminal.get()); @@ -61,6 +73,31 @@ public class ItemBaseWirelessTerminal extends ToolWirelessTerminal implements II return item; } + private ItemStack removeInfinityBoosterCard(final EntityPlayer player, ItemStack is) { + if (hasInfinityBoosterCard(is)) { + if (!player.inventory.addItemStackToInventory(getInfinityBoosterCard())) { + player.entityDropItem(getInfinityBoosterCard(), 0); + } + is.getTagCompound().setBoolean(infinityBoosterCard, false); + } + return is; + } + + @SideOnly(Side.CLIENT) + @Override + public void addCheckedInformation(ItemStack stack, EntityPlayer player, List lines, + boolean displayMoreInfo) { + super.addCheckedInformation(stack, player, lines, displayMoreInfo); + if (GuiScreen.isCtrlKeyDown()) { + lines.add(NameConst.i18n(NameConst.TT_WIRELESS_INSTALLED)); + if (hasInfinityBoosterCard(stack)) { + lines.add(" " + EnumChatFormatting.GOLD + getInfinityBoosterCard().getDisplayName()); + } + } else { + lines.add(NameConst.i18n(NameConst.TT_CTRL_FOR_MORE)); + } + } + @Override public boolean canHandle(final ItemStack is) { return is.getItem() == this; @@ -82,4 +119,5 @@ public class ItemBaseWirelessTerminal extends ToolWirelessTerminal implements II public GuiType guiGuiType() { return this.type; } + } diff --git a/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java b/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java index 47b8d443..fdefd629 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java +++ b/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java @@ -7,7 +7,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.ImmutablePair; import appeng.container.AEBaseContainer; import appeng.container.ContainerOpenContext; @@ -29,15 +29,15 @@ public abstract class PartItemGuiFactory extends PartGuiFactory { @Nullable @Override public Object createServerGui(EntityPlayer player, World world, int x, int y, int z, ForgeDirection face) { - MutablePair result = Util.GuiHelper.decodeType(y); + ImmutablePair result = Util.GuiHelper.decodeType(y); - if (result.left == Util.GuiHelper.GuiType.ITEM) { + if (result.getLeft() == Util.GuiHelper.GuiType.ITEM) { ItemStack item = player.getHeldItem(); if (item == null || !(item.getItem() instanceof IItemInventory)) { return null; } T inv = getItemInventory( - ((IItemInventory) item.getItem()).getInventory(item, world, x, result.right, z, player)); + ((IItemInventory) item.getItem()).getInventory(item, world, x, result.getRight(), z, player)); if (inv == null) { return null; } @@ -53,7 +53,7 @@ public abstract class PartItemGuiFactory extends PartGuiFactory { } return gui; } else { - return super.createServerGui(player, world, x, result.right, z, face); + return super.createServerGui(player, world, x, result.getRight(), z, face); } } @@ -61,17 +61,17 @@ public abstract class PartItemGuiFactory extends PartGuiFactory { @Nullable @Override public Object createClientGui(EntityPlayer player, World world, int x, int y, int z, ForgeDirection face) { - MutablePair result = Util.GuiHelper.decodeType(y); + ImmutablePair result = Util.GuiHelper.decodeType(y); if (result.left == Util.GuiHelper.GuiType.ITEM) { ItemStack item = player.getHeldItem(); if (item == null || !(item.getItem() instanceof IItemInventory)) { return null; } T inv = getItemInventory( - ((IItemInventory) item.getItem()).getInventory(item, world, x, result.right, z, player)); + ((IItemInventory) item.getItem()).getInventory(item, world, x, result.getRight(), z, player)); return inv != null ? createClientGui(player, inv) : null; } else { - return super.createClientGui(player, world, x, result.right, z, face); + return super.createClientGui(player, world, x, result.getRight(), z, face); } } diff --git a/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java b/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java index 4a1425fb..5946400d 100644 --- a/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java +++ b/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java @@ -52,6 +52,10 @@ public class WirelessFluidTerminal extends MEMonitorHandler imple this.channel = StorageChannel.FLUIDS; } + public StorageChannel getChannel() { + return this.channel; + } + @Override public ItemStack getItemStack() { return this.target; diff --git a/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java b/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java index 1c73e4c2..c063f3cf 100644 --- a/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java +++ b/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java @@ -72,6 +72,10 @@ public class WirelessPatternTerminal extends MEMonitorHandler impl this.output = new ItemBiggerAppEngInventory(is, "output", 3); } + public StorageChannel getChannel() { + return this.channel; + } + @Override public ItemStack getItemStack() { return this.target; diff --git a/src/main/java/com/glodblock/github/loader/RecipeLoader.java b/src/main/java/com/glodblock/github/loader/RecipeLoader.java index 82ab27f7..bbbc37e7 100644 --- a/src/main/java/com/glodblock/github/loader/RecipeLoader.java +++ b/src/main/java/com/glodblock/github/loader/RecipeLoader.java @@ -14,6 +14,7 @@ import net.minecraftforge.oredict.ShapelessOreRecipe; import com.glodblock.github.common.Config; import com.glodblock.github.common.item.ItemBasicFluidStorageCell; import com.glodblock.github.common.storage.CellType; +import com.glodblock.github.loader.recipe.WirelessTerminal; import com.glodblock.github.util.ModAndClassUtil; import cpw.mods.fml.common.registry.GameRegistry; @@ -93,6 +94,8 @@ public class RecipeLoader implements Runnable { GameRegistry.findItem("appliedenergistics2", "item.ItemMultiMaterial"), 1, 54); + public static final ItemStack AE2_WIRELESS_TERMINAL = GameRegistry + .findItemStack("appliedenergistics2", "item.ToolWirelessTerminal", 1); public static final ItemStack AE2_ME_CHEST = GameRegistry .findItemStack("appliedenergistics2", "tile.BlockChest", 1); public static final ItemStack AE2_ENERGY_CELL = GameRegistry @@ -128,7 +131,12 @@ public class RecipeLoader implements Runnable { AE2_INTERFACE)); GameRegistry.addShapelessRecipe(FLUID_INTERFACE.stack(), INTERFACE.stack()); GameRegistry.addShapelessRecipe(INTERFACE.stack(), FLUID_INTERFACE.stack()); - GameRegistry.addShapelessRecipe(WIRELESS_FLUID_TERM.stack(), AE2_TERMINAL, BUFFER.stack()); + GameRegistry.addShapelessRecipe(WIRELESS_FLUID_TERM.stack(), AE2_WIRELESS_TERMINAL, BUCKET); + GameRegistry.addShapelessRecipe(WIRELESS_PATTERN_TERM.stack(), WIRELESS_FLUID_TERM, FLUID_TERMINAL); + if (ModAndClassUtil.WCT) { + GameRegistry.addRecipe(new WirelessTerminal(WIRELESS_PATTERN_TERM.stack())); + GameRegistry.addRecipe(new WirelessTerminal(WIRELESS_FLUID_TERM.stack())); + } GameRegistry .addRecipe(new ShapedOreRecipe(CERTUS_QUARTZ_TANK.stack(), "GGG", "G G", "GGG", 'G', AE2_QUARTZ_GLASS)); GameRegistry.addShapelessRecipe(FLUID_AUTO_FILLER.stack(), FLUID_TERMINAL, ENCODER); diff --git a/src/main/java/com/glodblock/github/loader/recipe/WirelessTerminal.java b/src/main/java/com/glodblock/github/loader/recipe/WirelessTerminal.java new file mode 100644 index 00000000..35dbaa86 --- /dev/null +++ b/src/main/java/com/glodblock/github/loader/recipe/WirelessTerminal.java @@ -0,0 +1,66 @@ +package com.glodblock.github.loader.recipe; + +import static com.glodblock.github.util.Util.hasInfinityBoosterCard; + +import java.util.Arrays; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.p455w0rd.wirelesscraftingterminal.items.ItemEnum; +import net.p455w0rd.wirelesscraftingterminal.items.ItemInfinityBooster; + +import appeng.util.Platform; + +import com.glodblock.github.common.item.ItemBaseWirelessTerminal; + +public class WirelessTerminal extends ShapelessRecipes { + + private static final ItemStack infinityBoosterCard = ItemEnum.BOOSTER_CARD.getStack(); + private final ItemStack installedTerm; + + public WirelessTerminal(ItemStack term) { + super(term, Arrays.asList(term, infinityBoosterCard)); + this.installedTerm = installInfinityBoosterCard(term); + } + + @Override + public boolean matches(InventoryCrafting inv, World w) { + ItemStack term = inv.getStackInSlot(0); + ItemStack infinityBoosterCard = inv.getStackInSlot(1); + return term != null && term.getItem() instanceof ItemBaseWirelessTerminal + && !hasInfinityBoosterCard(term) + && infinityBoosterCard != null + && infinityBoosterCard.getItem() instanceof ItemInfinityBooster; + } + + public static ItemStack getInfinityBoosterCard() { + return infinityBoosterCard.copy(); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) { + return installInfinityBoosterCard(inv.getStackInSlot(0)); + } + + @Override + public int getRecipeSize() { + return 2; + } + + private ItemStack installInfinityBoosterCard(ItemStack is) { + is = is.copy(); + NBTTagCompound data = Platform.openNbtData(is); + data.setBoolean(ItemBaseWirelessTerminal.infinityBoosterCard, true); + is.setTagCompound(data); + return is; + } + + @Override + public ItemStack getRecipeOutput() { + return installedTerm; + } + +} diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index a164ab25..8902cebc 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -74,6 +74,8 @@ public class NameConst { public static final String TT_CELL_CONTENTS = TT_KEY + "cell_contents"; public static final String TT_CELL_EMPTY = TT_KEY + "cell_empty"; public static final String TT_CELL_PORTABLE = TT_KEY + "cell_portable"; + public static final String TT_WIRELESS = TT_KEY + "wireless."; + public static final String TT_WIRELESS_INSTALLED = TT_WIRELESS + "installed"; public static final String WAILA_KEY = FluidCraft.MODID + ".waila."; public static final String WAILA_ENABLE = WAILA_KEY + "enable"; diff --git a/src/main/java/com/glodblock/github/util/Util.java b/src/main/java/com/glodblock/github/util/Util.java index 2cc4039e..993ee423 100644 --- a/src/main/java/com/glodblock/github/util/Util.java +++ b/src/main/java/com/glodblock/github/util/Util.java @@ -1,5 +1,7 @@ package com.glodblock.github.util; +import static com.glodblock.github.common.item.ItemBaseWirelessTerminal.infinityBoosterCard; + import java.io.IOException; import java.util.Map; @@ -11,6 +13,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.*; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.MutablePair; import appeng.api.AEApi; @@ -30,8 +33,10 @@ import appeng.api.util.WorldCoord; import appeng.items.tools.powered.ToolWirelessTerminal; import appeng.tile.networking.TileCableBus; import appeng.tile.networking.TileWireless; +import appeng.util.Platform; import appeng.util.item.AEFluidStack; +import com.glodblock.github.common.item.ItemBaseWirelessTerminal; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; import com.glodblock.github.inventory.IAEFluidTank; @@ -42,6 +47,14 @@ import io.netty.buffer.ByteBuf; public final class Util { + public static boolean hasInfinityBoosterCard(ItemStack is) { + if (ModAndClassUtil.WCT && is.getItem() instanceof ItemBaseWirelessTerminal) { + NBTTagCompound data = Platform.openNbtData(is); + return data.hasKey(infinityBoosterCard) && data.getBoolean(infinityBoosterCard); + } + return false; + } + public static IGridNode getWirelessGrid(ItemStack is) { if (is.getItem() instanceof ToolWirelessTerminal) { String key = ((ToolWirelessTerminal) is.getItem()).getEncryptionKey(is); @@ -60,22 +73,33 @@ public final class Util { if (gridNode == null) return null; IGrid grid = gridNode.getGrid(); if (grid == null) return null; - for (IGridNode node : grid.getMachines(TileWireless.class)) { - IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node.getMachine(); - WorldCoord distance = accessPoint.getLocation() - .subtract((int) player.posX, (int) player.posY, (int) player.posZ); - int squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; - if (squaredDistance <= accessPoint.getRange() * accessPoint.getRange()) { - IStorageGrid gridCache = grid.getCache(IStorageGrid.class); - if (gridCache != null) { - if (channel == StorageChannel.FLUIDS) { - return gridCache.getFluidInventory(); - } else { - return gridCache.getItemInventory(); + boolean canConnect = false; + if (hasInfinityBoosterCard(is)) { + canConnect = true; + } else { + for (IGridNode node : grid.getMachines(TileWireless.class)) { + IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node.getMachine(); + if (accessPoint.isActive() && accessPoint.getLocation().getDimension() == player.dimension) { + WorldCoord distance = accessPoint.getLocation() + .subtract((int) player.posX, (int) player.posY, (int) player.posZ); + int squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; + if (squaredDistance <= accessPoint.getRange() * accessPoint.getRange()) { + canConnect = true; + break; } } } } + if (canConnect) { + IStorageGrid gridCache = grid.getCache(IStorageGrid.class); + if (gridCache != null) { + if (channel == StorageChannel.FLUIDS) { + return gridCache.getFluidInventory(); + } else { + return gridCache.getItemInventory(); + } + } + } return null; } @@ -279,11 +303,11 @@ public final class Util { return value | (type.ordinal() << 29) | y; } - public static MutablePair decodeType(int y) { + public static ImmutablePair decodeType(int y) { if (Math.abs(y) > (1 << 28)) { - return new MutablePair<>(GuiType.values()[y >> 29 & 1], y - (3 << 29 & y)); + return new ImmutablePair<>(GuiType.values()[y >> 29 & 1], y - (3 << 29 & y)); } else { - return new MutablePair<>(GuiType.TILE, y); + return new ImmutablePair<>(GuiType.TILE, y); } } } diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index ee866791..9358bf37 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -84,6 +84,7 @@ ae2fc.tooltip.not_combine=Merge the same items ae2fc.tooltip.not_combine.hint=Disabled ae2fc.tooltip.combine=Merge the same items ae2fc.tooltip.combine.hint=Enabled +ae2fc.tooltip.wireless.installed=Installed Card: ae2fc.tooltip.not_prio=Allow fluids to be placed first ae2fc.tooltip.not_prio.hint=Enabled diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index 8351d7aa..302807dd 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -84,6 +84,7 @@ ae2fc.tooltip.not_combine=合并输出相同物品 ae2fc.tooltip.not_combine.hint=禁用 ae2fc.tooltip.combine=合并输出相同物品 ae2fc.tooltip.combine.hint=启用 +ae2fc.tooltip.wireless.installed=已安装的卡: ae2fc.tooltip.not_prio=优先放置流体 ae2fc.tooltip.not_prio.hint=启用 From dadf2784a83ca55a19e8c19b3cdeb4dfa53f604f Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Wed, 1 Feb 2023 21:15:44 +0800 Subject: [PATCH 9/9] fixes --- build.gradle | 122 +++++++++++++++--- .../java/com/glodblock/github/FluidCraft.java | 2 +- .../common/block/BlockFluidAutoFiller.java | 23 ++++ .../common/item/ItemBaseWirelessTerminal.java | 2 +- .../item/ItemWirelessFluidTerminal.java | 4 + .../item/ItemWirelessPatternTerminal.java | 4 + .../common/tile/TileFluidAutoFiller.java | 9 +- .../github/inventory/gui/GuiType.java | 2 +- ...Factory.java => PartOrItemGuiFactory.java} | 4 +- .../inventory/item/WirelessFluidTerminal.java | 2 - .../item/WirelessPatternTerminal.java | 1 - .../glodblock/github/loader/RecipeLoader.java | 6 +- ...minal.java => WirelessTerminalRecipe.java} | 4 +- .../com/glodblock/github/util/NameConst.java | 1 + .../resources/assets/ae2fc/lang/en_US.lang | 1 + .../resources/assets/ae2fc/lang/zh_CN.lang | 1 + 16 files changed, 151 insertions(+), 37 deletions(-) rename src/main/java/com/glodblock/github/inventory/gui/{PartItemGuiFactory.java => PartOrItemGuiFactory.java} (95%) rename src/main/java/com/glodblock/github/loader/recipe/{WirelessTerminal.java => WirelessTerminalRecipe.java} (94%) diff --git a/build.gradle b/build.gradle index b7756e80..e2e8960e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1674943145 +//version: 1675173326 /* DO NOT CHANGE THIS FILE! Also, you may replace this file at any time if there is an update available. @@ -55,9 +55,9 @@ plugins { id 'eclipse' id 'scala' id 'maven-publish' - id 'org.jetbrains.kotlin.jvm' version '1.5.30' apply false - id 'org.jetbrains.kotlin.kapt' version '1.5.30' apply false - id 'com.google.devtools.ksp' version '1.5.30-1.0.0' apply false + id 'org.jetbrains.kotlin.jvm' version '1.8.0' apply false + id 'org.jetbrains.kotlin.kapt' version '1.8.0' apply false + id 'com.google.devtools.ksp' version '1.8.0-1.0.9' apply false id 'org.ajoberstar.grgit' version '4.1.1' // 4.1.1 is the last jvm8 supporting version ,unused, available for addon.gradle id 'com.github.johnrengelman.shadow' version '7.1.2' apply false id 'com.palantir.git-version' version '0.13.0' apply false // 0.13.0 is the last jvm8 supporting version @@ -66,7 +66,7 @@ plugins { id 'com.diffplug.spotless' version '6.7.2' apply false id 'com.modrinth.minotaur' version '2.+' apply false id 'com.matthewprenger.cursegradle' version '1.4.0' apply false - id 'com.gtnewhorizons.retrofuturagradle' version '1.0.16' + id 'com.gtnewhorizons.retrofuturagradle' version '1.1.3' } boolean settingsupdated = verifySettingsGradle() settingsupdated = verifyGitAttributes() || settingsupdated @@ -113,6 +113,7 @@ propertyDefaultIfUnset("modrinthRelations", "") propertyDefaultIfUnset("curseForgeProjectId", "") propertyDefaultIfUnset("curseForgeRelations", "") propertyDefaultIfUnset("minimizeShadowedDependencies", true) +propertyDefaultIfUnset("relocateShadowedDependencies", true) // Deprecated properties (kept for backwards compat) propertyDefaultIfUnset("gradleTokenModId", "") propertyDefaultIfUnset("gradleTokenModName", "") @@ -149,6 +150,33 @@ java { } } +pluginManager.withPlugin('org.jetbrains.kotlin.jvm') { + // If Kotlin is enabled in the project + kotlin { + jvmToolchain(8) + } + // Kotlin hacks our source sets, so we hack Kotlin's tasks + def disabledKotlinTaskList = [ + "kaptGenerateStubsMcLauncherKotlin", + "kaptGenerateStubsPatchedMcKotlin", + "kaptGenerateStubsInjectedTagsKotlin", + "compileMcLauncherKotlin", + "compilePatchedMcKotlin", + "compileInjectedTagsKotlin", + "kaptMcLauncherKotlin", + "kaptPatchedMcKotlin", + "kaptInjectedTagsKotlin", + "kspMcLauncherKotlin", + "kspPatchedMcKotlin", + "kspInjectedTagsKotlin", + ] + tasks.configureEach { task -> + if (task.name in disabledKotlinTaskList) { + task.enabled = false + } + } +} + configurations { create("runtimeOnlyNonPublishable") { description = "Runtime only dependencies that are not published alongside the jar" @@ -212,6 +240,25 @@ if (accessTransformersFile) { } tasks.deobfuscateMergedJarToSrg.accessTransformerFiles.from(targetFile) tasks.srgifyBinpatchedJar.accessTransformerFiles.from(targetFile) +} else { + boolean atsFound = false + for (File at : sourceSets.getByName("main").resources.files) { + if (at.name.toLowerCase().endsWith("_at.cfg")) { + atsFound = true + tasks.deobfuscateMergedJarToSrg.accessTransformerFiles.from(at) + tasks.srgifyBinpatchedJar.accessTransformerFiles.from(at) + } + } + for (File at : sourceSets.getByName("api").resources.files) { + if (at.name.toLowerCase().endsWith("_at.cfg")) { + atsFound = true + tasks.deobfuscateMergedJarToSrg.accessTransformerFiles.from(at) + tasks.srgifyBinpatchedJar.accessTransformerFiles.from(at) + } + } + if (atsFound) { + logger.warn("Found and added access transformers in the resources folder, please configure gradle.properties to explicitly mention them by name") + } } if (usesMixins.toBoolean()) { @@ -290,7 +337,7 @@ if (identifiedVersion == versionOverride) { out.style(Style.Failure).text('Override version to ').style(Style.Identifier).text(modVersion).style(Style.Failure).println('!\7') } -group = modGroup +group = "com.github.GTNewHorizons" if (project.hasProperty("customArchiveBaseName") && customArchiveBaseName) { archivesBaseName = customArchiveBaseName } else { @@ -356,6 +403,16 @@ configurations.configureEach { } } +// Ensure tests have access to minecraft classes +sourceSets { + test { + java { + compileClasspath += sourceSets.patchedMc.output + sourceSets.mcLauncher.output + runtimeClasspath += sourceSets.patchedMc.output + sourceSets.mcLauncher.output + } + } +} + if (file('addon.gradle').exists()) { apply from: 'addon.gradle' } @@ -363,7 +420,7 @@ if (file('addon.gradle').exists()) { // Allow unsafe repos but warn repositories.configureEach { repo -> if (repo instanceof org.gradle.api.artifacts.repositories.UrlArtifactRepository) { - if (repo.getUrl().getScheme() == "http" && !repo.allowInsecureProtocol) { + if (repo.getUrl() != null && repo.getUrl().getScheme() == "http" && !repo.allowInsecureProtocol) { logger.warn("Deprecated: Allowing insecure connections for repo '${repo.name}' - add 'allowInsecureProtocol = true'") repo.allowInsecureProtocol = true } @@ -473,6 +530,14 @@ dependencies { } } +pluginManager.withPlugin('org.jetbrains.kotlin.kapt') { + if (usesMixins.toBoolean()) { + dependencies { + kapt('com.gtnewhorizon:gtnhmixins:2.1.10:processor') + } + } +} + apply from: 'dependencies.gradle' def mixingConfigRefMap = 'mixins.' + modId + '.refmap.json' @@ -513,9 +578,11 @@ if (usesMixins.toBoolean()) { tasks.named("reobfJar", ReobfuscatedJar).configure { extraSrgFiles.from(mixinSrg) } -} -if (usesMixins.toBoolean()) { + tasks.named("processResources").configure { + dependsOn("generateAssets") + } + tasks.named("compileJava", JavaCompile).configure { doFirst { new File(mixinTmpDir).mkdirs() @@ -529,6 +596,25 @@ if (usesMixins.toBoolean()) { "-XDignore.symbol.file" ] } + + pluginManager.withPlugin('org.jetbrains.kotlin.kapt') { + kapt { + correctErrorTypes = true + javacOptions { + option("-AreobfSrgFile=${tasks.reobfJar.srg.get().asFile}") + option("-AoutSrgFile=$mixinSrg") + option("-AoutRefMapFile=$refMap") + } + } + tasks.configureEach { task -> + if (task.name == "kaptKotlin") { + task.doFirst { + new File(mixinTmpDir).mkdirs() + } + } + } + } + } tasks.named("processResources", ProcessResources).configure { @@ -584,6 +670,7 @@ if (usesShadowedDependencies.toBoolean()) { tasks.register('relocateShadowJar', ConfigureShadowRelocation) { target = tasks.shadowJar prefix = modGroup + ".shadow" + enabled = minimizeShadowedDependencies.toBoolean() } tasks.named("shadowJar", ShadowJar).configure { manifest { @@ -599,7 +686,9 @@ if (usesShadowedDependencies.toBoolean()) { project.configurations.shadeCompile ] archiveClassifier.set('dev') - dependsOn(relocateShadowJar) + if (minimizeShadowedDependencies.toBoolean()) { + dependsOn(relocateShadowJar) + } } configurations.runtimeElements.outgoing.artifacts.clear() configurations.apiElements.outgoing.artifacts.clear() @@ -625,16 +714,6 @@ if (usesShadowedDependencies.toBoolean()) { ext.publishableDevJar = usesShadowedDependencies.toBoolean() ? tasks.shadowJar : tasks.jar ext.publishableObfJar = tasks.reobfJar -tasks.named('extractForgeUserdev', Copy).configure { efu -> - doLast { - // Fix CoFH-repackaged CCL not finding mappings - project.copy { - from(mcpTasks.userdevDir("conf")) - into(new File(project.buildDir, "unpacked/conf")) - } - } -} - tasks.register('apiJar', Jar) { from(sourceSets.main.allSource) { include modGroupPath + "/" + apiPackagePath + '/**' @@ -664,6 +743,7 @@ idea { module { downloadJavadoc = true downloadSources = true + inheritOutputDirs = true } project { settings { @@ -739,7 +819,7 @@ publishing { artifact apiJar } - groupId = System.getenv("ARTIFACT_GROUP_ID") ?: "com.github.GTNewHorizons" + groupId = System.getenv("ARTIFACT_GROUP_ID") ?: project.group artifactId = System.getenv("ARTIFACT_ID") ?: project.name // Using the identified version, not project.version as it has the prepended 1.7.10 version = System.getenv("RELEASE_VERSION") ?: identifiedVersion diff --git a/src/main/java/com/glodblock/github/FluidCraft.java b/src/main/java/com/glodblock/github/FluidCraft.java index 8529c5d6..a15ad4ec 100644 --- a/src/main/java/com/glodblock/github/FluidCraft.java +++ b/src/main/java/com/glodblock/github/FluidCraft.java @@ -28,7 +28,7 @@ import cpw.mods.fml.common.network.NetworkRegistry; modid = FluidCraft.MODID, version = FluidCraft.VERSION, name = FluidCraft.MODNAME, - dependencies = "required-after:appliedenergistics2;required-after:BuildCraft|Factory;required-after:CoFHCore;after:waila") + dependencies = "required-after:appliedenergistics2;required-after:CoFHCore;after:waila") public class FluidCraft { public static final String MODID = "GRADLETOKEN_MODID"; diff --git a/src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java b/src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java index 4d73b89e..44fffc44 100644 --- a/src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java +++ b/src/main/java/com/glodblock/github/common/block/BlockFluidAutoFiller.java @@ -1,8 +1,14 @@ package com.glodblock.github.common.block; +import static net.minecraft.client.gui.GuiScreen.isShiftKeyDown; + +import java.util.List; + import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -16,8 +22,12 @@ import com.glodblock.github.inventory.InventoryHandler; import com.glodblock.github.inventory.gui.GuiType; import com.glodblock.github.util.BlockPos; import com.glodblock.github.util.NameConst; +import com.glodblock.github.util.RenderUtil; import com.glodblock.github.util.Util; + import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BlockFluidAutoFiller extends FCBaseBlock { @@ -61,4 +71,17 @@ public class BlockFluidAutoFiller extends FCBaseBlock { } return false; } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(final ItemStack itemStack, final EntityPlayer player, final List toolTip, + final boolean advancedToolTips) { + if (isShiftKeyDown()) { + toolTip.addAll( + RenderUtil.listFormattedStringToWidth( + StatCollector.translateToLocal(NameConst.TT_FLUID_AUTO_FILLER))); + } else { + toolTip.add(NameConst.i18n(NameConst.TT_SHIFT_FOR_MORE)); + } + } } diff --git a/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java index c252ee6d..514f0a1b 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java +++ b/src/main/java/com/glodblock/github/common/item/ItemBaseWirelessTerminal.java @@ -1,6 +1,6 @@ package com.glodblock.github.common.item; -import static com.glodblock.github.loader.recipe.WirelessTerminal.getInfinityBoosterCard; +import static com.glodblock.github.loader.recipe.WirelessTerminalRecipe.getInfinityBoosterCard; import static com.glodblock.github.util.Util.hasInfinityBoosterCard; import java.util.List; diff --git a/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java index 5a95384e..0937225c 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java +++ b/src/main/java/com/glodblock/github/common/item/ItemWirelessFluidTerminal.java @@ -1,11 +1,14 @@ package com.glodblock.github.common.item; +import java.util.EnumSet; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import appeng.api.AEApi; import appeng.api.networking.IGridNode; +import appeng.core.features.AEFeature; import appeng.core.localization.PlayerMessages; import appeng.util.Platform; @@ -24,6 +27,7 @@ public class ItemWirelessFluidTerminal extends ItemBaseWirelessTerminal public ItemWirelessFluidTerminal() { super(GuiType.WIRELESS_FLUID_TERMINAL); AEApi.instance().registries().wireless().registerWirelessHandler(this); + this.setFeature(EnumSet.of(AEFeature.WirelessAccessTerminal, AEFeature.PoweredTools)); setUnlocalizedName(NameConst.ITEM_WIRELESS_FLUID_TERMINAL); setTextureName(FluidCraft.resource(NameConst.ITEM_WIRELESS_FLUID_TERMINAL).toString()); } diff --git a/src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java b/src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java index 6caf4e22..6bedab72 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java +++ b/src/main/java/com/glodblock/github/common/item/ItemWirelessPatternTerminal.java @@ -1,11 +1,14 @@ package com.glodblock.github.common.item; +import java.util.EnumSet; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import appeng.api.AEApi; import appeng.api.networking.IGridNode; +import appeng.core.features.AEFeature; import appeng.core.localization.PlayerMessages; import appeng.util.Platform; @@ -24,6 +27,7 @@ public class ItemWirelessPatternTerminal extends ItemBaseWirelessTerminal public ItemWirelessPatternTerminal() { super(GuiType.WIRELESS_FLUID_PATTERN_TERMINAL); AEApi.instance().registries().wireless().registerWirelessHandler(this); + this.setFeature(EnumSet.of(AEFeature.WirelessAccessTerminal, AEFeature.PoweredTools)); setUnlocalizedName(NameConst.ITEM_WIRELESS_FLUID_PATTERN_TERMINAL); setTextureName(FluidCraft.resource(NameConst.ITEM_WIRELESS_FLUID_PATTERN_TERMINAL).toString()); } diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java index 376a133c..4fa73e01 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidAutoFiller.java @@ -98,7 +98,7 @@ public class TileFluidAutoFiller extends AENetworkInvTile public void updatePattern() { ItemStack is = inventory.getStackInSlot(0); - if (is == null || this.getContainerItem().isItemEqual(is)) return; + if (is == null) return; this.setContainerItem(is); postEvent(); } @@ -106,6 +106,10 @@ public class TileFluidAutoFiller extends AENetworkInvTile @TileEvent(TileEventType.WORLD_NBT_READ) public void readFromNBTEvent(NBTTagCompound data) { inventory.readFromNBT(data, "Inv"); + if (inventory.getStackInSlot(0) == null) { + inventory.setInventorySlotContents(0, BUCKET); + } + updatePattern(); } @TileEvent(TileEventType.WORLD_NBT_WRITE) @@ -210,8 +214,7 @@ public class TileFluidAutoFiller extends AENetworkInvTile BaseActionSource source) { if (this.getProxy().isActive() && this.getStorageGrid() != null) { boolean hasChanged = false; - IItemList stored = this.getStorageGrid().getFluidInventory() - .getAvailableItems(AEApi.instance().storage().createFluidList()); + IItemList stored = this.getStorageGrid().getFluidInventory().getStorageList(); for (IAEFluidStack tmp : change) { if (stored.findPrecise(tmp) == null || this.fluids.findPrecise(tmp) == null) { hasChanged = true; diff --git a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java index 540e9afc..e88a29bd 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java @@ -170,7 +170,7 @@ public enum GuiType { } }), - CRAFTING_STATUS(new PartItemGuiFactory(ITerminalHost.class) { + CRAFTING_STATUS(new PartOrItemGuiFactory(ITerminalHost.class) { @Override protected Object createServerGui(EntityPlayer player, ITerminalHost inv) { diff --git a/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java b/src/main/java/com/glodblock/github/inventory/gui/PartOrItemGuiFactory.java similarity index 95% rename from src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java rename to src/main/java/com/glodblock/github/inventory/gui/PartOrItemGuiFactory.java index fdefd629..1f554e5b 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/PartItemGuiFactory.java +++ b/src/main/java/com/glodblock/github/inventory/gui/PartOrItemGuiFactory.java @@ -15,9 +15,9 @@ import appeng.container.ContainerOpenContext; import com.glodblock.github.inventory.item.IItemInventory; import com.glodblock.github.util.Util; -public abstract class PartItemGuiFactory extends PartGuiFactory { +public abstract class PartOrItemGuiFactory extends PartGuiFactory { - PartItemGuiFactory(Class invClass) { + PartOrItemGuiFactory(Class invClass) { super(invClass); } diff --git a/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java b/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java index 5946400d..0c9541c5 100644 --- a/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java +++ b/src/main/java/com/glodblock/github/inventory/item/WirelessFluidTerminal.java @@ -32,7 +32,6 @@ public class WirelessFluidTerminal extends MEMonitorHandler imple private final ItemStack target; private final IAEItemPowerStorage ips; - private final EntityPlayer p; private final int inventorySlot; private final AppEngInternalInventory viewCell; private final StorageChannel channel; @@ -46,7 +45,6 @@ public class WirelessFluidTerminal extends MEMonitorHandler imple this.ips = (ToolWirelessTerminal) is.getItem(); this.grid = gridNode; this.target = is; - this.p = player; this.inventorySlot = slot; this.viewCell = new WirelessTerminalViewCells(is); this.channel = StorageChannel.FLUIDS; diff --git a/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java b/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java index c063f3cf..0e5e174c 100644 --- a/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java +++ b/src/main/java/com/glodblock/github/inventory/item/WirelessPatternTerminal.java @@ -127,7 +127,6 @@ public class WirelessPatternTerminal extends MEMonitorHandler impl final ConfigManager out = new ConfigManager((manager, settingName, newValue) -> { final NBTTagCompound data = Platform.openNbtData(this.target); manager.writeToNBT(data); - }); out.registerSetting(Settings.SORT_BY, SortOrder.NAME); out.registerSetting(Settings.VIEW_MODE, ViewItems.ALL); diff --git a/src/main/java/com/glodblock/github/loader/RecipeLoader.java b/src/main/java/com/glodblock/github/loader/RecipeLoader.java index bbbc37e7..08ad3c9f 100644 --- a/src/main/java/com/glodblock/github/loader/RecipeLoader.java +++ b/src/main/java/com/glodblock/github/loader/RecipeLoader.java @@ -14,7 +14,7 @@ import net.minecraftforge.oredict.ShapelessOreRecipe; import com.glodblock.github.common.Config; import com.glodblock.github.common.item.ItemBasicFluidStorageCell; import com.glodblock.github.common.storage.CellType; -import com.glodblock.github.loader.recipe.WirelessTerminal; +import com.glodblock.github.loader.recipe.WirelessTerminalRecipe; import com.glodblock.github.util.ModAndClassUtil; import cpw.mods.fml.common.registry.GameRegistry; @@ -134,8 +134,8 @@ public class RecipeLoader implements Runnable { GameRegistry.addShapelessRecipe(WIRELESS_FLUID_TERM.stack(), AE2_WIRELESS_TERMINAL, BUCKET); GameRegistry.addShapelessRecipe(WIRELESS_PATTERN_TERM.stack(), WIRELESS_FLUID_TERM, FLUID_TERMINAL); if (ModAndClassUtil.WCT) { - GameRegistry.addRecipe(new WirelessTerminal(WIRELESS_PATTERN_TERM.stack())); - GameRegistry.addRecipe(new WirelessTerminal(WIRELESS_FLUID_TERM.stack())); + GameRegistry.addRecipe(new WirelessTerminalRecipe(WIRELESS_PATTERN_TERM.stack())); + GameRegistry.addRecipe(new WirelessTerminalRecipe(WIRELESS_FLUID_TERM.stack())); } GameRegistry .addRecipe(new ShapedOreRecipe(CERTUS_QUARTZ_TANK.stack(), "GGG", "G G", "GGG", 'G', AE2_QUARTZ_GLASS)); diff --git a/src/main/java/com/glodblock/github/loader/recipe/WirelessTerminal.java b/src/main/java/com/glodblock/github/loader/recipe/WirelessTerminalRecipe.java similarity index 94% rename from src/main/java/com/glodblock/github/loader/recipe/WirelessTerminal.java rename to src/main/java/com/glodblock/github/loader/recipe/WirelessTerminalRecipe.java index 35dbaa86..6fda7f3a 100644 --- a/src/main/java/com/glodblock/github/loader/recipe/WirelessTerminal.java +++ b/src/main/java/com/glodblock/github/loader/recipe/WirelessTerminalRecipe.java @@ -16,12 +16,12 @@ import appeng.util.Platform; import com.glodblock.github.common.item.ItemBaseWirelessTerminal; -public class WirelessTerminal extends ShapelessRecipes { +public class WirelessTerminalRecipe extends ShapelessRecipes { private static final ItemStack infinityBoosterCard = ItemEnum.BOOSTER_CARD.getStack(); private final ItemStack installedTerm; - public WirelessTerminal(ItemStack term) { + public WirelessTerminalRecipe(ItemStack term) { super(term, Arrays.asList(term, infinityBoosterCard)); this.installedTerm = installInfinityBoosterCard(term); } diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index 8902cebc..ab83f1e3 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -76,6 +76,7 @@ public class NameConst { public static final String TT_CELL_PORTABLE = TT_KEY + "cell_portable"; public static final String TT_WIRELESS = TT_KEY + "wireless."; public static final String TT_WIRELESS_INSTALLED = TT_WIRELESS + "installed"; + public static final String TT_FLUID_AUTO_FILLER = TT_KEY + "fluid_auto_filler"; public static final String WAILA_KEY = FluidCraft.MODID + ".waila."; public static final String WAILA_ENABLE = WAILA_KEY + "enable"; diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 9358bf37..f56a9f07 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -54,6 +54,7 @@ ae2fc.tooltip.fluid_packet_decoder.desc=The Fluid Decoder can decode Fluid packe ae2fc.tooltip.discretizer.desc=When the ME Fluid Discretizer is attached to your ME System, it will represent the Fluids that are stored in your ME Fluid Storage Cells (Or Storage bus) as drops. They will be the item equivalent of fluids. Its just another way to show fluids, it won't actually convert your fluids to items. ae2fc.tooltip.fluid_buffer.desc=This is a high speed fluid IO ae2fc.tooltip.walrus.desc=GTNH is like a job +ae2fc.tooltip.fluid_auto_filler=Creates fluid canning pattern with given container automatically. ae2fc.tooltip.level_maintainer.Who_Am_I=Who Am I? ae2fc.tooltip.level_maintainer.title=§6Request Status§r ae2fc.tooltip.level_maintainer.desc=Automatically keeps items and fluids in stock by requesting new crafts when needed. Has to be connected to an ME network. diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index 302807dd..ea1aa9bc 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -54,6 +54,7 @@ ae2fc.tooltip.fluid_packet_decoder.desc=流体解码器可以解码液体数据 ae2fc.tooltip.discretizer.desc=当ME流体离散器连接到您的ME系统时,它将把存储在的ME流体存储单元(或存储总线)中的流体表现为物品液滴。它们将是流体的等价物。它只是显示流体的另一种方式,它不会真正把你的流体转换成物品。 ae2fc.tooltip.fluid_buffer.desc=这就是一个高速的流体IO接口 ae2fc.tooltip.walrus.desc=GTNH is like a job +ae2fc.tooltip.fluid_auto_filler=自动生成指定容器流体灌装样板。 ae2fc.tooltip.level_maintainer.Who_Am_I=Who Am I? ae2fc.tooltip.level_maintainer.title=§6请求状态§r ae2fc.tooltip.level_maintainer.desc=通过在需要时请求合成,自动保持物品和流体的库存。必须连接到ME网络。