Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7e1e6be
Added IHTML support for Tinker's specific content
paypur Jul 3, 2025
acdb31a
Added linking between content
paypur Jul 6, 2025
a1d8b0b
Updated components to use new helper function
paypur Jul 7, 2025
263cc1d
Updated titles to use isCentered and isLarge
paypur Jul 9, 2025
a8f27fb
Updated ContentPageIconList to dynamically size grid
paypur Jul 9, 2025
cc1635b
Implemented IHTML for ContentModifier
paypur Jul 10, 2025
1158fcd
Implemented IHTML for ArmorMaterialContent
paypur Jul 10, 2025
71ac92b
Fixed detailed descriptions for AbstractMaterialContent
paypur Jul 11, 2025
710a3da
Implemented IHTML for FluidEffectContent
paypur Jul 12, 2025
2e4071b
Implemented IHTML for ContentMaterialSkull
paypur Jul 14, 2025
9b3fbaf
Use translation keys
paypur Jul 12, 2025
95a75fa
Fixed FluidEffectContent title
paypur Jul 15, 2025
eda8125
Reverted gradle.properties change
paypur Jul 16, 2025
9c20748
Oops
paypur Jul 17, 2025
f78056e
Updated PageContent's
paypur Jul 17, 2025
3fe2f8f
Use title helper
paypur Jul 17, 2025
f5ff64c
Changed link href format
paypur Jul 18, 2025
1ac1ae0
Fixed ContentPageIconList padding
paypur Jul 19, 2025
0222eb4
Removed unnecessary newlines in ArmorMaterialContent
paypur Jul 19, 2025
3ede731
Merge remote-tracking branch 'origin/1.20.1' into 1.20.1_wiki
paypur Jul 21, 2025
7b31e0e
Reverted ContentPageIconList
paypur Jul 21, 2025
bdc22fc
Fixed linking issues
paypur Jul 21, 2025
dedad1b
Fixed linking between individual book pages
paypur Jul 23, 2025
daaf6c9
Fixed missing FluidEffectContent
paypur Jul 24, 2025
b27289c
Fixed accidentally using title as a style in ContentModifier
paypur Jul 26, 2025
c713f20
Added trait descriptions as a minetip
paypur Sep 11, 2025
f252a74
Fixed not escaping %
paypur Sep 11, 2025
4fa80c2
Fixed escaping % unnecessarily
paypur Sep 12, 2025
15b9be6
Merge branch '1.20.1' into 1.20.1_wiki
paypur Sep 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import net.minecraft.world.level.Level;
import net.minecraftforge.common.ForgeI18n;
import net.minecraftforge.fluids.FluidStack;
import slimeknights.mantle.client.book.HTMLUtils;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.content.PageContent;
import slimeknights.mantle.client.book.data.element.TextComponentData;
Expand Down Expand Up @@ -51,6 +52,7 @@
import slimeknights.tconstruct.library.utils.Util;
import slimeknights.tconstruct.tables.TinkerTables;
import slimeknights.tconstruct.tools.TinkerToolParts;
import slimeknights.tconstruct.tools.stats.SkullStats;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand All @@ -59,9 +61,13 @@
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import static slimeknights.tconstruct.tools.stats.PlatingMaterialStats.HELMET;
import static slimeknights.tconstruct.tools.stats.PlatingMaterialStats.SHIELD;

/** Base class for material content pages */
public abstract class AbstractMaterialContent extends PageContent {
private static final List<Component> PART_BUILDER = List.of(
Expand Down Expand Up @@ -439,4 +445,57 @@ private static List<ItemStack> getPartsWithMaterial(MaterialVariantId material,
.map(part -> part.withMaterialForDisplay(material))
.toList();
}

@Override
public String toHTML() {
int rgb = MaterialTooltipCache.getColor(getMaterialVariant()).getValue();

StringBuilder builder = new StringBuilder("\n<div class=\"page-material\">")
.append(getTitleHTML("color: " + HTMLUtils.hexRGB(rgb), "text-shadow: 1px 1px 0 color-mix(in srgb, currentColor 25%%, #000 75%%)"))
.append("%s<p class=\"trait\">");

if (!detailed) builder.append("\"<span style=\"font-style: italic\">");
builder.append(ForgeI18n.getPattern(getTextKey(getMaterialVariant().getId())).replaceAll("%", "%%"));
if (!detailed) builder.append("</span>\"");

return builder.append("</p></div>").toString();
}

protected String getStatHTML(MaterialStatsId statsId) {
return getStatHTML(statsId, null, false);
}

protected String getStatHTML(MaterialStatsId statsId, boolean traitsOnly) {
return getStatHTML(statsId, null, traitsOnly);
}

/** Formats materials stats as HTML */
protected String getStatHTML(MaterialStatsId statsId, @Nullable String name, boolean traitsOnly) {
Optional<IMaterialStats> statsOptional = MaterialRegistry.getInstance().getMaterialStats(getMaterialVariant().getId(), statsId);
if (statsOptional.isEmpty()) return "";

boolean paddingLeft = !statsId.equals(HELMET.getId()) && !statsId.equals(SHIELD.getId()) && !statsId.equals(SkullStats.ID);
IMaterialStats stats = statsOptional.get();

StringBuilder builder = new StringBuilder("<div>\n")
.append(HTMLUtils.line(Objects.requireNonNullElse(name, stats.getLocalizedName().getString()),
true, "font-weight: bold", "padding-bottom: 2px", paddingLeft ? "padding-left: 20px" : ""));

if (!traitsOnly)
builder.append(stats.getLocalizedInfo().stream()
.map(HTMLUtils::line)
.collect(Collectors.joining("\n")));

return builder.append(getTraitHTML(statsId))
.append("</div>")
.toString();
}

/** Formats materials traits as HTML */
protected String getTraitHTML(MaterialStatsId statsId) {
return MaterialRegistry.getInstance().getTraits(getMaterialVariant().getId(), statsId).stream()
.map(ModifierEntry::getModifier)
.map(m -> HTMLUtils.line(m.getDisplayName().getString(), null, HTMLUtils.line(m.getDescription()).replaceAll("'", "&quot;"), true, false, "color: #545454"))
.collect(Collectors.joining("\n"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ItemStack;
import slimeknights.mantle.client.book.HTMLUtils;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.element.TextComponentData;
import slimeknights.mantle.client.screen.book.BookScreen;
Expand Down Expand Up @@ -205,4 +206,46 @@ private int addTraits(int x, int y, List<BookElement> list, Component title, Mat

return y + (lineData.size() * 5) + 3;
}

@Override
public String toHTML() {
List<PlatingMaterialStats> stats = TOP_DOWN_STATS.stream()
.flatMap(id -> MaterialRegistry.getInstance().<PlatingMaterialStats>getMaterialStats(getMaterial().getIdentifier(), id).stream())
.toList();

StringBuilder builder = new StringBuilder();

if (!stats.isEmpty()) {
builder.append("<div><div class=\"row\">")
.append(HTMLUtils.line(PLATING_LABEL.getString(), true, "font-weight: bold", "padding-right: 16px"))
.append(HTMLUtils.line("/").repeat(stats.size() - 1))
.append("</div>");
List<TextComponentData> lineData = new ArrayList<>();
addStatLine(lineData, stats, ToolStats.DURABILITY, PlatingMaterialStats::durability);
addStatLine(lineData, stats, ToolStats.ARMOR, PlatingMaterialStats::armor);
addStatLine(lineData, stats, ToolStats.ARMOR_TOUGHNESS, PlatingMaterialStats::toughness);
addStatLine(lineData, stats, ToolStats.KNOCKBACK_RESISTANCE, stat -> stat.knockbackResistance() * 10);
builder.append(
lineData.stream()
.filter(data -> !data.text.equals(Component.literal("\n")))
.map(data -> HTMLUtils.line(data.text)).collect(Collectors.joining("\n"))
).append("</div>");
}

builder.append(String.format(
"""
<div class="grid-armor-traits">
%s
%s
%s
%s
</div>
""",
getStatHTML(HELMET.getId(), ARMOR_PLATING_LABEL.getString(), true),
getStatHTML(SHIELD.getId(), SHIELD_LABEL.getString(), true),
getStatHTML(StatlessMaterialStats.MAILLE.getIdentifier(), true),
getStatHTML(StatlessMaterialStats.SHIELD_CORE.getIdentifier(), true)
));
return String.format(super.toHTML(), builder);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -127,4 +127,9 @@ protected void addPrimaryDisplayItems(List<ItemElement> displayTools, MaterialVa
}
}
}

@Override
public String toHTML() {
return String.format(super.toHTML(), getStatHTML(SkullStats.ID));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraftforge.common.ForgeI18n;
import slimeknights.mantle.client.book.HTMLUtils;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.content.PageContent;
import slimeknights.mantle.client.book.data.element.ImageData;
Expand All @@ -34,8 +35,10 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class ContentModifier extends PageContent {
Expand Down Expand Up @@ -294,4 +297,33 @@ public void nextRecipe(BookData book, ArrayList<BookElement> list) {
this.buildAndAddRecipeDisplay(book, list, this.recipes.get(this.currentRecipe), parent);
}
}

@Override
public String toHTML() {
int rgb = Objects.requireNonNullElse(modifier.getColor(), 0);
int h = more_text_space ? BookScreen.PAGE_HEIGHT * 2 / 5 : BookScreen.PAGE_HEIGHT * 2 / 7;
return String.format(
"""
%s
<div style="padding-left: 10px">
<div class="column" style="height: %dpx">
%s
</div>
<div style="width: 210px">
<p class="underline">%s</p>
<ul class="prop-list">
%s
</ul>
</div>
</div>
""",
getTitleHTML("color: " + HTMLUtils.hexRGB(rgb), "text-shadow: 1px 1px 0 color-mix(in srgb, currentColor 25%, #000 75%)"),
h * 2,
TextData.toHTML(text, parent.parent.parent),
I18n.get(KEY_EFFECTS),
Arrays.stream(effects)
.map(s -> String.format("<li>%s</li>", HTMLUtils.parse(s)))
.collect(Collectors.joining("\n"))
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import net.minecraftforge.common.ForgeI18n;
import net.minecraftforge.common.crafting.IShapedRecipe;
import net.minecraftforge.registries.ForgeRegistries;
import slimeknights.mantle.client.book.HTMLUtils;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.content.PageContent;
import slimeknights.mantle.client.book.data.element.ImageData;
Expand All @@ -43,6 +44,8 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -266,6 +269,32 @@ public void build(BookData book, ArrayList<BookElement> list, boolean brightSide
}
}

@Override
public String toHTML() {
return String.format(
"""
%s
<div style="padding-left: 10px">
<div class="column" style="height: 128px">
%s
</div>
<div style="width: 210px">
<p class="underline">%s</p>
<ul class="prop-list">
%s
</ul>
</div>
</div>
""",
getTitleHTML(),
TextData.toHTML(text, parent.parent.parent),
I18n.get(KEY_PROPERTIES),
Arrays.stream(properties)
.map(s -> String.format("<li>%s</li>", s))
.collect(Collectors.joining("\n"))
);
}

/** Simple record to hold a XY pair */
private record SlotPos(int x, int y) {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import net.minecraft.world.level.Level;
import net.minecraftforge.common.ForgeI18n;
import net.minecraftforge.fluids.FluidStack;
import slimeknights.mantle.client.book.HTMLUtils;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.content.PageContent;
import slimeknights.mantle.client.book.data.element.TextComponentData;
Expand Down Expand Up @@ -126,4 +127,39 @@ public void build(BookData book, ArrayList<BookElement> list, boolean rightSide)
addList(list, 0, y, group, KEY_ENTITY_EFFECTS, entity, entityComponents);
addList(list, 0, y + group, group, KEY_BLOCK_EFFECTS, block, blockComponents);
}

@Override
public String toHTML() {
StringBuilder builder = new StringBuilder()
.append(getTitleHTML())
.append("<div>")
.append(HTMLUtils.line(text, "height: 64px", "padding-left: 64px"));

assert (entityComponents.isEmpty() || entity == null);
assert (blockComponents.isEmpty() || block == null);

if (!entityComponents.isEmpty() || entity != null ) {
builder.append("<div style=\"height: 128px\">\n")
.append(HTMLUtils.line(I18n.get(KEY_ENTITY_EFFECTS), true))
.append("<ul class=\"prop-list\">\n");
for (Component component : entityComponents) builder.append("<li>").append(HTMLUtils.line(component)).append("</li>\n");
if (entity != null) {
for (String string : entity) builder.append("<li>").append(HTMLUtils.line(string)).append("</li>\n");
}
builder.append("</ul>\n</div>");
}

if (!blockComponents.isEmpty() || block != null ) {
builder.append("<div style=\"height: 128px\">\n")
.append(HTMLUtils.line(I18n.get(KEY_BLOCK_EFFECTS), true))
.append("<ul class=\"prop-list\">\n");
for (Component component : blockComponents) builder.append("<li>").append(HTMLUtils.line(component)).append("</li>\n");
if (block != null) {
for (String string : block) builder.append("<li>").append(HTMLUtils.line(string)).append("</li>\n");
}
builder.append("</ul>\n</div>");
}

return builder.append("</div>").toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,21 @@ protected void addCategory(List<ItemElement> displayTools, MaterialId material)
displayTools.add(makeCategoryIcon(TinkerTools.pickaxe.get().getRenderTool(), getResource("harvest")));
}
}

@Override
public String toHTML() {
String div = String.format(
"""
<div class="grid-material-stats">
%s
%s
%s
</div>
""",
getStatHTML(HeadMaterialStats.ID),
getStatHTML(HandleMaterialStats.ID),
getStatHTML(StatlessMaterialStats.BINDING.getIdentifier())
);
return String.format(super.toHTML(), div);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,21 @@ protected void addCategory(List<ItemElement> displayTools, MaterialId material)
displayTools.add(makeCategoryIcon(TinkerTools.longbow.get().getRenderTool(), getResource("heavy")));
}
}

@Override
public String toHTML() {
String div = String.format(
"""
<div class="grid-material-stats">
%s
%s
%s
</div>
""",
getStatHTML(LimbMaterialStats.ID),
getStatHTML(GripMaterialStats.ID),
getStatHTML(StatlessMaterialStats.BOWSTRING.getIdentifier())
);
return String.format(super.toHTML(), div);
}
}