diff options
Diffstat (limited to 'src/main')
3 files changed, 89 insertions, 8 deletions
diff --git a/src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java b/src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java index b0127ba81f..7ff2eb23b1 100644 --- a/src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java +++ b/src/main/java/gregtech/api/net/GTPacketInfiniteSpraycan.java @@ -119,6 +119,19 @@ public class GTPacketInfiniteSpraycan extends GTPacket { } return false; } + }, + TOGGLE_SHAKE_LOCK { + + @Override + boolean execute(final BehaviourSprayColorInfinite behavior, final ItemStack itemStack, + final EntityPlayerMP player, final int newColor) { + if (behavior.togglePreventShake(itemStack)) { + Action.playLockSound(player); + } else { + Action.playUnlockSound(player); + } + return true; + } }; private static void playShakeSound(final EntityPlayerMP player) { diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java index 924d160f2d..72a701db9f 100644 --- a/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorInfinite.java @@ -3,10 +3,12 @@ package gregtech.common.items.behaviors; import static gregtech.api.enums.GTValues.AuthorQuerns; import static net.minecraft.util.MovingObjectPosition.MovingObjectType.BLOCK; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.Consumer; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -16,6 +18,8 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.input.Keyboard; + import com.google.common.collect.ImmutableList; import com.gtnewhorizon.gtnhlib.GTNHLib; import com.gtnewhorizons.modularui.api.UIInfos; @@ -38,6 +42,7 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { private static final List<ItemStack> COLOR_SELECTIONS; public static final String COLOR_NBT_TAG = "current_color"; public static final String LOCK_NBT_TAG = "is_locked"; + public static final String PREVENT_SHAKE_TAG = "prevent_shake"; private byte mCurrentColor; @@ -106,9 +111,21 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { @Override public List<String> getAdditionalToolTips(final MetaBaseItem aItem, final List<String> aList, final ItemStack itemStack) { + final List<String> statuses = new ArrayList<>(); + if (isLocked(itemStack)) { + statuses.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.locked")); + } + if (isPreventingShake(itemStack)) { + statuses.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.preventing_shake")); + } + aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.infinite")); aList.add(mTooltipChain); aList.add(" "); + + if (!statuses.isEmpty()) { + aList.add(String.join(" :: ", statuses)); + } aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.more_info")); aList.add(AuthorQuerns); return aList; @@ -117,6 +134,9 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { @Override public Optional<List<String>> getAdditionalToolTipsWhileSneaking(final MetaBaseItem aItem, final List<String> aList, final ItemStack aStack) { + final String ctrlKey = Minecraft.isRunningOnMac + ? StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.ctrl_mac") + : StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.ctrl_pc"); aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.infinite")); aList.add(mTooltipChain); aList.add(" "); @@ -124,6 +144,8 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.gui")); aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.pick")); aList.add(StatCollector.translateToLocal("gt.behaviour.paintspray.infinite.tooltip.lock")); + aList.add( + StatCollector.translateToLocalFormatted("gt.behaviour.paintspray.infinite.tooltip.prevent_shake", ctrlKey)); aList.add(" "); aList.add(AuthorQuerns); @@ -131,9 +153,13 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { } // endregion - // region Raw Mouse Event Handlers + // region Raw Event Handlers @Override public boolean onLeftClick(MetaBaseItem item, ItemStack itemStack, EntityPlayer aPlayer) { + if (isPreventingShake(itemStack)) { + return false; + } + if (isLocked(itemStack)) { displayLockedMessage(); } else { @@ -146,6 +172,8 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { public boolean onMiddleClick(final MetaBaseItem item, final ItemStack itemStack, final EntityPlayer player) { if (player.isSneaking()) { sendPacket(GTPacketInfiniteSpraycan.Action.LOCK_CAN); + } else if (isCtrlDown()) { + sendPacket(GTPacketInfiniteSpraycan.Action.TOGGLE_SHAKE_LOCK); } else if (isLocked(itemStack)) { displayLockedMessage(); } else { @@ -168,6 +196,26 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { return true; } + + private boolean isCtrlDown() { + // Yes, there's a duplicate method in GT++, but I didn't feel right including GT++ code here. We can extract + // this later if it is useful elsewhere. + try { + // noinspection DuplicatedCode + if (!Keyboard.isCreated()) { + return false; + } + + boolean isCtrlKeyDown = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) + || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); + if (!isCtrlKeyDown && Minecraft.isRunningOnMac) + isCtrlKeyDown = Keyboard.isKeyDown(Keyboard.KEY_LMETA) || Keyboard.isKeyDown(Keyboard.KEY_RMETA); + + return isCtrlKeyDown; + } catch (IllegalStateException ignored) { + return false; + } + } // endregion // region GUI @@ -255,14 +303,11 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { } public boolean toggleLock(final ItemStack itemStack) { - final NBTTagCompound tag = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound(); - final boolean newLockStatus = !tag.getBoolean(LOCK_NBT_TAG); - - tag.setBoolean(LOCK_NBT_TAG, newLockStatus); - itemStack.setTagCompound(tag); - setItemStackName(itemStack); + return toggleBooleanTag(itemStack, LOCK_NBT_TAG); + } - return newLockStatus; + public boolean togglePreventShake(final ItemStack itemStack) { + return toggleBooleanTag(itemStack, PREVENT_SHAKE_TAG); } private void setItemStackName(final ItemStack itemStack) { @@ -277,6 +322,17 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { String.format("Infinite Spray Can %c" + Dyes.get(mCurrentColor).mName + "%c", lBracket, rBracket)); } } + + private boolean toggleBooleanTag(final ItemStack itemStack, final String tagName) { + final NBTTagCompound tag = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound(); + final boolean newValue = !tag.getBoolean(tagName); + + tag.setBoolean(tagName, newValue); + itemStack.setTagCompound(tag); + setItemStackName(itemStack); + + return newValue; + } // endregion public static Dyes getDye(ItemStack itemStack) { @@ -296,6 +352,11 @@ public class BehaviourSprayColorInfinite extends BehaviourSprayColor { .getBoolean(LOCK_NBT_TAG); } + private boolean isPreventingShake(final ItemStack itemStack) { + return itemStack.hasTagCompound() && itemStack.getTagCompound() + .getBoolean(PREVENT_SHAKE_TAG); + } + private static class DyeSelectGUI extends SelectItemUIFactory { public DyeSelectGUI(final String header, final ItemStack headerItem, final Consumer<ItemStack> selectedCallback, diff --git a/src/main/resources/assets/gregtech/lang/en_US.lang b/src/main/resources/assets/gregtech/lang/en_US.lang index 6235554b13..f1a359b6a0 100644 --- a/src/main/resources/assets/gregtech/lang/en_US.lang +++ b/src/main/resources/assets/gregtech/lang/en_US.lang @@ -631,13 +631,20 @@ GT5U.item.tank.locked_to=Content locked to %s gt.behaviour.paintspray.infinite.gui.header=Select a Color gt.behaviour.paintspray.infinite.gui.lock_error=§eSpray can is §clocked§e! §bSneak middle-click to unlock. gt.behaviour.paintspray.infinite.gui.solvent=Solvent +gt.behaviour.paintspray.infinite.gui.shake_toggle=Allow/disallow color iteration gt.behaviour.paintspray.infinite.tooltip.infinite=Infinite uses gt.behaviour.paintspray.infinite.tooltip.more_info=Hold SHIFT for more information +gt.behaviour.paintspray.infinite.tooltip.locked=Locked +gt.behaviour.paintspray.infinite.tooltip.preventing_shake=Left click action disabled + gt.behaviour.paintspray.infinite.tooltip.switch=Left Click: Change color (sneak to reverse direction) gt.behaviour.paintspray.infinite.tooltip.pick=Middle Click block: Copy color to spray can gt.behaviour.paintspray.infinite.tooltip.lock=Sneak Middle Click: Lock or unlock spray can gt.behaviour.paintspray.infinite.tooltip.gui=Middle Click: Open color choice GUI +gt.behaviour.paintspray.infinite.tooltip.prevent_shake=%s-Middle Click: Allow/prevent left click action +gt.behaviour.paintspray.infinite.tooltip.ctrl_pc=Ctrl +gt.behaviour.paintspray.infinite.tooltip.ctrl_mac=Command GT5U.hatch.disableFilter.true=Input Filter §cOff§r GT5U.hatch.disableFilter.false=Input Filter §aOn§r |