aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/items/behaviors
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common/items/behaviors')
-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
3 files changed, 177 insertions, 17 deletions
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) {