diff options
Diffstat (limited to 'src/main/java')
10 files changed, 244 insertions, 13 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index de295e2aa6..763c4210c9 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -183,7 +183,8 @@ public class GregTech_API { public static final GT_HashSet<GT_ItemStack> sToolList = new GT_HashSet<>(), sCrowbarList = new GT_HashSet<>(), sScrewdriverList = new GT_HashSet<>(), sWrenchList = new GT_HashSet<>(), sSoftHammerList = new GT_HashSet<>(), sHardHammerList = new GT_HashSet<>(), sWireCutterList = new GT_HashSet<>(), - sSolderingToolList = new GT_HashSet<>(), sSolderingMetalList = new GT_HashSet<>(); + sSolderingToolList = new GT_HashSet<>(), sSolderingMetalList = new GT_HashSet<>(), + sJackhammerList = new GT_HashSet<>(); /** * The List of Hazmat Armors */ diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java index 19bf3ca3f4..ffeec40561 100644 --- a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java +++ b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java @@ -380,6 +380,9 @@ public class GT_UITextures { public static final UITexture OVERLAY_RETRACT_PIPE = UITexture .fullImage(GregTech.ID, "gui/overlay_button/retract_pipes"); + public static final UITexture OVERLAY_BUTTON_HOURGLASS = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/hourglass"); + /** * Can adjust size as needed. */ diff --git a/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java b/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java new file mode 100644 index 0000000000..883ffb4079 --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java @@ -0,0 +1,82 @@ +package gregtech.api.gui.widgets; + +import static gregtech.api.gui.modularui.GT_UITextures.OVERLAY_BUTTON_HOURGLASS; +import static gregtech.common.covers.CoverInfo.MAX_TICK_RATE_ADDITION; + +import java.util.List; + +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.common.covers.CoverInfo; + +public class GT_CoverTickRateButton extends ButtonWidget { + + private static final UITexture BACKGROUND = GT_UITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0, 1, 0.5f); + + private final CoverInfo coverInfo; + private int clientTickRate; + private int tickRateAddition; + + public GT_CoverTickRateButton(@NotNull CoverInfo coverInfo, @NotNull IWidgetBuilder<?> builder) { + this.coverInfo = coverInfo; + this.clientTickRate = coverInfo.getTickRate(); + this.tickRateAddition = coverInfo.getTickRateAddition(); + + super.setBackground(BACKGROUND, OVERLAY_BUTTON_HOURGLASS); + super.setOnClick(this::onClick); + super.dynamicTooltip(this::dynamicTooltip); + super.attachSyncer( + new FakeSyncWidget.IntegerSyncer(this.coverInfo::getTickRate, integer -> clientTickRate = integer), + builder, + (widget, aInt) -> notifyTooltipChange()) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer( + this.coverInfo::getTickRateAddition, + integer -> tickRateAddition = integer), + builder); + + } + + private void onClick(@NotNull ClickData clickData, @NotNull Widget widget) { + final int iterations = clickData.ctrl ? 5 : 1; + final boolean isDecreasing = clickData.mouseButton == 1; + + // Do five operations at once if Ctrl is held down. Since the actual increase granted by each invocation can be + // different on each call, just call the method several times rather than trying to do a bunch of weird math. + for (int i = 0; i < iterations; i++) { + coverInfo.adjustTickRateMultiplier(isDecreasing); + } + } + + private List<String> dynamicTooltip() { + final String boundsNotification; + + if (tickRateAddition == 0) { + boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.minimum"); + } else if (tickRateAddition >= MAX_TICK_RATE_ADDITION - 1) { + // Clamping can make tickRateAddition approach but never actually equal MAX_ADDITION, so we need this + // adjustment. + boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.maximum"); + } else { + boundsNotification = ""; + } + + return ImmutableList.of( + StatCollector.translateToLocalFormatted( + "gt.cover.info.button.tick_rate.1", + new CoverInfo.ClientTickRateFormatter(clientTickRate), + boundsNotification), + StatCollector.translateToLocal("gt.cover.info.button.tick_rate.2"), + StatCollector.translateToLocal("gt.cover.info.button.tick_rate.3")); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 57a55fc17e..a7236e164d 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -27,6 +27,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; @@ -1696,6 +1697,31 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity dropCover(coverSide, side, false); } return true; + } else if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sJackhammerList)) { + // Configuration of delicate electronics calls for a tool with precision and subtlety. + if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { + final CoverInfo info = getCoverInfoAtSide(coverSide); + if (info != CoverInfo.EMPTY_INFO) { + final GT_CoverBehaviorBase<?> behavior = info.getCoverBehavior(); + if (behavior.allowsTickRateAddition()) { + info.onCoverJackhammer(aPlayer); + GT_Utility.sendSoundToPlayers( + worldObj, + SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT, + 1.0F, + 1, + xCoord, + yCoord, + zCoord); + + } else { + GT_Utility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("gt.cover.info.chat.tick_rate_not_allowed")); + } + return true; + } + } } } // End item != null diff --git a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java index 3300ab43d6..97f02821c1 100644 --- a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java +++ b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java @@ -31,10 +31,12 @@ import gregtech.api.enums.GT_Values; import gregtech.api.gui.GT_GUIColorOverride; import gregtech.api.gui.modularui.GT_CoverUIBuildContext; import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.widgets.GT_CoverTickRateButton; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.net.GT_Packet_TileEntityCoverGUI; import gregtech.api.objects.GT_ItemStack; +import gregtech.common.covers.CoverInfo; /** * For Covers with a special behavior. @@ -447,6 +449,15 @@ public abstract class GT_CoverBehaviorBase<T extends ISerializableObject> { ButtonWidget.closeWindowButton(true) .setPos(getGUIWidth() - 15, 3)); } + + final CoverInfo coverInfo = uiBuildContext.getTile() + .getCoverInfoAtSide(uiBuildContext.getCoverSide()); + final GT_CoverBehaviorBase<?> behavior = coverInfo.getCoverBehavior(); + if (coverInfo.getMinimumTickRate() > 0 && behavior.allowsTickRateAddition()) { + builder.widget( + new GT_CoverTickRateButton(coverInfo, builder).setPos(getGUIWidth() - 24, getGUIHeight() - 24)); + } + return builder.build(); } @@ -837,6 +848,10 @@ public abstract class GT_CoverBehaviorBase<T extends ISerializableObject> { return true; } + public boolean allowsTickRateAddition() { + return true; + } + @NotNull public final List<String> getAdditionalTooltip(ISerializableObject coverData) { return getAdditionalTooltipImpl(forceCast(coverData)); diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java index ceb0ed67c8..16fe7c49ff 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java @@ -352,7 +352,8 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo if (tCurrentItem != null && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList) && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList) && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList) - && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) return false; + && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList) + && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sJackhammerList)) return false; } if (tTileEntity instanceof IGregTechTileEntity gtTE) { if (gtTE.getTimer() < 50L) { diff --git a/src/main/java/gregtech/common/covers/CoverInfo.java b/src/main/java/gregtech/common/covers/CoverInfo.java index 0fac00218c..7f45085ead 100644 --- a/src/main/java/gregtech/common/covers/CoverInfo.java +++ b/src/main/java/gregtech/common/covers/CoverInfo.java @@ -7,6 +7,7 @@ import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; @@ -19,11 +20,15 @@ import gregtech.api.gui.modularui.GT_CoverUIBuildContext; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.util.GT_CoverBehaviorBase; +import gregtech.api.util.GT_Utility; import gregtech.api.util.ISerializableObject; public final class CoverInfo { - private static final String NBT_SIDE = "s", NBT_ID = "id", NBT_DATA = "d"; + private static final String NBT_SIDE = "s", NBT_ID = "id", NBT_DATA = "d", NBT_TICK_RATE_ADDITION = "tra"; + + // One minute + public static final int MAX_TICK_RATE_ADDITION = 1200; public static final CoverInfo EMPTY_INFO = new CoverInfo(ForgeDirection.UNKNOWN, null); private final ForgeDirection coverSide; @@ -33,6 +38,8 @@ public final class CoverInfo { private final WeakReference<ICoverable> coveredTile; private boolean needsUpdate = false; + private int tickRateAddition = 0; + public CoverInfo(ForgeDirection side, ICoverable aTile) { coverSide = side; coveredTile = new WeakReference<>(aTile); @@ -53,6 +60,7 @@ public final class CoverInfo { coverData = aNBT.hasKey(NBT_DATA) ? coverBehavior.createDataObject(aNBT.getTag(NBT_DATA)) : coverBehavior.createDataObject(); coveredTile = new WeakReference<>(aTile); + tickRateAddition = aNBT.hasKey(NBT_TICK_RATE_ADDITION) ? aNBT.getInteger(NBT_TICK_RATE_ADDITION) : 0; } public boolean isValid() { @@ -62,6 +70,7 @@ public final class CoverInfo { public NBTTagCompound writeToNBT(NBTTagCompound aNBT) { aNBT.setByte(NBT_SIDE, (byte) coverSide.ordinal()); aNBT.setInteger(NBT_ID, coverID); + aNBT.setInteger(NBT_TICK_RATE_ADDITION, tickRateAddition); if (coverData != null) aNBT.setTag(NBT_DATA, coverData.saveDataToNBT()); return aNBT; @@ -122,7 +131,7 @@ public final class CoverInfo { } public int getTickRate() { - return getCoverBehavior().getTickRate(coverSide, coverID, coverData, coveredTile.get()); + return getMinimumTickRate() + tickRateAddition; } public ForgeDirection getSide() { @@ -234,6 +243,49 @@ public final class CoverInfo { .onCoverScrewdriverClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ); } + public void onCoverJackhammer(EntityPlayer aPlayer) { + adjustTickRateMultiplier(aPlayer.isSneaking()); + + GT_Utility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocalFormatted("gt.cover.info.chat.tick_rate", getCurrentTickRateFormatted())); + } + + /** + * Adjusts the tick rate by one step. + * + * @param isDecreasing If true, lower one step. + */ + public void adjustTickRateMultiplier(final boolean isDecreasing) { + final int currentTickRate = getTickRate(); + final int stepAmount = currentTickRate == 20 ? (isDecreasing ? 5 : 20) : (currentTickRate < 20 ? 5 : 20); + + tickRateAddition = clamp(tickRateAddition + (isDecreasing ? -1 : 1) * stepAmount); + tickRateAddition = clamp(tickRateAddition - (getTickRate() % stepAmount)); + } + + /** + * Returns information about the cover's tick rate. + * + * @return An instance of tick rate components + */ + @NotNull + public CoverInfo.ClientTickRateFormatter getCurrentTickRateFormatted() { + return new ClientTickRateFormatter(getTickRate()); + } + + public int getMinimumTickRate() { + return getCoverBehavior().getTickRate(coverSide, coverID, coverData, coveredTile.get()); + } + + public int getTickRateAddition() { + return tickRateAddition; + } + + public void setTickRateAddition(final int tickRateAddition) { + this.tickRateAddition = clamp(tickRateAddition); + } + public Block getFacadeBlock() { return getCoverBehavior().getFacadeBlock(coverSide, coverID, coverData, coveredTile.get()); } @@ -246,4 +298,38 @@ public final class CoverInfo { public List<String> getAdditionalTooltip(ISerializableObject data) { return getCoverBehavior().getAdditionalTooltip(data); } + + private static int clamp(int input) { + return Math.min(MAX_TICK_RATE_ADDITION, Math.max(0, input)); + } + + public static final class ClientTickRateFormatter { + + /** A translation key for the type of time units being used (e.g.: "tick", "seconds".) */ + private final String unitI18NKey; + /** A number representing a quantity of time. */ + private final int tickRate; + + /** + * Converts a given tick rate into a human-friendly format. + * + * @param tickRate The rate at which something ticks, in ticks per operation. + */ + public ClientTickRateFormatter(final int tickRate) { + if (tickRate < 20) { + this.unitI18NKey = tickRate == 1 ? "gt.time.tick.singular" : "gt.time.tick.plural"; + this.tickRate = tickRate; + } else { + this.unitI18NKey = tickRate == 20 ? "gt.time.second.singular" : "gt.time.second.plural"; + this.tickRate = tickRate / 20; + } + } + + public String toString() { + return StatCollector.translateToLocalFormatted( + "gt.cover.info.format.tick_rate", + tickRate, + StatCollector.translateToLocal(unitI18NKey)); + } + } } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java index 9afb2cf765..1910d27b39 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java @@ -406,6 +406,11 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehaviorBase<GT_Cover_Fluid } } + @Override + public boolean allowsTickRateAddition() { + return false; + } + public enum Conditional { Always(false) { diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java index f7d9bbb236..14af94d70e 100644 --- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java +++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java @@ -443,15 +443,17 @@ public class GT_MetaGenerated_Tool_01 extends GT_MetaGenerated_Tool { new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L), new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)), GregTech_API.sWrenchList); - addTool( - JACKHAMMER, - "JackHammer (HV)", - "Breaks Rocks into pieces", - new GT_Tool_JackHammer(), - ToolDictNames.craftingToolJackHammer, - new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 2L), - new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L)); + GregTech_API.registerTool( + addTool( + JACKHAMMER, + "JackHammer (HV)", + "Breaks Rocks into pieces", + new GT_Tool_JackHammer(), + ToolDictNames.craftingToolJackHammer, + new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L), + new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 2L), + new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L)), + GregTech_API.sJackhammerList); addTool( BUZZSAW_LV, "Buzzsaw (LV)", diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java index 5688872796..4241e07e4b 100644 --- a/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java +++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java @@ -31,6 +31,7 @@ public class Behaviour_Cover_Tool extends Behaviour_None { private ISerializableObject mStoredData = GregTech_API.sNoBehavior.createDataObject(); private int mCoverType; + private int mTickRateAddition = 0; @Override public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, @@ -65,6 +66,7 @@ public class Behaviour_Cover_Tool extends Behaviour_None { NBTBase tData = aNBT.getTag("mCoverData"); if (tData != null) mStoredData = tBehavior.createDataObject(tData); else mStoredData = GregTech_API.sNoBehavior.createDataObject(); + mTickRateAddition = aNBT.hasKey("mTickRateAddition") ? aNBT.getInteger("mTickRateAddition") : 0; } } @@ -72,6 +74,7 @@ public class Behaviour_Cover_Tool extends Behaviour_None { aNBT.setInteger("mCoverType", mCoverType); if (mStoredData == null) mStoredData = GregTech_API.sNoBehavior.createDataObject(); aNBT.setTag("mCoverData", mStoredData.saveDataToNBT()); + aNBT.setInteger("mTickRateAddition", mTickRateAddition); } @SuppressWarnings("rawtypes") @@ -116,6 +119,8 @@ public class Behaviour_Cover_Tool extends Behaviour_None { .allowsCopyPasteTool()) { mStoredData = tCoverable.getComplexCoverDataAtSide(tSide); mCoverType = tCoverable.getCoverIDAtSide(tSide); + mTickRateAddition = tCoverable.getCoverInfoAtSide(tSide) + .getTickRateAddition(); aList.add("Block Side: " + EnumChatFormatting.AQUA + tSide.name() + EnumChatFormatting.RESET); aList.add( @@ -126,16 +131,19 @@ public class Behaviour_Cover_Tool extends Behaviour_None { } else { mStoredData = GregTech_API.sNoBehavior.createDataObject(); mCoverType = 0; + mTickRateAddition = 0; aList.add("Copy unavailable for this cover type"); } } else { mStoredData = GregTech_API.sNoBehavior.createDataObject(); mCoverType = 0; + mTickRateAddition = 0; aList.add("No Cover Found"); } } else { mStoredData = GregTech_API.sNoBehavior.createDataObject(); mCoverType = 0; + mTickRateAddition = 0; aList.add("No Cover Found"); } } @@ -155,6 +163,8 @@ public class Behaviour_Cover_Tool extends Behaviour_None { int tCoverID = tCoverable.getCoverIDAtSide(tSide); if (tCoverID == mCoverType) { tCoverable.setCoverDataAtSide(tSide, mStoredData); + tCoverable.getCoverInfoAtSide(tSide) + .setTickRateAddition(mTickRateAddition); GT_Utility.sendChatToPlayer(aPlayer, "Cover Data Pasted."); } else { GT_Utility.sendChatToPlayer(aPlayer, "Not Matched Cover."); |