hBlocks;
private String[] iArray;
private String[] sArray;
private String[] hArray;
public MultiblockTooltipBuilder() {
iLines = new LinkedList<>();
sLines = new LinkedList<>();
hLines = new LinkedList<>();
hBlocks = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new);
hBlocks.put(StructureLibAPI.HINT_BLOCK_META_AIR, TT_air);
}
/**
* Add a line telling you what the machine type is. Usually, this will be the name of a SB version.
* Machine Type: machine
*
* @param machine Name of the machine type
*
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addMachineType(String machine) {
iLines.add(TT_machineType + COLON + EnumChatFormatting.YELLOW + machine + EnumChatFormatting.RESET);
return this;
}
/**
* Add a basic line of information about this structure
*
* @param info The line to be added.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addInfo(String info) {
iLines.add(info);
return this;
}
/**
* Add a number of basic lines of information about this structure
*
* @param infoStrings The lines to be added.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addInfoAll(String... infoStrings) {
iLines.addAll(Arrays.asList(infoStrings));
return this;
}
/**
* Add a separator line
*
* @return Instance this method was called on.
* @see #addStructureSeparator()
*/
public MultiblockTooltipBuilder addSeparator() {
return addSeparator(EnumChatFormatting.GRAY, 41);
}
/**
* Add a colored separator line with specified length
*
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addSeparator(EnumChatFormatting color, int length) {
switch (GTMod.gregtechproxy.separatorStyle) {
case 0 -> iLines.add(" ");
case 1 -> iLines.add(color + StringUtils.getRepetitionOf('-', length));
default -> iLines
.add(color.toString() + EnumChatFormatting.STRIKETHROUGH + StringUtils.getRepetitionOf('-', length));
}
return this;
}
/**
* Add a line telling how much this machine pollutes.
*
* @param pollution Amount of pollution per second when active
*
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addPollutionAmount(int pollution) {
if (pollution == 0) return this;
iLines.add(
TT_causes + COLON + EnumChatFormatting.DARK_PURPLE + pollution + " " + EnumChatFormatting.GRAY + TT_pps);
return this;
}
/**
* Begin adding structural information by adding a line about the structure's dimensions and then inserting a
* "Structure:" line.
*
* @param w Structure width.
* @param h Structure height.
* @param l Structure depth/length.
* @param hollow T/F, adds a (hollow) comment if true
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder beginStructureBlock(int w, int h, int l, boolean hollow) {
sLines.add(
EnumChatFormatting.WHITE + TT_dimensions
+ COLON
+ EnumChatFormatting.GOLD
+ w
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ h
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ l
+ EnumChatFormatting.GRAY
+ " ("
+ EnumChatFormatting.GOLD
+ "W"
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ "H"
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ "L"
+ EnumChatFormatting.GRAY
+ ") "
+ EnumChatFormatting.RED
+ (hollow ? EnumChatFormatting.RED + TT_hollow : ""));
sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON);
return this;
}
/**
* Begin adding structural information by adding a line about the structure's dimensions
* and then inserting a "Structure:" line. Variable version displays min and max
*
* @param wmin Structure min width.
* @param wmax Structure max width.
* @param hmin Structure min height.
* @param hmax Structure max height.
* @param lmin Structure min depth/length.
* @param lmax Structure max depth/length.
* @param hollow T/F, adds a (hollow) comment if true
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder beginVariableStructureBlock(int wmin, int wmax, int hmin, int hmax, int lmin,
int lmax, boolean hollow) {
sLines.add(
EnumChatFormatting.WHITE + TT_dimensions
+ COLON
+ EnumChatFormatting.GOLD
+ wmin
+ (wmin != wmax ? "-" + wmax : "")
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ hmin
+ (hmin != hmax ? "-" + hmax : "")
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ lmin
+ (lmin != lmax ? "-" + lmax : "")
+ EnumChatFormatting.GRAY
+ " ("
+ EnumChatFormatting.GOLD
+ "W"
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ "H"
+ EnumChatFormatting.GRAY
+ "x"
+ EnumChatFormatting.GOLD
+ "L"
+ EnumChatFormatting.GRAY
+ ") "
+ (hollow ? EnumChatFormatting.RED + TT_hollow : ""));
sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Controller: info
*
* @param info Positional information.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addController(String info) {
sLines.add(TAB + EnumChatFormatting.WHITE + TT_controller + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)minCountx casingName (minimum) (tiered)
*
* @param casingName Name of the Casing.
* @param minCount Minimum needed for valid structure check.
* @return Instance this method was called on.
*
* @deprecated Replaced by {@link #addCasingInfoMin(String, int, boolean)}
*
*/
@Deprecated
public MultiblockTooltipBuilder addCasingInfo(String casingName, int minCount) {
return addCasingInfoMin(casingName, minCount, false);
}
/**
* Add a line of information about the structure:
* (indent)countx casingName (tiered)
*
* @param casingName Name of the Casing.
* @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addCasingInfoExactly(String casingName, int count, boolean isTiered) {
return addCasingInfoExactlyColored(
casingName,
EnumChatFormatting.GRAY,
count,
EnumChatFormatting.GOLD,
isTiered);
}
/**
* Add a line of information about the structure:
* (indent)countx casingName (tiered)
*
* @param casingName Name of the Casing.
* @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
* @param countColor Color of the casing count text
* @param textColor Color of the casing name text
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addCasingInfoExactlyColored(String casingName, EnumChatFormatting textColor,
int count, EnumChatFormatting countColor, boolean isTiered) {
sLines.add(
countColor + TAB
+ count
+ "x "
+ EnumChatFormatting.RESET
+ textColor
+ casingName
+ (isTiered ? " " + TT_tiered : ""));
return this;
}
/**
* Add a line of information about the structure:
* (indent)minCountx casingName (minimum) (tiered)
*
* @param casingName Name of the Casing.
* @param minCount Minimum needed for valid structure check.
* @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addCasingInfoMin(String casingName, int minCount, boolean isTiered) {
return addCasingInfoMinColored(
casingName,
EnumChatFormatting.GRAY,
minCount,
EnumChatFormatting.GOLD,
isTiered);
}
/**
* Add a line of information about the structure:
* (indent)minCountx casingName (minimum) (tiered)
*
* @param casingName Name of the Casing.
* @param minCount Minimum needed for valid structure check.
* @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
* @param countColor Color of the casing count text
* @param textColor Color of the casing name text
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addCasingInfoMinColored(String casingName, EnumChatFormatting textColor,
int minCount, EnumChatFormatting countColor, boolean isTiered) {
sLines.add(
countColor + TAB
+ minCount
+ "x "
+ EnumChatFormatting.RESET
+ textColor
+ casingName
+ " "
+ TT_minimum
+ (isTiered ? " " + TT_tiered : ""));
return this;
}
/**
* Add a line of information about the structure:
* (indent)minCountx - maxCountx casingName (minimum) (tiered)
*
* @param casingName Name of the Casing.
* @param minCount Minimum needed for valid structure check.
* @param maxCount Maximum needed for valid structure check.
* @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addCasingInfoRange(String casingName, int minCount, int maxCount,
boolean isTiered) {
return addCasingInfoRangeColored(
casingName,
EnumChatFormatting.GRAY,
minCount,
maxCount,
EnumChatFormatting.GOLD,
isTiered);
}
/**
* Add a line of information about the structure:
* (indent)minCountx - maxCountx casingName (minimum) (tiered)
*
* @param casingName Name of the Casing.
* @param minCount Minimum needed for valid structure check.
* @param maxCount Maximum needed for valid structure check.
* @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
* @param countColor Color of the casing count text
* @param textColor Color of the casing name text
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addCasingInfoRangeColored(String casingName, EnumChatFormatting textColor,
int minCount, int maxCount, EnumChatFormatting countColor, boolean isTiered) {
sLines.add(
countColor + TAB
+ minCount
+ "x"
+ EnumChatFormatting.GRAY
+ " - "
+ countColor
+ maxCount
+ "x "
+ EnumChatFormatting.RESET
+ textColor
+ casingName
+ (isTiered ? " " + TT_tiered : ""));
return this;
}
/**
* Use this method to add a structural part that isn't covered by the other methods.
* (indent)name: info
*
* @param name Name of the hatch or other component.
* @param info Positional information.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addOtherStructurePart(String name, String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Maintenance Hatch: info
*
* @param info Positional information.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addMaintenanceHatch(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Muffler Hatch: info
*
* @param info Location where the hatch goes
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addMufflerHatch(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Energy Hatch: info
*
* @param info Positional information.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addEnergyHatch(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Dynamo Hatch: info
*
* @param info Positional information.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addDynamoHatch(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Input Bus: info
*
* @param info Location where the bus goes
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addInputBus(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Input Hatch: info
*
* @param info Location where the hatch goes
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addInputHatch(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Output Bus: info
*
* @param info Location where the bus goes
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addOutputBus(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Output Hatch: info
*
* @param info Location where the bus goes
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addOutputHatch(String info) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info);
return this;
}
/**
* Use this method to add a structural part that isn't covered by the other methods.
* (indent)name: info
*
* @param name Name of the hatch or other component.
* @param info Positional information.
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addOtherStructurePart(String name, String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, name);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Maintenance Hatch: info
*
* @param info Positional information.
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addMaintenanceHatch(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_maintenancehatch);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Muffler Hatch: info
*
* @param info Location where the hatch goes
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addMufflerHatch(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_mufflerhatch);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Energy Hatch: info
*
* @param info Positional information.
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addEnergyHatch(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_energyhatch);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Dynamo Hatch: info
*
* @param info Positional information.
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addDynamoHatch(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_dynamohatch);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Input Bus: info
*
* @param info Location where the bus goes
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addInputBus(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_inputbus);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Input Hatch: info
*
* @param info Location where the hatch goes
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addInputHatch(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_inputhatch);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Output Bus: info
*
* @param info Location where the bus goes
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addOutputBus(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_outputbus);
return this;
}
/**
* Add a line of information about the structure:
* (indent)Output Hatch: info
*
* @param info Location where the bus goes
* @param dots The valid locations for this part when asked to display hints
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addOutputHatch(String info, int... dots) {
sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info);
for (int dot : dots) hBlocks.put(dot, TT_outputhatch);
return this;
}
/**
* Use this method to add non-standard structural info.
* (indent)info
*
* @param info The line to be added.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addStructureInfo(String info) {
sLines.add(TAB + info);
return this;
}
/**
* Add a colored separator line with specified length to structure info.
*
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addStructureInfoSeparator(EnumChatFormatting color, int length,
boolean useFinisherConfig) {
if (useFinisherConfig) {
switch (GTMod.gregtechproxy.tooltipFinisherStyle) {
case 0 -> {}
case 1 -> sLines.add(TAB + " ");
case 2 -> sLines.add(TAB + color + StringUtils.getRepetitionOf('-', length));
default -> sLines.add(
TAB + color.toString()
+ EnumChatFormatting.STRIKETHROUGH
+ StringUtils.getRepetitionOf('-', length));
}
} else {
switch (GTMod.gregtechproxy.separatorStyle) {
case 0 -> sLines.add(TAB + " ");
case 1 -> sLines.add(TAB + color + StringUtils.getRepetitionOf('-', length));
default -> sLines
.add(TAB + color + EnumChatFormatting.STRIKETHROUGH + StringUtils.getRepetitionOf('-', length));
}
}
return this;
}
/**
* Add a separator line to structure info.
*
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addStructureInfoSeparator() {
return addStructureInfoSeparator(EnumChatFormatting.GRAY, 30, false);
}
/**
* Use this method to add non-standard structural info.
* (indent)info
*
* @param channel the name of subchannel
* @param purpose the purpose of subchannel
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addSubChannelUsage(String channel, String purpose) {
sLines.add(TAB + StatCollector.translateToLocalFormatted("GT5U.MBTT.subchannel", channel, purpose));
return this;
}
/**
* Add a separator line like this, to the structural hint:
* -----------------------------------------
*
* @return Instance this method was called on.
* @see #addSeparator()
*/
public MultiblockTooltipBuilder addStructureSeparator() {
sLines.add(TAB + "-----------------------------------------");
return this;
}
/**
* Use this method to add non-standard structural hint. This info will appear before the standard structural hint.
*
* @param info The line to be added. This should be an entry into minecraft's localization system.
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addStructureHint(String info) {
hLines.add(StatCollector.translateToLocal(info));
return this;
}
/**
* Use this method to add an entry to standard structural hint without creating a corresponding line in structure
* information
*
* @param name The name of block This should be an entry into minecraft's localization system.
* @param dots Possible locations of this block
* @return Instance this method was called on.
*/
public MultiblockTooltipBuilder addStructureHint(String name, int... dots) {
for (int dot : dots) hBlocks.put(dot, StatCollector.translateToLocal(name));
return this;
}
/**
* Call at the very end.
* Adds a line jump.
* Adds information on how to display the structure guidelines.
* Adds credit for creators of this multi, if any.
*
* Ends the building process.
*
* @param authors Formatted names of the creators of this multiblock machine - if any
*/
public MultiblockTooltipBuilder toolTipFinisher(@Nullable String... authors) {
return toolTipFinisher(EnumChatFormatting.GRAY, 41, authors);
}
/**
* Call at the very end.
* Adds a line jump with configurable color and length.
* Adds information on how to display the structure guidelines.
* Adds credit for creators of this multi, if any.
*
* Ends the building process.
*
* @param separatorColor Color of the separator line
* @param separatorLength Length of the separator line
* @param authors Formatted names of the creators of this multiblock machine - if any
*/
public MultiblockTooltipBuilder toolTipFinisher(EnumChatFormatting separatorColor, int separatorLength,
@Nullable String... authors) {
switch (GTMod.gregtechproxy.tooltipFinisherStyle) {
case 0 -> {}
case 1 -> iLines.add(" ");
case 2 -> iLines.add(separatorColor + StringUtils.getRepetitionOf('-', separatorLength));
default -> iLines.add(
separatorColor.toString() + EnumChatFormatting.STRIKETHROUGH
+ StringUtils.getRepetitionOf('-', separatorLength));
}
iLines.add(
TT_hold + " "
+ EnumChatFormatting.BOLD
+ "[LSHIFT]"
+ EnumChatFormatting.RESET
+ EnumChatFormatting.GRAY
+ " "
+ TT_todisplay);
if (authors != null && authors.length > 0) {
final String authorTag = "Author: ";
final StringBuilder sb = new StringBuilder();
sb.append(TT_addedBy);
sb.append(COLON);
for (int i = 0; i < authors.length; i++) {
String author = authors[i];
if (author.startsWith(authorTag)) {
// to support all the values in GTValues
// that already have Author at the start
sb.append(author.substring(authorTag.length()));
} else {
sb.append(author);
}
if (i != authors.length - 1) {
sb.append(EnumChatFormatting.RESET);
sb.append(EnumChatFormatting.GRAY);
sb.append(" & ");
sb.append(EnumChatFormatting.GREEN);
}
}
iLines.add(sb.toString());
}
hLines.add(TT_structurehint);
this.addStructureInfoSeparator(EnumChatFormatting.GRAY, 30, true);
sLines.add(EnumChatFormatting.WHITE + TT_StructureComplex);
sLines.add(
EnumChatFormatting.WHITE + TT_SeeStructure1
+ EnumChatFormatting.BLUE
+ " Structure"
+ EnumChatFormatting.DARK_BLUE
+ "Lib "
+ EnumChatFormatting.RESET
+ EnumChatFormatting.WHITE
+ TT_SeeStructure2);
// create the final arrays
iArray = iLines.toArray(new String[0]);
sArray = sLines.toArray(new String[0]);
// e.getKey() - 1 because 1 dot is meta 0.
hArray = Stream.concat(
hLines.stream(),
hBlocks.asMap()
.entrySet()
.stream()
.map(e -> TT_dots[e.getKey() - 1] + COLON + String.join(SEPARATOR, e.getValue())))
.toArray(String[]::new);
// free memory
iLines = null;
sLines = null;
hLines = null;
hBlocks = null;
return this;
}
public String[] getInformation() {
return iArray;
}
public String[] getStructureInformation() {
return sArray;
}
public String[] getStructureHint() {
return hArray;
}
}