diff options
author | querns <33518699+querns@users.noreply.github.com> | 2024-09-08 13:02:12 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-08 18:02:12 +0000 |
commit | 3b2431ea07cff32fa174f496a1e16246a89b429e (patch) | |
tree | 3987a80f2fd5e396ae70821971b3d673e003dfe0 /src/main/java | |
parent | 8ca97eab0abfc33a37a15fe4a66bc112c743480a (diff) | |
download | GT5-Unofficial-3b2431ea07cff32fa174f496a1e16246a89b429e.tar.gz GT5-Unofficial-3b2431ea07cff32fa174f496a1e16246a89b429e.tar.bz2 GT5-Unofficial-3b2431ea07cff32fa174f496a1e16246a89b429e.zip |
Adds Infinite Spray Can, left click event for item behaviors (#3085)
Co-authored-by: Martin Robertz <dream-master@gmx.net>
Co-authored-by: boubou19 <miisterunknown@gmail.com>
Diffstat (limited to 'src/main/java')
13 files changed, 341 insertions, 18 deletions
diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java index f995de5032..0f66bae640 100644 --- a/src/main/java/gregtech/api/enums/ItemList.java +++ b/src/main/java/gregtech/api/enums/ItemList.java @@ -2563,6 +2563,7 @@ public enum ItemList implements IItemContainer { Phononic_Seed_Crystal, ResearchCompleter, // Populated in EMT SpaceElevatorController, // Populated in GTNH-Intergalactic + Spray_Color_Infinite, // semicolon after the comment to reduce merge conflicts ; diff --git a/src/main/java/gregtech/api/enums/SoundResource.java b/src/main/java/gregtech/api/enums/SoundResource.java index edd8e5c6a3..f6ca0485dc 100644 --- a/src/main/java/gregtech/api/enums/SoundResource.java +++ b/src/main/java/gregtech/api/enums/SoundResource.java @@ -74,6 +74,8 @@ public enum SoundResource { GT_MACHINES_MULTI_LATHE_LOOP(241, GregTech.ID, "machines.MultiLatheLoop"), GT_MACHINES_MULTI_AUTOCLAVE_LOOP(242, GregTech.ID, "machines.MultiAutoclaveLoop"), + GT_SPRAYCAN_SHAKE(243, GregTech.ID, "items.spraycan"), + GUI_BUTTON_DOWN(-1, GregTech.ID, "gui.buttonDown"), GUI_BUTTON_UP(-1, GregTech.ID, "gui.buttonUp"), diff --git a/src/main/java/gregtech/api/interfaces/IItemBehaviour.java b/src/main/java/gregtech/api/interfaces/IItemBehaviour.java index d9f8706824..8c5dad6dc2 100644 --- a/src/main/java/gregtech/api/interfaces/IItemBehaviour.java +++ b/src/main/java/gregtech/api/interfaces/IItemBehaviour.java @@ -17,6 +17,10 @@ import gregtech.api.items.MetaBaseItem; public interface IItemBehaviour<E extends Item> { + default boolean onLeftClick(E aItem, ItemStack aStack, EntityPlayer aPlayer) { + return false; + } + boolean onLeftClickEntity(E aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity); boolean onItemUse(E aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, diff --git a/src/main/java/gregtech/api/items/MetaBaseItem.java b/src/main/java/gregtech/api/items/MetaBaseItem.java index 23726c96e9..32e4bba392 100644 --- a/src/main/java/gregtech/api/items/MetaBaseItem.java +++ b/src/main/java/gregtech/api/items/MetaBaseItem.java @@ -7,6 +7,7 @@ import static gregtech.api.util.GTUtility.formatNumbers; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Predicate; import net.minecraft.dispenser.IBlockSource; import net.minecraft.entity.Entity; @@ -118,6 +119,10 @@ public abstract class MetaBaseItem extends GTGenericItem return super.isItemStackUsable(aStack); } + public boolean onLeftClick(ItemStack aStack, EntityPlayer aPlayer) { + return forEachBehavior(aStack, behavior -> behavior.onLeftClick(this, aStack, aPlayer)); + } + @Override public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { use(aStack, 0, aPlayer); @@ -619,4 +624,25 @@ public abstract class MetaBaseItem extends GTGenericItem public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) { return false; } + + public boolean forEachBehavior(ItemStack aStack, Predicate<IItemBehaviour<MetaBaseItem>> predicate) { + ArrayList<IItemBehaviour<MetaBaseItem>> behaviorList = mItemBehaviors.get((short) getDamage(aStack)); + if (behaviorList == null) { + return false; + } + + try { + for (IItemBehaviour<MetaBaseItem> behavior : behaviorList) { + if (predicate.test(behavior)) { + // Returning true short circuits the loop, and false continues it. + return true; + } + } + } catch (Exception e) { + if (D1) e.printStackTrace(GTLog.err); + } + + return false; + } + } diff --git a/src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java b/src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java new file mode 100644 index 0000000000..66ad89590f --- /dev/null +++ b/src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java @@ -0,0 +1,76 @@ +package gregtech.api.net; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.world.IBlockAccess; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; +import gregtech.common.items.behaviors.BehaviourSprayColorInfinite; +import io.netty.buffer.ByteBuf; + +public class GTPacketInfiniteSpraycan extends GTPacketNew { + + private boolean wasSneaking; + private EntityPlayerMP player; + + public GTPacketInfiniteSpraycan() { + super(true); + } + + public GTPacketInfiniteSpraycan(boolean wasSneaking) { + super(false); + this.wasSneaking = wasSneaking; + } + + @Override + public byte getPacketID() { + return GTPacketTypes.INFINITE_SPRAYCAN.id; + } + + @Override + public void encode(final ByteBuf aOut) { + aOut.writeBoolean(wasSneaking); + } + + @Override + public GTPacketNew decode(final ByteArrayDataInput aData) { + return new GTPacketInfiniteSpraycan(aData.readBoolean()); + } + + @Override + public void setINetHandler(final INetHandler aHandler) { + player = ((NetHandlerPlayServer) aHandler).playerEntity; + } + + @Override + public void process(final IBlockAccess aWorld) { + ItemStack currentItemStack = player.inventory.getCurrentItem(); + if (currentItemStack != null && currentItemStack.getItem() instanceof MetaBaseItem item) { + item.forEachBehavior(currentItemStack, behavior -> { + if (behavior instanceof BehaviourSprayColorInfinite spraycanBehavior) { + spraycanBehavior.setNewColor(currentItemStack, wasSneaking); + player.sendSlotContents(player.inventoryContainer, player.inventory.currentItem, currentItemStack); + + GTUtility.sendSoundToPlayers( + player.worldObj, + SoundResource.GT_SPRAYCAN_SHAKE, + 1.0F, + 1, + (int) player.posX, + (int) player.posY, + (int) player.posZ); + + return true; + } + + return false; + }); + } + } +} diff --git a/src/main/java/gregtech/api/net/GTPacketTypes.java b/src/main/java/gregtech/api/net/GTPacketTypes.java index d635706e68..17081ba92e 100644 --- a/src/main/java/gregtech/api/net/GTPacketTypes.java +++ b/src/main/java/gregtech/api/net/GTPacketTypes.java @@ -24,6 +24,7 @@ public enum GTPacketTypes { SEND_OREGEN_PATTERN(19, new GTPacketSendOregenPattern()), TOOL_SWITCH_MODE(20, new GTPacketToolSwitchMode()), MUSIC_SYSTEM_DATA(21, new GTPacketMusicSystemData()), + INFINITE_SPRAYCAN(22, new GTPacketInfiniteSpraycan()), // merge conflict prevention comment, keep a trailing comma above ; diff --git a/src/main/java/gregtech/client/GTMouseEventHandler.java b/src/main/java/gregtech/client/GTMouseEventHandler.java new file mode 100644 index 0000000000..15112b2888 --- /dev/null +++ b/src/main/java/gregtech/client/GTMouseEventHandler.java @@ -0,0 +1,34 @@ +package gregtech.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.event.MouseEvent; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.items.MetaBaseItem; + +public class GTMouseEventHandler { + + @SuppressWarnings("unused") + @SubscribeEvent + @SideOnly(Side.CLIENT) + public void onMouseEvent(MouseEvent event) { + final EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + + if (player == null || player.isDead) { + return; + } + + final ItemStack heldItem = player.getHeldItem(); + if (heldItem == null) { + return; + } + + if (event.button == 0 && event.buttonstate && heldItem.getItem() instanceof MetaBaseItem mbItem) { + event.setCanceled(mbItem.onLeftClick(heldItem, player)); + } + } +} diff --git a/src/main/java/gregtech/common/GTClient.java b/src/main/java/gregtech/common/GTClient.java index 276bc7a78a..e117a58d71 100644 --- a/src/main/java/gregtech/common/GTClient.java +++ b/src/main/java/gregtech/common/GTClient.java @@ -88,6 +88,7 @@ import gregtech.api.util.GTMusicSystem; import gregtech.api.util.GTPlayedSound; import gregtech.api.util.GTUtility; import gregtech.api.util.WorldSpawnedEventBuilder; +import gregtech.client.GTMouseEventHandler; import gregtech.client.SeekingOggCodec; import gregtech.common.blocks.BlockFrameBox; import gregtech.common.blocks.ItemMachines; @@ -645,6 +646,7 @@ public class GTClient extends GTProxy implements Runnable { new FlaskRenderer(); new FluidDisplayStackRenderer(); MinecraftForge.EVENT_BUS.register(new NEIGTConfig()); + MinecraftForge.EVENT_BUS.register(new GTMouseEventHandler()); } @Override diff --git a/src/main/java/gregtech/common/items/IDMetaItem01.java b/src/main/java/gregtech/common/items/IDMetaItem01.java index 47f34ab4b8..389ddfb6be 100644 --- a/src/main/java/gregtech/common/items/IDMetaItem01.java +++ b/src/main/java/gregtech/common/items/IDMetaItem01.java @@ -195,6 +195,7 @@ public enum IDMetaItem01 { Spray_Color_Remover(465), Spray_Color_Used_Remover(466), Spray_Color_Remover_Empty(467), + Spray_Color_Infinite(468), Tool_Matches(471), Tool_MatchBox_Used(472), Tool_MatchBox_Full(473), diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java index 5fcb02b657..72764b1587 100644 --- a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java @@ -396,6 +396,7 @@ import static gregtech.common.items.IDMetaItem01.Spray_Color_6; import static gregtech.common.items.IDMetaItem01.Spray_Color_7; import static gregtech.common.items.IDMetaItem01.Spray_Color_8; import static gregtech.common.items.IDMetaItem01.Spray_Color_9; +import static gregtech.common.items.IDMetaItem01.Spray_Color_Infinite; import static gregtech.common.items.IDMetaItem01.Spray_Color_Remover; import static gregtech.common.items.IDMetaItem01.Spray_Color_Remover_Empty; import static gregtech.common.items.IDMetaItem01.Spray_Color_Used_0; @@ -530,6 +531,7 @@ import gregtech.common.items.behaviors.BehaviourScanner; import gregtech.common.items.behaviors.BehaviourSensorKit; import gregtech.common.items.behaviors.BehaviourSonictron; import gregtech.common.items.behaviors.BehaviourSprayColor; +import gregtech.common.items.behaviors.BehaviourSprayColorInfinite; import gregtech.common.items.behaviors.BehaviourSprayColorRemover; import gregtech.common.items.behaviors.BehaviourWrittenBook; import gregtech.common.tileentities.machines.multi.MTEIndustrialElectromagneticSeparator.MagnetTiers; @@ -1024,7 +1026,7 @@ public class MetaGeneratedItem01 extends MetaGeneratedItemX32 { ItemList.Spray_Color_Remover_Empty.set( addItem( Spray_Color_Remover_Empty.ID, - "Empty Spray Can Solvent Cannister", + "Empty Spray Can Solvent Canister", "Used for making Spray Can Solvent", new ItemData( Materials.Aluminium, @@ -1034,6 +1036,16 @@ public class MetaGeneratedItem01 extends MetaGeneratedItemX32 { new TCAspects.TC_AspectStack(TCAspects.VACUOS, 1L), new TCAspects.TC_AspectStack(TCAspects.MOTUS, 1L))); + ItemList.Spray_Color_Infinite.set( + addItem( + Spray_Color_Infinite.ID, + "Infinite Spray Can", + "Contains all sixteen colors, as well as solvent!", + new TCAspects.TC_AspectStack(TCAspects.NEBRISUM, 16), + new TCAspects.TC_AspectStack(TCAspects.SENSUS, 8), + new TCAspects.TC_AspectStack(TCAspects.COGNITIO, 8), + new TCAspects.TC_AspectStack(TCAspects.PERMUTATIO, 4))); + ItemList.Tool_Matches.set( addItem( Tool_Matches.ID, @@ -4491,6 +4503,10 @@ public class MetaGeneratedItem01 extends MetaGeneratedItemX32 { addItemBehavior(32000 + Spray_Color_Remover.ID, behaviourSprayColorRemover); addItemBehavior(32000 + Spray_Color_Used_Remover.ID, behaviourSprayColorRemover); + addItemBehavior( + 32000 + Spray_Color_Infinite.ID, + new BehaviourSprayColorInfinite(ItemList.Spray_Color_Infinite.get(1L))); + IItemBehaviour<MetaBaseItem> behaviourMatches = new BehaviourLighter( null, ItemList.Tool_Matches.get(1L), diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java index 8515ecc738..275b304e87 100644 --- a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java @@ -46,11 +46,11 @@ public class BehaviourSprayColor extends BehaviourNone { .addStringLocalization("gt.behaviour.paintspray.uses", "Remaining Uses:"); private final String mTooltipUnstackable = GTLanguageManager .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!"); - private final String mTooltipChain = GTLanguageManager.addStringLocalization( + protected final String mTooltipChain = GTLanguageManager.addStringLocalization( "gt.behaviour.paintspray.chain", "If used while sneaking it will spray a chain of blocks"); - private final String mTooltipChainAmount = GTLanguageManager.addStringLocalization( + protected final String mTooltipChainAmount = GTLanguageManager.addStringLocalization( "gt.behaviour.paintspray.chain_amount", "Sprays up to %d blocks, in the direction you're looking at"); @@ -88,12 +88,8 @@ public class BehaviourSprayColor extends BehaviourNone { if (tNBT == null) { tNBT = new NBTTagCompound(); } - long tUses = tNBT.getLong("GT.RemainingPaint"); - if (GTUtility.areStacksEqual(aStack, this.mFull, true)) { - aStack.func_150996_a(this.mUsed.getItem()); - Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsed)); - tUses = this.mUses; - } + long tUses = getUses(aStack, tNBT); + int painted = 0; int maxPainted = ConfigGeneral.sprayCanChainRange; ForgeDirection lookSide; @@ -149,6 +145,21 @@ public class BehaviourSprayColor extends BehaviourNone { } } } + setRemainingUses(aStack, tNBT, tUses); + return rOutput; + } + + protected long getUses(ItemStack aStack, NBTTagCompound tNBT) { + long tUses = tNBT.getLong("GT.RemainingPaint"); + if (GTUtility.areStacksEqual(aStack, this.mFull, true)) { + aStack.func_150996_a(this.mUsed.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsed)); + tUses = this.mUses; + } + return tUses; + } + + protected void setRemainingUses(ItemStack aStack, NBTTagCompound tNBT, long tUses) { tNBT.removeTag("GT.RemainingPaint"); if (tUses > 0L) { tNBT.setLong("GT.RemainingPaint", tUses); @@ -166,7 +177,6 @@ public class BehaviourSprayColor extends BehaviourNone { Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmpty)); } } - return rOutput; } protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { @@ -174,33 +184,37 @@ public class BehaviourSprayColor extends BehaviourNone { 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, (~this.mColor) & 0xF, 3); + 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, (~this.mColor) & 0xF, 3); + 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, (~this.mColor) & 0xF, 3); + aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass, (~getColor()) & 0xF, 3); return true; } - if (aWorld.getBlockMetadata(aX, aY, aZ) == ((~this.mColor) & 0xF)) { + if (aWorld.getBlockMetadata(aX, aY, aZ) == ((~getColor()) & 0xF)) { return false; } - aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (~this.mColor) & 0xF, 3); + aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (~getColor()) & 0xF, 3); return true; } if (aBlock instanceof IColorableTile) { - return ((IColorableTile) aBlock).recolourBlock(side, AEColor.values()[(~this.mColor) & 0xF], player); + return ((IColorableTile) aBlock).recolourBlock(side, AEColor.values()[(~getColor()) & 0xF], player); } if (aBlock instanceof BlockCableBus) { - return ((BlockCableBus) aBlock).recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF, player); + return ((BlockCableBus) aBlock).recolourBlock(aWorld, aX, aY, aZ, side, (~getColor()) & 0xF, player); } } - return aBlock.recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF); + return aBlock.recolourBlock(aWorld, aX, aY, aZ, side, (~getColor()) & 0xF); + } + + protected byte getColor() { + return this.mColor; } @Override diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java new file mode 100644 index 0000000000..4eb4fb565c --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java @@ -0,0 +1,142 @@ +package gregtech.common.items.behaviors; + +import static gregtech.api.enums.GTValues.AuthorQuerns; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GTValues; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.net.GTPacketInfiniteSpraycan; +import gregtech.api.util.GTLanguageManager; +import gregtech.common.config.other.ConfigGeneral; + +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 byte mCurrentColor; + + public BehaviourSprayColorInfinite(ItemStack sprayCan) { + super(sprayCan, sprayCan, sprayCan, ConfigGeneral.sprayCanChainRange, 0); + this.mTooltip = ""; + mCurrentColor = 0; + } + + @Override + protected long getUses(ItemStack aStack, NBTTagCompound tNBT) { + return ConfigGeneral.sprayCanChainRange; + } + + @Override + protected void setRemainingUses(ItemStack aStack, NBTTagCompound tNBT, long tUses) { + // Infinite spray can; do nothing + } + + @Override + protected byte getColor() { + if (mCurrentColor == REMOVE_COLOR) { + throw new RuntimeException("Attempting to get invalid color"); + } + return mCurrentColor; + } + + @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) { + if ((aWorld.isRemote) || (aStack.stackSize != 1)) { + return false; + } + + if (aStack.hasTagCompound()) { + final NBTTagCompound tag = aStack.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); + } + + @Override + protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) { + if (mCurrentColor == REMOVE_COLOR) { + return BehaviourSprayColorRemover.removeColor(aWorld, aX, aY, aZ, side, player); + } + return super.colorize(aWorld, aX, aY, aZ, side, player); + } + + public boolean onLeftClick(MetaBaseItem item, ItemStack aStack, EntityPlayer aPlayer) { + GTValues.NW.sendToServer(new GTPacketInfiniteSpraycan(aPlayer.isSneaking())); + + return true; + } + + private static byte clampColor(byte newColor) { + if (newColor > REMOVE_COLOR) { + newColor = 0; + } else if (newColor < 0) { + newColor = REMOVE_COLOR; + } + return newColor; + } + + public void setNewColor(final ItemStack aStack, final boolean wasSneaking) { + final NBTTagCompound tag = aStack.hasTagCompound() ? aStack.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))); + + tag.setByte(COLOR_NBT_TAG, color); + mCurrentColor = color; + aStack.setTagCompound(tag); + + if (mCurrentColor == REMOVE_COLOR) { + aStack.setStackDisplayName("Infinite Spray Can (Solvent)"); + } else { + aStack.setStackDisplayName("Infinite Spray Can (" + Dyes.get(mCurrentColor).mName + ")"); + } + } + + @Override + public List<String> getAdditionalToolTips(final MetaBaseItem aItem, final List<String> 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); + + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java index cdf35161e3..1cf51f32fa 100644 --- a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java @@ -24,6 +24,10 @@ 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) { |