diff options
author | Glease <4586901+Glease@users.noreply.github.com> | 2021-11-16 06:46:29 +0800 |
---|---|---|
committer | Glease <4586901+Glease@users.noreply.github.com> | 2021-11-17 11:25:04 +0800 |
commit | ea9df088740cf44d8f77275b17f519127750bf4f (patch) | |
tree | 8c3290cb0fa016d580eba9d80113db9eb203bed7 /src | |
parent | 3f29e8c504ed163b7df9c4fb02a58d51ce2b878c (diff) | |
download | GT5-Unofficial-ea9df088740cf44d8f77275b17f519127750bf4f.tar.gz GT5-Unofficial-ea9df088740cf44d8f77275b17f519127750bf4f.tar.bz2 GT5-Unofficial-ea9df088740cf44d8f77275b17f519127750bf4f.zip |
convert ItemFilter to use NBTTagCompound storage
Signed-off-by: Glease <4586901+Glease@users.noreply.github.com>
Diffstat (limited to 'src')
3 files changed, 166 insertions, 101 deletions
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java index 010ac78654..e7b6b9971d 100644 --- a/src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java +++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java @@ -3,13 +3,22 @@ package gregtech.api.gui.widgets; import gregtech.api.interfaces.IGuiScreen; public class GT_GuiIconCheckButton extends GT_GuiIconButton { - private GT_GuiIcon checkedIcon, normalIcon; + private final GT_GuiIcon checkedIcon; + private final GT_GuiIcon normalIcon; + private final String checkedTooltip; + private final String normalTooltip; private boolean checked = false; public GT_GuiIconCheckButton(IGuiScreen gui, int id, int x, int y, GT_GuiIcon checkedIcon, GT_GuiIcon normalIcon) { + this(gui, id, x, y, checkedIcon, normalIcon, null, null); + } + + public GT_GuiIconCheckButton(IGuiScreen gui, int id, int x, int y, GT_GuiIcon checkedIcon, GT_GuiIcon normalIcon, String checkedTooltip, String normalTooltip) { super(gui, id, x, y, normalIcon); this.checkedIcon = checkedIcon; this.normalIcon = normalIcon; + this.checkedTooltip = checkedTooltip; + this.normalTooltip = normalTooltip; } @Override @@ -27,6 +36,7 @@ public class GT_GuiIconCheckButton extends GT_GuiIconButton { public void setChecked(boolean checked) { super.setIcon(checked ? checkedIcon : normalIcon); + super.setTooltipText(checked ? checkedTooltip : normalTooltip); this.checked = checked; } } diff --git a/src/main/java/gregtech/api/util/ISerializableObject.java b/src/main/java/gregtech/api/util/ISerializableObject.java index 1a38aee5f7..4ca5b1e543 100644 --- a/src/main/java/gregtech/api/util/ISerializableObject.java +++ b/src/main/java/gregtech/api/util/ISerializableObject.java @@ -3,10 +3,16 @@ package gregtech.api.util; import com.google.common.io.ByteArrayDataInput; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTSizeTracker; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagInt; import javax.annotation.Nonnull; +import java.io.IOException; /** * We could well have used {@link java.io.Serializable}, but that's too slow and should generally be avoided @@ -37,6 +43,41 @@ public interface ISerializableObject { @Nonnull ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer); + /** + * Reverse engineered and adapted {@link cpw.mods.fml.common.network.ByteBufUtils#readTag(ByteBuf)} + * Given buffer must contain a serialized NBTTagCompound in minecraft encoding + */ + static NBTTagCompound readCompoundTagFromGreggyByteBuf(ByteArrayDataInput aBuf) { + short size = aBuf.readShort(); + if (size < 0) + return null; + else { + byte[] buf = new byte[size]; // this is shit, how many copies have we been doing? + aBuf.readFully(buf); + try { + return CompressedStreamTools.func_152457_a(buf, new NBTSizeTracker(2097152L)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + /** + * Reverse engineered and adapted {@link cpw.mods.fml.common.network.ByteBufUtils#readItemStack(ByteBuf)} + * Given buffer must contain a serialized ItemStack in minecraft encoding + */ + static ItemStack readItemStackFromGreggyByteBuf(ByteArrayDataInput aBuf) { + ItemStack stack = null; + short id = aBuf.readShort(); + if (id >= 0) { + byte size = aBuf.readByte(); + short meta = aBuf.readShort(); + stack = new ItemStack(Item.getItemById(id), size, meta); + stack.stackTagCompound = readCompoundTagFromGreggyByteBuf(aBuf); + } + return stack; + } + final class LegacyCoverData implements ISerializableObject { private int mData; diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java index 97f989035d..ab7aeee861 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java @@ -1,153 +1,142 @@ package gregtech.common.covers; +import com.google.common.io.ByteArrayDataInput; +import cpw.mods.fml.common.network.ByteBufUtils; import gregtech.api.enums.GT_Values; import gregtech.api.gui.GT_GUICover; import gregtech.api.gui.widgets.GT_GuiFakeItemButton; import gregtech.api.gui.widgets.GT_GuiIcon; -import gregtech.api.gui.widgets.GT_GuiIconButton; +import gregtech.api.gui.widgets.GT_GuiIconCheckButton; import gregtech.api.interfaces.tileentity.ICoverable; -import gregtech.api.net.GT_Packet_TileEntityCover; -import gregtech.api.util.GT_CoverBehavior; +import gregtech.api.net.GT_Packet_TileEntityCoverNew; +import gregtech.api.util.GT_CoverBehavior_New; import gregtech.api.util.GT_Utility; import gregtech.api.util.ISerializableObject; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.Fluid; +import javax.annotation.Nonnull; import java.util.Collections; import java.util.List; import static gregtech.api.util.GT_Utility.intToStack; import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; -import static gregtech.api.util.GT_Utility.stackToInt; -public class GT_Cover_ItemFilter extends GT_CoverBehavior { +public class GT_Cover_ItemFilter extends GT_CoverBehavior_New<GT_Cover_ItemFilter.ItemFilterData> { private final boolean mExport; - public GT_Cover_ItemFilter(boolean isExport){ + public GT_Cover_ItemFilter(boolean isExport) { + super(ItemFilterData.class); this.mExport = isExport; } @Override - public boolean isRedstoneSensitive(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, long aTimer) { + public ItemFilterData createDataObject(int aLegacyData) { + return new ItemFilterData((aLegacyData & 0x1) == 0, intToStack(aLegacyData >>> 1)); + } + + @Override + public ItemFilterData createDataObject() { + return new ItemFilterData(); + } + + @Override + protected boolean isRedstoneSensitiveImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) { return false; } @Override - public int doCoverThings(byte aSide, byte aInputRedstone, int aCoverID, int aCoverVariable, ICoverable aTileEntity, long aTimer) { + protected ItemFilterData doCoverThingsImpl(byte aSide, byte aInputRedstone, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) { TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(aSide); Object fromEntity = mExport ? aTileEntity : tTileEntity, toEntity = !mExport ? aTileEntity : tTileEntity; byte fromSide = !mExport ? GT_Utility.getOppositeSide(aSide) : aSide, toSide = mExport ? GT_Utility.getOppositeSide(aSide) : aSide; - int FilterId = aCoverVariable >>> 1; - List<ItemStack> Filter = Collections.singletonList(intToStack(FilterId)); + List<ItemStack> Filter = Collections.singletonList(aCoverVariable.mFilter); - boolean isWhiteList = (aCoverVariable & 1) != 0; - - moveMultipleItemStacks(fromEntity, toEntity, fromSide , toSide, Filter, isWhiteList, (byte) 64, (byte) 1, (byte) 64, (byte) 1,64); + moveMultipleItemStacks(fromEntity, toEntity, fromSide, toSide, Filter, aCoverVariable.mWhitelist, (byte) 64, (byte) 1, (byte) 64, (byte) 1, 64); return aCoverVariable; } @Override - protected boolean onCoverRightClickImpl(byte aSide, int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + protected boolean onCoverRightClickImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { ItemStack tStack = aPlayer.inventory.getCurrentItem(); - int tCoverVariable = aCoverVariable.get() & 1; if (tStack != null) { - tCoverVariable = (stackToInt(tStack) << 1) + tCoverVariable; - aCoverVariable.set(tCoverVariable); + aCoverVariable.mFilter = tStack; GT_Utility.sendChatToPlayer(aPlayer, trans("301", "Item Filter: ") + tStack.getDisplayName()); } else { - aCoverVariable.set(tCoverVariable); + aCoverVariable.mFilter = null; GT_Utility.sendChatToPlayer(aPlayer, trans("300", "Filter Cleared!")); } return true; } @Override - @SuppressWarnings("deprecation") - public boolean onCoverRightclick(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ){ - ItemStack tStack = aPlayer.inventory.getCurrentItem(); - if (tStack != null){ - aCoverVariable = (stackToInt(tStack) << 1) + (aCoverVariable & 1); - aTileEntity.setCoverDataAtSide(aSide, aCoverVariable); - GT_Utility.sendChatToPlayer(aPlayer, trans("301", "Item Filter: ") + tStack.getDisplayName()); - } - else{ - aCoverVariable = aCoverVariable & 1; - aTileEntity.setCoverDataAtSide(aSide, aCoverVariable); - GT_Utility.sendChatToPlayer(aPlayer, trans("300", "Filter Cleared!")); - } - return true; - } - - @Override - public int onCoverScrewdriverclick(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { - int mode = aCoverVariable & 1; - if (mode == 1) mode = 0; - else mode = 1; - if (mode == 1){ - GT_Utility.sendChatToPlayer(aPlayer, trans("124", "Blacklist Mode")); - } - else{ - GT_Utility.sendChatToPlayer(aPlayer, trans("125", "Whitelist Mode")); - } - aCoverVariable = (aCoverVariable & ~0x1) + mode; + protected ItemFilterData onCoverScrewdriverClickImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) { + aCoverVariable.mWhitelist = !aCoverVariable.mWhitelist; + GT_Utility.sendChatToPlayer(aPlayer, aCoverVariable.mWhitelist ? trans("125", "Whitelist Mode") : trans("124", "Blacklist Mode")); return aCoverVariable; } @Override - public boolean letsRedstoneGoIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + protected boolean letsRedstoneGoInImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity) { return true; } @Override - public boolean letsRedstoneGoOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + protected boolean letsRedstoneGoOutImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity) { return true; } @Override - public boolean letsEnergyIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + protected boolean letsEnergyInImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity) { return true; } @Override - public boolean letsEnergyOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + protected boolean letsEnergyOutImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity) { return true; } @Override - public boolean letsFluidIn(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + protected boolean letsFluidInImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { return false; } @Override - public boolean letsFluidOut(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + protected boolean letsFluidOutImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { return false; } @Override - public boolean letsItemsIn(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) { + protected boolean letsItemsInImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, int aSlot, ICoverable aTileEntity) { return true; } @Override - public boolean letsItemsOut(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) { + protected boolean letsItemsOutImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, int aSlot, ICoverable aTileEntity) { return true; } @Override - public boolean alwaysLookConnected(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + protected boolean alwaysLookConnectedImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity) { return true; } @Override - public int getTickRate(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + protected int getTickRateImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity) { return 1; } @@ -161,14 +150,68 @@ public class GT_Cover_ItemFilter extends GT_CoverBehavior { } @Override - public Object getClientGUI(byte aSide, int aCoverID, int coverData, ICoverable aTileEntity) { - return new GT_Cover_ItemFilter.GUI(aSide, aCoverID, coverData, aTileEntity); + protected Object getClientGUIImpl(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, World aWorld) { + return new GT_Cover_ItemFilter.GUI(aSide, aCoverID, aCoverVariable, aTileEntity); + } + + public static class ItemFilterData implements ISerializableObject { + private boolean mWhitelist; + private ItemStack mFilter; + + public ItemFilterData() { + } + + public ItemFilterData(boolean mWhitelist, ItemStack mFilter) { + this.mWhitelist = mWhitelist; + this.mFilter = mFilter; + } + + @Nonnull + @Override + public ISerializableObject copy() { + return new ItemFilterData(mWhitelist, mFilter); + } + + @Nonnull + @Override + public NBTBase saveDataToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setBoolean("mWhitelist", mWhitelist); + if (mFilter != null) + tag.setTag("mFilter", mFilter.writeToNBT(new NBTTagCompound())); + return tag; + } + + @Override + public void writeToByteBuf(ByteBuf aBuf) { + aBuf.writeBoolean(mWhitelist); + ByteBufUtils.writeItemStack(aBuf, mFilter); + } + + @Override + public void loadDataFromNBT(NBTBase aNBT) { + NBTTagCompound tag = (NBTTagCompound) aNBT; + mWhitelist = tag.getBoolean("mWhitelist"); + if (tag.hasKey("mFilter", Constants.NBT.TAG_COMPOUND)) + mFilter = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mFilter")); + else + mFilter = null; + } + + @Nonnull + @Override + public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) { + mWhitelist = aBuf.readBoolean(); + mFilter = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf); + return this; + } } private class GUI extends GT_GUICover { private final byte side; private final int coverID; - private int coverVariable; + private final GT_GuiIconCheckButton btnMode; + private final ItemFilterData coverVariable; private final GT_GuiFakeItemButton itemFilterButtons; private static final int startX = 10; @@ -176,17 +219,15 @@ public class GT_Cover_ItemFilter extends GT_CoverBehavior { private static final int spaceX = 18; private static final int spaceY = 18; - public GUI(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + public GUI(byte aSide, int aCoverID, ItemFilterData aCoverVariable, ICoverable aTileEntity) { super(aTileEntity, 176, 107, GT_Utility.intToStack(aCoverID)); this.side = aSide; this.coverID = aCoverID; this.coverVariable = aCoverVariable; - GT_GuiIconButton b; - b = new GT_GuiIconButton(this, 0, startX + spaceX*0, startY+spaceY*0, GT_GuiIcon.WHITELIST).setTooltipText(trans("125","Whitelist Mode")); - b = new GT_GuiIconButton(this, 1, startX + spaceX*1, startY+spaceY*0, GT_GuiIcon.BLACKLIST).setTooltipText(trans("124","Blacklist Mode")); + btnMode = new GT_GuiIconCheckButton(this, 0, startX + spaceX * 0, startY + spaceY * 0, GT_GuiIcon.WHITELIST, GT_GuiIcon.BLACKLIST, trans("125", "Whitelist Mode"), trans("124", "Blacklist Mode")); - itemFilterButtons = new GT_GuiFakeItemButton(this ,startX + spaceX*0, startY+spaceY*2, GT_GuiIcon.SLOT_GRAY); + itemFilterButtons = new GT_GuiFakeItemButton(this, startX + spaceX * 0, startY + spaceY * 2, GT_GuiIcon.SLOT_GRAY); } @Override @@ -202,46 +243,19 @@ public class GT_Cover_ItemFilter extends GT_CoverBehavior { } @Override - public void buttonClicked(GuiButton btn){ - if (getClickable(btn.id)){ - coverVariable = getNewCoverVariable(btn.id); - GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile)); + public void buttonClicked(GuiButton btn) { + if (btn == btnMode) { + if (coverVariable.mWhitelist != btnMode.isChecked()) { + coverVariable.mWhitelist = btnMode.isChecked(); + GT_Values.NW.sendToServer(new GT_Packet_TileEntityCoverNew(side, coverID, coverVariable, tile)); + } } updateButtons(); } - private void updateButtons(){ - GuiButton b; - for (Object o : buttonList) { - b = (GuiButton) o; - b.enabled = getClickable(b.id); - } - ItemStack tItemStack = intToStack(coverVariable >>> 1); - if (tItemStack != null){ - itemFilterButtons.setItem(tItemStack); - return; - } - itemFilterButtons.setItem(null); - } - - private int getNewCoverVariable(int id) { - switch (id) { - case 0: - return coverVariable & ~0x1; - case 1: - return coverVariable | 0x1; - } - return coverVariable; - } - - private boolean getClickable(int id) { - switch (id) { - case 0: - return (0x1 & coverVariable) != 0; - case 1: - return (0x1 & coverVariable) == 0; - } - return false; + private void updateButtons() { + btnMode.setChecked(coverVariable.mWhitelist); + itemFilterButtons.setItem(coverVariable.mFilter); } } } |