aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api')
-rw-r--r--src/main/java/gregtech/api/enums/GT_Values.java2
-rw-r--r--src/main/java/gregtech/api/enums/ItemList.java4
-rw-r--r--src/main/java/gregtech/api/enums/Textures.java1
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java28
-rw-r--r--src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java8
-rw-r--r--src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java9
-rw-r--r--src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java101
-rw-r--r--src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java36
8 files changed, 166 insertions, 23 deletions
diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java
index 1dcbc419f2..98d9e5a176 100644
--- a/src/main/java/gregtech/api/enums/GT_Values.java
+++ b/src/main/java/gregtech/api/enums/GT_Values.java
@@ -605,6 +605,8 @@ public class GT_Values {
+ EnumChatFormatting.LIGHT_PURPLE
+ "minecraft7771";
+ public static final String AuthorQuerns = "Author: " + EnumChatFormatting.RED + "Querns";
+
// 7.5F comes from GT_Tool_Turbine_Large#getBaseDamage() given huge turbines are the most efficient now.
public static double getMaxPlasmaTurbineEfficiencyFromMaterial(Materials material) {
return (5F + (7.5F + material.mToolQuality)) / 10.0;
diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java
index 4e57d1b148..4d667cc495 100644
--- a/src/main/java/gregtech/api/enums/ItemList.java
+++ b/src/main/java/gregtech/api/enums/ItemList.java
@@ -2019,7 +2019,9 @@ public enum ItemList implements IItemContainer {
ReinforcedPhotolithographicFrameworkCasing,
RadiationProofPhotolithographicFrameworkCasing,
InfinityCooledCasing,
- Machine_Multi_TranscendentPlasmaMixer;
+ Machine_Multi_TranscendentPlasmaMixer,
+ Cover_Metrics_Transmitter,
+ NC_AdvancedSensorCard;
public static final ItemList[] DYE_ONLY_ITEMS = { Color_00, Color_01, Color_02, Color_03, Color_04, Color_05,
Color_06, Color_07, Color_08, Color_09, Color_10, Color_11, Color_12, Color_13, Color_14, Color_15 },
diff --git a/src/main/java/gregtech/api/enums/Textures.java b/src/main/java/gregtech/api/enums/Textures.java
index 7dc0a28db2..cbc1ffc576 100644
--- a/src/main/java/gregtech/api/enums/Textures.java
+++ b/src/main/java/gregtech/api/enums/Textures.java
@@ -510,6 +510,7 @@ public class Textures {
OVERLAY_WIRELESS_ITEM_DETECTOR,
OVERLAY_WIRELESS_FLUID_DETECTOR,
OVERLAY_WIRELESS_MAINTENANCE_DETECTOR,
+ OVERLAY_METRICS_TRANSMITTER,
OVERLAY_FLUID_STORAGE_MONITOR0,
OVERLAY_FLUID_STORAGE_MONITOR1,
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java
new file mode 100644
index 0000000000..f97cd79ed6
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java
@@ -0,0 +1,28 @@
+package gregtech.api.interfaces.metatileentity;
+
+import java.util.List;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+
+/**
+ * Metrics Transmitter covers look for this interface for retrieving custom metrics for a machine. If this interface is
+ * not present on the machine housing the cover, it will use {@link BaseMetaTileEntity#getInfoData()} to retrieve info
+ * instead.
+ */
+public interface IMetricsExporter {
+
+ /**
+ * Attached metrics covers will call this method to receive reported metrics.
+ * <p>
+ * When reporting metrics, try to keep the number of entries small, and ordering of entries consistent. Advanced
+ * Sensor Cards allow the user to selectively turn off individual lines using the panel's UI, and doing so is
+ * aggravated by a metrics set that is inconsistent and/or large.
+ *
+ * @return A list of strings to print on the information panel the advanced sensor card is utilizing. Each item in
+ * the list will be printed on its own line.
+ */
+ @NotNull
+ List<String> reportMetrics();
+}
diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java
index 6a1d303a2f..19e5afebc0 100644
--- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java
@@ -40,6 +40,7 @@ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity;
import gregtech.api.net.GT_Packet_TileEntity;
import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_CoverBehaviorBase;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_OreDictUnificator;
@@ -951,10 +952,13 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity
if (coverInfo.getCoverID() == 0) {
if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) {
- if (GregTech_API.getCoverBehaviorNew(tCurrentItem)
- .isCoverPlaceable(coverSide, tCurrentItem, this)
+ final GT_CoverBehaviorBase<?> coverBehavior = GregTech_API.getCoverBehaviorNew(tCurrentItem);
+ if (coverBehavior.isCoverPlaceable(coverSide, tCurrentItem, this)
&& mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) {
+
setCoverItemAtSide(coverSide, tCurrentItem);
+ coverBehavior.onPlayerAttach(aPlayer, tCurrentItem, this, side);
+
mMetaTileEntity.markDirty();
if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--;
GT_Utility.sendSoundToPlayers(
diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
index c67648df9c..625fbba5af 100644
--- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
@@ -71,6 +71,7 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachin
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.net.GT_Packet_TileEntity;
import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_CoverBehaviorBase;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_OreDictUnificator;
@@ -1660,10 +1661,14 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity
if (getCoverIDAtSide(coverSide) == 0) {
if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) {
- if (GregTech_API.getCoverBehaviorNew(tCurrentItem)
- .isCoverPlaceable(coverSide, tCurrentItem, this)
+ final GT_CoverBehaviorBase<?> coverBehavior = GregTech_API
+ .getCoverBehaviorNew(tCurrentItem);
+ if (coverBehavior.isCoverPlaceable(coverSide, tCurrentItem, this)
&& mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) {
+
setCoverItemAtSide(coverSide, tCurrentItem);
+ coverBehavior.onPlayerAttach(aPlayer, tCurrentItem, this, coverSide);
+
if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--;
GT_Utility.sendSoundToPlayers(
worldObj,
diff --git a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
index 04f8a457b1..68317eea48 100644
--- a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
@@ -9,8 +9,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
+import java.util.stream.IntStream;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.item.EntityItem;
@@ -19,6 +22,7 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
@@ -26,6 +30,11 @@ import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidRegistry;
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.io.ByteStreams;
import com.gtnewhorizons.modularui.api.drawable.IDrawable;
import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
import com.gtnewhorizons.modularui.api.math.MainAxisAlignment;
@@ -34,6 +43,7 @@ import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import com.gtnewhorizons.modularui.api.widget.Widget;
import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
import com.gtnewhorizons.modularui.common.widget.Column;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
import cpw.mods.fml.relauncher.Side;
@@ -56,6 +66,8 @@ import gregtech.api.util.ISerializableObject;
import gregtech.common.GT_Client;
import gregtech.common.covers.CoverInfo;
import gregtech.common.covers.GT_Cover_Fluidfilter;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
@@ -91,6 +103,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
protected short mID = 0;
public long mTickTimer = 0;
+ private Map<ForgeDirection, ISerializableObject> clientCoverData = new HashMap<>();
protected void writeCoverNBT(NBTTagCompound aNBT, boolean isDrop) {
final NBTTagList tList = new NBTTagList();
@@ -230,8 +243,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
@Override
public void issueCoverUpdate(ForgeDirection side) {
// If we've got a null worldObj we're getting called as a part of readingNBT from a non tickable MultiTileEntity
- // on chunk load before the world is set
- // so we'll want to send a cover update.
+ // on chunk load before the world is set, so we'll want to send a cover update.
final CoverInfo coverInfo = getCoverInfoAtSide(side);
if (worldObj == null || (isServerSide() && coverInfo.isDataNeededOnClient())) coverInfo.setNeedsUpdate(true);
}
@@ -419,7 +431,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
@Override
public void setStrongOutputRedstoneSignal(ForgeDirection side, byte strength) {
- mStrongRedstone |= side.flag;
+ mStrongRedstone |= (byte) side.flag;
setOutputRedstoneSignal(side, strength);
}
@@ -682,7 +694,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
return backgrounds.toArray(new IDrawable[] {});
}
}.setOnClick((clickData, widget) -> onTabClicked(clickData, widget, direction))
- .dynamicTooltip(() -> getCoverTabTooltip(direction))
+ .dynamicTooltip(() -> getCoverTabTooltip(direction, clientCoverData.get(direction)))
.setSize(COVER_TAB_WIDTH, COVER_TAB_HEIGHT))
.addChild(
new ItemDrawable(() -> getCoverItemAtSide(direction)).asWidget()
@@ -691,10 +703,17 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
(COVER_TAB_HEIGHT - ICON_SIZE) / 2))
.setEnabled(widget -> getCoverItemAtSide(direction) != null));
}
+
+ builder.widget(
+ new FakeSyncWidget<>(
+ this::collectCoverData,
+ data -> clientCoverData = data,
+ this::writeClientCoverData,
+ this::readClientCoverData));
}
@SideOnly(Side.CLIENT)
- protected List<String> getCoverTabTooltip(ForgeDirection side) {
+ protected List<String> getCoverTabTooltip(ForgeDirection side, ISerializableObject coverData) {
final String[] SIDE_TOOLTIPS = new String[] { "GT5U.interface.coverTabs.down", "GT5U.interface.coverTabs.up",
"GT5U.interface.coverTabs.north", "GT5U.interface.coverTabs.south", "GT5U.interface.coverTabs.west",
"GT5U.interface.coverTabs.east" };
@@ -704,19 +723,18 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
final boolean coverHasGUI = coverInfo.hasCoverGUI();
final List<String> tooltip = coverItem.getTooltip(Minecraft.getMinecraft().thePlayer, true);
- for (int i = 0; i < tooltip.size(); i++) {
- if (i == 0) {
- tooltip.set(
- 0,
- (coverHasGUI ? EnumChatFormatting.UNDERLINE : EnumChatFormatting.DARK_GRAY)
- + StatCollector.translateToLocal(SIDE_TOOLTIPS[side.ordinal()])
- + (coverHasGUI ? EnumChatFormatting.RESET + ": " : ": " + EnumChatFormatting.RESET)
- + tooltip.get(0));
- } else {
- tooltip.set(i, EnumChatFormatting.GRAY + tooltip.get(i));
- }
- }
- return tooltip;
+ final ImmutableList.Builder<String> builder = ImmutableList.builder();
+ builder.add(
+ (coverHasGUI ? EnumChatFormatting.UNDERLINE : EnumChatFormatting.DARK_GRAY)
+ + StatCollector.translateToLocal(SIDE_TOOLTIPS[side.ordinal()])
+ + (coverHasGUI ? EnumChatFormatting.RESET + ": " : ": " + EnumChatFormatting.RESET)
+ + tooltip.get(0));
+ builder.addAll(coverInfo.getAdditionalTooltip(coverData));
+ builder.addAll(
+ IntStream.range(1, tooltip.size())
+ .mapToObj(index -> EnumChatFormatting.GRAY + tooltip.get(index))
+ .iterator());
+ return builder.build();
}
protected void onTabClicked(Widget.ClickData ignoredClickData, Widget widget, ForgeDirection side) {
@@ -739,4 +757,51 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
.getPlayer());
}
}
+
+ @NotNull
+ private Map<ForgeDirection, ISerializableObject> collectCoverData() {
+ final ImmutableMap.Builder<ForgeDirection, ISerializableObject> builder = ImmutableMap.builder();
+ for (final ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(direction);
+ if (coverInfo.isValid()) {
+ builder.put(direction, coverInfo.getCoverData());
+ }
+ }
+
+ return builder.build();
+ }
+
+ private void writeClientCoverData(@NotNull PacketBuffer buffer,
+ @NotNull Map<ForgeDirection, ISerializableObject> dataMap) {
+ buffer.writeInt(dataMap.size());
+ dataMap.forEach((direction, serializableObject) -> {
+ final ByteBuf individualBuffer = Unpooled.buffer();
+ serializableObject.writeToByteBuf(individualBuffer);
+
+ buffer.writeByte(direction.ordinal());
+ buffer.writeInt(individualBuffer.array().length);
+ buffer.writeBytes(individualBuffer.array());
+ });
+ }
+
+ @NotNull
+ private Map<ForgeDirection, ISerializableObject> readClientCoverData(@NotNull PacketBuffer buffer) {
+ ImmutableMap.Builder<ForgeDirection, ISerializableObject> builder = ImmutableMap.builder();
+ final int size = buffer.readInt();
+ for (int i = 0; i < size; i++) {
+ final ForgeDirection direction = ForgeDirection.getOrientation(buffer.readByte());
+ final int length = buffer.readInt();
+ final byte[] object = buffer.readBytes(length)
+ .array();
+
+ // noinspection UnstableApiUsage
+ builder.put(
+ direction,
+ getCoverInfoAtSide(direction).getCoverBehavior()
+ .createDataObject()
+ .readFromPacket(ByteStreams.newDataInput(object), null));
+ }
+
+ return builder.build();
+ }
}
diff --git a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java
index fdb4cbe7a4..3300ab43d6 100644
--- a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java
+++ b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java
@@ -2,6 +2,7 @@ package gregtech.api.util;
import static gregtech.api.enums.GT_Values.E;
+import java.util.List;
import java.util.function.Supplier;
import javax.annotation.Nullable;
@@ -16,6 +17,9 @@ import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
import com.gtnewhorizons.modularui.api.ModularUITextures;
import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
import com.gtnewhorizons.modularui.api.screen.ModularWindow;
@@ -385,6 +389,19 @@ public abstract class GT_CoverBehaviorBase<T extends ISerializableObject> {
ICoverable aTileEntity) {
return getDropImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
}
+
+ /**
+ * Called when the cover is initially attached to a machine.
+ *
+ * @param player The attaching player
+ * @param aCover An {@link ItemStack} containing the cover
+ * @param aTileEntity The machine receiving the cover
+ * @param side Which side the cover is attached to
+ */
+ public void onPlayerAttach(EntityPlayer player, ItemStack aCover, ICoverable aTileEntity, ForgeDirection side) {
+ // Do nothing by default.
+ }
+
// endregion
// region UI stuff
@@ -815,5 +832,24 @@ public abstract class GT_CoverBehaviorBase<T extends ISerializableObject> {
public String trans(String aNr, String aEnglish) {
return GT_Utility.trans(aNr, aEnglish);
}
+
+ public boolean allowsCopyPasteTool() {
+ return true;
+ }
+
+ @NotNull
+ public final List<String> getAdditionalTooltip(ISerializableObject coverData) {
+ return getAdditionalTooltipImpl(forceCast(coverData));
+ }
+
+ /**
+ * Override to add to the tooltip generated when a user hovers over the cover on the left side of a machine's UI.
+ *
+ * @param coverData The cover data associated with the cover on a particular side.
+ * @return A list of new tooltip entries. Entries are inserted at the top, just after the name and direction line.
+ */
+ protected List<String> getAdditionalTooltipImpl(T coverData) {
+ return ImmutableList.of();
+ }
// endregion
}