diff options
16 files changed, 359 insertions, 19 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) { diff --git a/src/main/resources/assets/gregtech/sounds.json b/src/main/resources/assets/gregtech/sounds.json index c8ea3bc8ee..ae25d2bb23 100644 --- a/src/main/resources/assets/gregtech/sounds.json +++ b/src/main/resources/assets/gregtech/sounds.json @@ -141,5 +141,22 @@          "stream": false        }      ] +  }, +  "items.spraycan": { +    "category": "player", +    "sounds": [ +      { +        "name": "spraycan", +        "stream": false, +        "licensing": { +          "sound_url": "https://freesound.org/people/J-La/sounds/38025/", +          "sound_name": "spraycan.wav", +          "author_url": "https://freesound.org/people/J-La/", +          "author_name": "J-La", +          "license_url": "https://creativecommons.org/licenses/by/3.0/", +          "license_name": "Attribution 3.0" +        } +      } +    ]    } -} +}
\ No newline at end of file diff --git a/src/main/resources/assets/gregtech/sounds/spraycan.ogg b/src/main/resources/assets/gregtech/sounds/spraycan.oggBinary files differ new file mode 100644 index 0000000000..1d858c6268 --- /dev/null +++ b/src/main/resources/assets/gregtech/sounds/spraycan.ogg diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/468.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/468.pngBinary files differ new file mode 100644 index 0000000000..da101c85a0 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/468.png | 
