From 7ba0fc903e5d14928d2b894b00a7b7dfc65eee18 Mon Sep 17 00:00:00 2001 From: querns <33518699+querns@users.noreply.github.com> Date: Thu, 19 Sep 2024 08:53:17 -0500 Subject: Infinite Spraycan Additions (#3226) Co-authored-by: Caedis --- .../gregtech/common/items/MetaGeneratedItem01.java | 5 + .../items/behaviors/BehaviourSprayColor.java | 74 ++---- .../behaviors/BehaviourSprayColorInfinite.java | 282 +++++++++++++++++---- .../behaviors/BehaviourSprayColorRemover.java | 34 +-- 4 files changed, 265 insertions(+), 130 deletions(-) (limited to 'src/main/java/gregtech/common/items') diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java index 9afdb22673..68eea152a6 100644 --- a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java @@ -3462,6 +3462,7 @@ public class MetaGeneratedItem01 extends MetaGeneratedItemX32 { setAllFluidContainerStats(); setAllElectricStats(); registerTieredTooltips(); + registerSubIcons(); craftingShapedRecipes(); craftingShapelessRecipes(); @@ -4634,6 +4635,10 @@ public class MetaGeneratedItem01 extends MetaGeneratedItemX32 { setElectricStats(32000 + BatteryHull_UxV_Full.ID, 1677721600000L, GTValues.V[13], 13L, -3L, true); } + private void registerSubIcons() { + setSubIcons(Spray_Color_Infinite.ID, 3); + } + private void registerTieredTooltips() { registerTieredTooltip(ItemList.Battery_RE_ULV_Tantalum.get(1), ULV); registerTieredTooltip(ItemList.Battery_SU_LV_SulfuricAcid.get(1), LV); diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java index 8c655907f2..60b586335f 100644 --- a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java @@ -1,13 +1,9 @@ package gregtech.common.items.behaviors; -import java.util.Arrays; -import java.util.Collection; import java.util.List; import net.minecraft.block.Block; -import net.minecraft.block.BlockColored; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -16,13 +12,11 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import appeng.api.implementations.tiles.IColorableTile; -import appeng.api.util.AEColor; -import appeng.block.networking.BlockCableBus; import gregtech.api.enums.Dyes; import gregtech.api.enums.SoundResource; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.ColoredBlockContainer; import gregtech.api.util.GTLanguageManager; import gregtech.api.util.GTUtility; import gregtech.common.config.Other; @@ -34,13 +28,6 @@ public class BehaviourSprayColor extends BehaviourNone { private final ItemStack mFull; private final long mUses; private final byte mColor; - private final Collection mAllowedVanillaBlocks = Arrays.asList( - Blocks.glass, - Blocks.glass_pane, - Blocks.stained_glass, - Blocks.stained_glass_pane, - Blocks.carpet, - Blocks.hardened_clay); protected String mTooltip; private final String mTooltipUses = GTLanguageManager .addStringLocalization("gt.behaviour.paintspray.uses", "Remaining Uses:"); @@ -74,6 +61,21 @@ public class BehaviourSprayColor extends BehaviourNone { mTooltip = ""; } + @Override + // Included for Ring of Loki support. + public boolean onItemUse(final MetaBaseItem aItem, final ItemStack aStack, final EntityPlayer aPlayer, + final World aWorld, final int aX, final int aY, final int aZ, final int ordinalSide, final float hitX, + final float hitY, final float hitZ) { + final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide); + + if (ColoredBlockContainer.getInstance(aWorld, aX, aY, aZ, side, aPlayer) + .isValid()) { + return onItemUseFirst(aItem, aStack, aPlayer, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ); + } + + return false; + } + @Override public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { @@ -130,8 +132,8 @@ public class BehaviourSprayColor extends BehaviourNone { if (aWorld.getBlockMetadata(aX, aY, aZ) != initialBlockMeta) break; /* - * Check if the initial block had a TE and if the next one does, check if its the same kind. - * else one does and the other doesnt, thus stop checking. + * Check if the initial block had a TE and if the next one does, check if it's the same kind. + * else one does and the other doesn't, thus stop checking. */ TileEntity targetTE = aWorld.getTileEntity(aX, aY, aZ); if (initialTE == null ^ targetTE == null) break; @@ -149,6 +151,13 @@ public class BehaviourSprayColor extends BehaviourNone { return rOutput; } + @Override + public boolean shouldInterruptBlockActivation(final EntityPlayer player, final TileEntity tileEntity, + final ForgeDirection side) { + return ColoredBlockContainer.getInstance(player, tileEntity, side) + .isValid(); + } + protected long getUses(ItemStack aStack, NBTTagCompound tNBT) { long tUses = tNBT.getLong("GT.RemainingPaint"); if (GTUtility.areStacksEqual(aStack, this.mFull, true)) { @@ -180,37 +189,8 @@ public class BehaviourSprayColor extends BehaviourNone { } protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { - final Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock != Blocks.air) { - if (this.mAllowedVanillaBlocks.contains(aBlock) || aBlock instanceof BlockColored) { - if (aBlock == Blocks.hardened_clay) { - aWorld.setBlock(aX, aY, aZ, Blocks.stained_hardened_clay, (~getColor()) & 0xF, 3); - return true; - } - if (aBlock == Blocks.glass_pane) { - aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass_pane, (~getColor()) & 0xF, 3); - return true; - } - if (aBlock == Blocks.glass) { - aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass, (~getColor()) & 0xF, 3); - return true; - } - if (aWorld.getBlockMetadata(aX, aY, aZ) == ((~getColor()) & 0xF)) { - return false; - } - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (~getColor()) & 0xF, 3); - return true; - } - - if (aBlock instanceof IColorableTile) { - return ((IColorableTile) aBlock).recolourBlock(side, AEColor.values()[(~getColor()) & 0xF], player); - } - - if (aBlock instanceof BlockCableBus) { - return ((BlockCableBus) aBlock).recolourBlock(aWorld, aX, aY, aZ, side, (~getColor()) & 0xF, player); - } - } - return aBlock.recolourBlock(aWorld, aX, aY, aZ, side, (~getColor()) & 0xF); + return ColoredBlockContainer.getInstance(aWorld, aX, aY, aZ, side, player) + .setColor(getColor()); } protected byte getColor() { diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java index 6f7d99fe3a..ad22dcb958 100644 --- a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java @@ -1,49 +1,71 @@ package gregtech.common.items.behaviors; import static gregtech.api.enums.GTValues.AuthorQuerns; +import static net.minecraft.util.MovingObjectPosition.MovingObjectType.BLOCK; import java.util.List; +import java.util.function.Consumer; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.gtnhlib.GTNHLib; +import com.gtnewhorizons.modularui.api.UIInfos; +import com.gtnewhorizons.modularui.api.widget.Widget; + import gregtech.api.enums.Dyes; import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; import gregtech.api.items.MetaBaseItem; import gregtech.api.net.GTPacketInfiniteSpraycan; -import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.ColoredBlockContainer; +import gregtech.api.util.GTUtility; import gregtech.common.config.Other; +import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory; public class BehaviourSprayColorInfinite extends BehaviourSprayColor { private static final byte REMOVE_COLOR = (byte) Dyes.VALUES.length; - private static final String COLOR_NBT_TAG = "current_color"; - private final String tooltipInfinite = GTLanguageManager - .addStringLocalization("gt.behaviour.paintspray.infinite.tooltip", "Infinite uses"); - private final String tooltipSwitchHint = GTLanguageManager.addStringLocalization( - "gt.behaviour.paintspray.infinite.hint.tooltip", - "Left click to change color (sneak to reverse direction)"); + private static final List COLOR_SELECTIONS; + public static final String COLOR_NBT_TAG = "current_color"; + public static final String LOCK_NBT_TAG = "is_locked"; + public static final String SEPARATOR = "-----------------------------------------"; private byte mCurrentColor; + static { + final ImmutableList.Builder builder = ImmutableList.builder(); + + for (int i = 0; i < 16; i++) { + builder.add(new ItemStack(Items.dye, 1, i)); + } + + builder.add(ItemList.Spray_Color_Remover.get(1)); + COLOR_SELECTIONS = builder.build(); + } + public BehaviourSprayColorInfinite(ItemStack sprayCan) { super(sprayCan, sprayCan, sprayCan, Other.sprayCanChainRange, 0); this.mTooltip = ""; mCurrentColor = 0; } + // region Base Method Overrides @Override - protected long getUses(ItemStack aStack, NBTTagCompound tNBT) { + protected long getUses(ItemStack itemStack, NBTTagCompound tNBT) { return Other.sprayCanChainRange; } @Override - protected void setRemainingUses(ItemStack aStack, NBTTagCompound tNBT, long tUses) { + protected void setRemainingUses(ItemStack itemStack, NBTTagCompound tNBT, long tUses) { // Infinite spray can; do nothing } @@ -56,87 +78,243 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { } @Override - public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack itemStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { - if ((aWorld.isRemote) || (aStack.stackSize != 1)) { + if ((aWorld.isRemote) || (itemStack.stackSize != 1)) { return false; } - if (aStack.hasTagCompound()) { - final NBTTagCompound tag = aStack.getTagCompound(); + if (itemStack.hasTagCompound()) { + final NBTTagCompound tag = itemStack.getTagCompound(); if (tag.hasKey(COLOR_NBT_TAG)) { mCurrentColor = tag.getByte(COLOR_NBT_TAG); } } - return super.onItemUseFirst(aItem, aStack, aPlayer, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ); + return super.onItemUseFirst(aItem, itemStack, aPlayer, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ); } @Override protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { + ColoredBlockContainer block = ColoredBlockContainer.getInstance(aWorld, aX, aY, aZ, side, player); if (mCurrentColor == REMOVE_COLOR) { - return BehaviourSprayColorRemover.removeColor(aWorld, aX, aY, aZ, side, player); + return block.removeColor(); + } + return block.setColor(getColor()); + } + + @Override + public List getAdditionalToolTips(final MetaBaseItem aItem, final List aList, + final ItemStack itemStack) { + aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.infinite")); + aList.add(mTooltipChain); + aList.add(SEPARATOR); + aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.more_info")); + aList.add(SEPARATOR); + aList.add(AuthorQuerns); + + return aList; + } + + @Override + public List getAdditionalToolTipsWhileSneaking(final MetaBaseItem aItem, final List aList, + final ItemStack aStack) { + aList.add(SEPARATOR); + aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.switch")); + aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.gui")); + aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.pick")); + aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.lock")); + aList.add(SEPARATOR); + aList.add(AuthorQuerns); + + return aList; + } + // endregion + + // region Raw Mouse Event Handlers + @Override + public boolean onLeftClick(MetaBaseItem item, ItemStack itemStack, EntityPlayer aPlayer) { + if (isLocked(itemStack)) { + displayLockedMessage(); + } else { + sendPacket(GTPacketInfiniteSpraycan.Action.INCREMENT_COLOR); } - return super.colorize(aWorld, aX, aY, aZ, side, player); + return true; } - public boolean onLeftClick(MetaBaseItem item, ItemStack aStack, EntityPlayer aPlayer) { - GTValues.NW.sendToServer(new GTPacketInfiniteSpraycan(aPlayer.isSneaking())); + @Override + public boolean onMiddleClick(final MetaBaseItem item, final ItemStack itemStack, final EntityPlayer player) { + if (player.isSneaking()) { + sendPacket(GTPacketInfiniteSpraycan.Action.LOCK_CAN); + } else if (isLocked(itemStack)) { + displayLockedMessage(); + } else { + final MovingObjectPosition position = GTUtility.getPlayerLookingTarget(player); + + if (position != null && position.typeOfHit == BLOCK) { + final ColoredBlockContainer block = ColoredBlockContainer.getInstance(player, position); + if (block.getColor() + .isPresent()) { + sendPacket( + GTPacketInfiniteSpraycan.Action.SET_COLOR, + block.getColor() + .get()); + return true; + } + } + + openGUI(player, itemStack); + } return true; } + // endregion - private static byte clampColor(byte newColor) { - if (newColor > REMOVE_COLOR) { - newColor = 0; - } else if (newColor < 0) { - newColor = REMOVE_COLOR; + // region GUI + private void openGUI(final EntityPlayer player, final ItemStack itemStack) { + UIInfos.openClientUI( + player, + buildContext -> new DyeSelectGUI( + StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.gui.header"), + itemStack, + selectedStack -> sendPacket( + GTPacketInfiniteSpraycan.Action.SET_COLOR, + selectedStack.getItem() == Items.dye ? selectedStack.getItemDamage() : REMOVE_COLOR), + COLOR_SELECTIONS, + getColor(itemStack), + true).createWindow(buildContext)); + } + + private byte getColor(ItemStack sprayCan) { + if (sprayCan.hasTagCompound()) { + final NBTTagCompound tag = sprayCan.getTagCompound(); + if (tag.hasKey(COLOR_NBT_TAG)) { + return tag.getByte(COLOR_NBT_TAG); + } } - return newColor; + + return REMOVE_COLOR; + } + + private static void displayLockedMessage() { + GTNHLib.proxy.printMessageAboveHotbar( + StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.gui.lock_error"), + 120, + true, + true); } + // endregion - public void setNewColor(final ItemStack aStack, final boolean wasSneaking) { - final NBTTagCompound tag = aStack.hasTagCompound() ? aStack.getTagCompound() : new NBTTagCompound(); + // region Networking + private static void sendPacket(GTPacketInfiniteSpraycan.Action action) { + GTValues.NW.sendToServer(new GTPacketInfiniteSpraycan(action)); + } + + private static void sendPacket(@SuppressWarnings("SameParameterValue") GTPacketInfiniteSpraycan.Action action, + int newColor) { + GTValues.NW.sendToServer(new GTPacketInfiniteSpraycan(action, newColor)); + } + // endregion + + // region Server Actions + public void incrementColor(final ItemStack itemStack, final boolean wasSneaking) { + if (isLocked(itemStack)) { + return; + } + + final NBTTagCompound tag = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound(); byte color = 0; if (tag.hasKey(COLOR_NBT_TAG)) { color = tag.getByte(COLOR_NBT_TAG); } - color = clampColor((byte) (color + (wasSneaking ? -1 : 1))); + byte newColor = (byte) (color + (wasSneaking ? -1 : 1)); + if (newColor > REMOVE_COLOR) { + newColor = 0; + } else if (newColor < 0) { + newColor = REMOVE_COLOR; + } + color = newColor; + + setColor(itemStack, color); + } + + public void setColor(final ItemStack itemStack, final byte color) { + if (isLocked(itemStack)) { + return; + } + + final NBTTagCompound tag = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound(); tag.setByte(COLOR_NBT_TAG, color); mCurrentColor = color; - aStack.setTagCompound(tag); + itemStack.setTagCompound(tag); + + setItemStackName(itemStack); + } + + public boolean toggleLock(final ItemStack itemStack) { + final NBTTagCompound tag = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound(); + final boolean newLockStatus = !tag.getBoolean(LOCK_NBT_TAG); + + tag.setBoolean(LOCK_NBT_TAG, newLockStatus); + itemStack.setTagCompound(tag); + setItemStackName(itemStack); + + return newLockStatus; + } + + private void setItemStackName(final ItemStack itemStack) { + final boolean isLocked = isLocked(itemStack); + final char lBracket = isLocked ? '[' : '('; + final char rBracket = isLocked ? ']' : ')'; if (mCurrentColor == REMOVE_COLOR) { - aStack.setStackDisplayName("Infinite Spray Can (Solvent)"); + itemStack.setStackDisplayName(String.format("Infinite Spray Can %cSolvent%c", lBracket, rBracket)); } else { - aStack.setStackDisplayName("Infinite Spray Can (" + Dyes.get(mCurrentColor).mName + ")"); + itemStack.setStackDisplayName( + String.format("Infinite Spray Can %c" + Dyes.get(mCurrentColor).mName + "%c", lBracket, rBracket)); } } + // endregion - @Override - public List getAdditionalToolTips(final MetaBaseItem aItem, final List aList, - final ItemStack aStack) { - if (mCurrentColor == REMOVE_COLOR) { - aList.add( - GTLanguageManager.addStringLocalization( - "gt.behavior.paintspray.infinite.remover.tooltip", - "Current color: Solvent (clears color)")); - } else { - final Dyes currentDye = Dyes.get(mCurrentColor); - final String diamondSymbol = " " + currentDye.formatting + "♦" + EnumChatFormatting.RESET + " "; - aList.add( - GTLanguageManager.addStringLocalization( - "gt.behaviour.paintspray.infinite." + mCurrentColor + ".tooltip", - "Current color:" + diamondSymbol + currentDye.mName + diamondSymbol)); - } - aList.add(tooltipInfinite); - aList.add(tooltipSwitchHint); - aList.add(mTooltipChain); - aList.add(AuthorQuerns); + public static Dyes getDye(ItemStack itemStack) { + if (itemStack.hasTagCompound()) { + final byte color = itemStack.getTagCompound() + .getByte(COLOR_NBT_TAG); + if (color != REMOVE_COLOR) { + return Dyes.getDyeFromIndex(color); + } + } - return aList; + return Dyes.MACHINE_METAL; + } + + public boolean isLocked(final ItemStack itemStack) { + return itemStack.hasTagCompound() && itemStack.getTagCompound() + .getBoolean(LOCK_NBT_TAG); + } + + private static class DyeSelectGUI extends SelectItemUIFactory { + + public DyeSelectGUI(final String header, final ItemStack headerItem, final Consumer selectedCallback, + final List stacks, final int selected, final boolean noDeselect) { + super(header, headerItem, selectedCallback, stacks, selected, noDeselect); + } + + @Override + public void setSelected(final int selected, Widget widget) { + super.setSelected(selected, widget); + widget.getWindow() + .closeWindow(); + } + + @Override + protected List getItemTooltips(final int index) { + return ImmutableList.of( + index == REMOVE_COLOR ? StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.gui.solvent") + : Dyes.getDyeFromIndex((short) index).mName); + } } } diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java index 1cf51f32fa..0a6d2095e1 100644 --- a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java @@ -1,17 +1,11 @@ package gregtech.common.items.behaviors; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import appeng.api.implementations.tiles.IColorableTile; -import appeng.api.util.AEColor; -import appeng.block.networking.BlockCableBus; -import gregtech.api.interfaces.tileentity.IColoredTileEntity; +import gregtech.api.util.ColoredBlockContainer; import gregtech.api.util.GTLanguageManager; public class BehaviourSprayColorRemover extends BehaviourSprayColor { @@ -24,29 +18,7 @@ public class BehaviourSprayColorRemover extends BehaviourSprayColor { @Override protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { - return removeColor(aWorld, aX, aY, aZ, side, player); - } - - public static boolean removeColor(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { - final Block aBlock = aWorld.getBlock(aX, aY, aZ); - if (aBlock != Blocks.air) { - if (aBlock instanceof IColorableTile) { - return ((IColorableTile) aBlock).recolourBlock(side, AEColor.Transparent, player); - } - - if (aBlock instanceof BlockCableBus) { - return ((BlockCableBus) aBlock) - .recolourBlock(aWorld, aX, aY, aZ, side, AEColor.Transparent.ordinal(), player); - } - - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IColoredTileEntity gte) { - if (gte.getColorization() >= 0) { - gte.setColorization((byte) -1); - return true; - } - } - } - return false; + return ColoredBlockContainer.getInstance(aWorld, aX, aY, aZ, side, player) + .removeColor(); } } -- cgit