aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/gregtech/api/enums/ItemList.java1
-rw-r--r--src/main/java/gregtech/api/enums/SoundResource.java2
-rw-r--r--src/main/java/gregtech/api/interfaces/IItemBehaviour.java4
-rw-r--r--src/main/java/gregtech/api/items/MetaBaseItem.java26
-rw-r--r--src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java76
-rw-r--r--src/main/java/gregtech/api/net/GTPacketTypes.java1
-rw-r--r--src/main/java/gregtech/client/GTMouseEventHandler.java34
-rw-r--r--src/main/java/gregtech/common/GTClient.java2
-rw-r--r--src/main/java/gregtech/common/items/IDMetaItem01.java1
-rw-r--r--src/main/java/gregtech/common/items/MetaGeneratedItem01.java18
-rw-r--r--src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java48
-rw-r--r--src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java142
-rw-r--r--src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java4
-rw-r--r--src/main/resources/assets/gregtech/sounds.json19
-rw-r--r--src/main/resources/assets/gregtech/sounds/spraycan.oggbin0 -> 20679 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/468.pngbin0 -> 4349 bytes
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.ogg
new file mode 100644
index 0000000000..1d858c6268
--- /dev/null
+++ b/src/main/resources/assets/gregtech/sounds/spraycan.ogg
Binary files differ
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.png
new file mode 100644
index 0000000000..da101c85a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/468.png
Binary files differ