diff options
Diffstat (limited to 'src/main/java/gregtech/common/items/behaviors')
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) { |
