diff --git a/README.md b/README.md
index 8e86a76..606d676 100644
--- a/README.md
+++ b/README.md
@@ -10,9 +10,16 @@
- NeoColor: 可以提供十六进制颜色值以灵活自定义文本颜色
- ItemEntity: 方便在场景中显示物品实体(由于技术原因,物品实体不会转)
- Key: 提供某个功能的id以显示这个功能绑定的按键
+- Colour: 渐变色,提供2种颜色让文本渐变(非动态),也可以设置文本的样式
+ - 粗细(bold)
+ - 斜体(italic)
+ - 下划线(underlined)
+ - 删除线(strikethrough)
+ - 阴影(dropShadow)
- WIP: 咕咕咕
-部分文本抄自[AnvilCraft-Patchouli](https://github.com/Anvil-Dev/AnvilCraft-Patchouli)和[Xekr's TODO](https://github.com/Anvil-Dev/AnvilCraft/issues?q=is%3Aissue%20state%3Aopen%20author%3AXeKr%20label%3A%22%F0%9F%93%8B%EF%B8%8F%20TODO%22)
+部分文本抄自[AnvilCraft-Patchouli](https://github.com/Anvil-Dev/AnvilCraft-Patchouli)
+和[Xekr's TODO](https://github.com/Anvil-Dev/AnvilCraft/issues?q=is%3Aissue%20state%3Aopen%20author%3AXeKr%20label%3A%22%F0%9F%93%8B%EF%B8%8F%20TODO%22)
## 使用许可
@@ -20,9 +27,10 @@
## 使用方法
-下载对应版本[GuideME](https://github.com/AppliedEnergistics/GuideME)、[AnvilCraft](https://github.com/Anvil-Dev/AnvilCraft)和此 `mod` 放入 `mods` 文件夹,启动游戏即可
+下载对应版本[GuideME](https://github.com/AppliedEnergistics/GuideME)、[AnvilCraft](https://github.com/Anvil-Dev/AnvilCraft)和此 `mod` 放入
+`mods` 文件夹,启动游戏即可
## 主要维护者
-[@theabab2333](https://github.com/theabab23333)
+[@theabab2333](https://github.com/theabab23333)
[@Gugle](https://github.com/Gu-ZT)
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 3fd695b..f978d2e 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -3,7 +3,7 @@ minecraft = "1.21.1"
neoForge = "21.1.152"
registrate = "MC1.21-1.3.0+62"
anvillib = "1.4.0+build.172"
-anvilcraft = "1.5.0+hotfix.1562"
+anvilcraft = "1.5.0+hotfix.1563"
curios = "9.0.15+1.21.1"
jei = "19.21.0.247"
jade = "15.3.4+neoforge"
diff --git a/guidebook/dev.md b/guidebook/dev.md
index 6578be9..fd3a696 100644
--- a/guidebook/dev.md
+++ b/guidebook/dev.md
@@ -15,26 +15,27 @@ navigation:
## 本模组目前状态:
- - [y] 绝大部分配方的兼容
- - [n] guide内容重写和新写
- - [?] 有用没用的功能添加
+- [y] 绝大部分配方的兼容
+- [n] guide内容重写和新写
+- [?] 有用没用的功能添加
### 其他:
- - [y] 在开发环境中[实时预览](https://guideme.appliedenergistics.org/live-preview)
- - [n] 从帕秋莉转换 ~~(已放弃 出各种莫名其妙的bug)~~
- - [?] 英文翻译 ~~(等中文补全再说吧 咕咕咕)~~
+- [y] 在开发环境中[实时预览](https://guideme.appliedenergistics.org/live-preview)
+- [n] 从帕秋莉转换 ~~(已放弃 出各种莫名其妙的bug)~~
+- [?] 英文翻译 ~~(等中文补全再说吧 咕咕咕)~~
## 模组加载情况:
-
-
-
-
+
+
+
+
## 添加的功能:
- - ModInfo: **提供modid以查看当前当前模组加载情况** (可以添加url跳转至外部链接)
- - NeoColor: **提供十六进制颜色值以灵活自定义文本颜色** ~~("我吐了怎么guideme本体只能填那几个注册好的颜色啊")~~
- - ItemEntity: **方便在场景中显示物品实体**~~(由于技术原因,物品实体不会转)~~
- - Key: **提供某个功能的id以显示这个功能绑定的按键**
\ No newline at end of file
+- ModInfo: **提供modid以查看当前当前模组加载情况**(可以添加url跳转至外部链接)
+- NeoColor: **提供十六进制颜色值以灵活自定义文本颜色** ~~("我吐了怎么guideme本体只能填那几个注册好的颜色啊")~~
+- ItemEntity: **方便在场景中显示物品实体**~~(由于技术原因,物品实体不会转)~~
+- Key: **提供某个功能的id以显示这个功能绑定的按键**
+- Colour: 渐变色,提供2种颜色让文本渐变(非动态)
\ No newline at end of file
diff --git a/guidebook/index.md b/guidebook/index.md
index cbe22f7..ce03c30 100644
--- a/guidebook/index.md
+++ b/guidebook/index.md
@@ -1,7 +1,7 @@
---
navigation:
title: "介绍"
- icon: "anvilcraft_guideme:guideme_book"
+ icon: "anvilcraft:guide_book"
position: 0
---
diff --git a/src/main/java/dev/anvilcraft/guideme/AnvilCraftGuideME.java b/src/main/java/dev/anvilcraft/guideme/AnvilCraftGuideME.java
index d1c9627..3fbe9c7 100644
--- a/src/main/java/dev/anvilcraft/guideme/AnvilCraftGuideME.java
+++ b/src/main/java/dev/anvilcraft/guideme/AnvilCraftGuideME.java
@@ -3,6 +3,7 @@
import com.mojang.logging.LogUtils;
import com.tterrag.registrate.Registrate;
import dev.anvilcraft.guideme.data.ModDatagen;
+import dev.anvilcraft.guideme.guide.compiler.tag.GradientColourTagCompiler;
import dev.anvilcraft.guideme.guide.compiler.tag.KeyMapTagCompiler;
import dev.anvilcraft.guideme.guide.compiler.tag.ModInfoTagCompiler;
import dev.anvilcraft.guideme.guide.compiler.tag.NeoColorTagCompiler;
@@ -37,6 +38,7 @@ private void guide() {
.folder("ac_guidebook")
.extension(SceneElementTagCompiler.EXTENSION_POINT, new ItemEntityShapeCompiler())
.extension(TagCompiler.EXTENSION_POINT, new NeoColorTagCompiler())
+ .extension(TagCompiler.EXTENSION_POINT, new GradientColourTagCompiler())
.extension(TagCompiler.EXTENSION_POINT, new ModInfoTagCompiler())
.extension(TagCompiler.EXTENSION_POINT, new KeyMapTagCompiler())
.build();
diff --git a/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/GradientColourTagCompiler.java b/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/GradientColourTagCompiler.java
new file mode 100644
index 0000000..064f93e
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/GradientColourTagCompiler.java
@@ -0,0 +1,101 @@
+package dev.anvilcraft.guideme.guide.compiler.tag;
+
+import dev.anvilcraft.guideme.guide.compiler.util.ColorUtil;
+import guideme.color.ColorValue;
+import guideme.compiler.PageCompiler;
+import guideme.compiler.tags.FlowTagCompiler;
+import guideme.compiler.tags.MdxAttrs;
+import guideme.document.flow.LytFlowParent;
+import guideme.document.flow.LytFlowSpan;
+import guideme.libs.mdast.mdx.model.MdxJsxElementFields;
+import guideme.libs.mdast.model.MdAstNode;
+import guideme.style.TextStyle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public class GradientColourTagCompiler extends FlowTagCompiler {
+ @Override
+ public Set getTagNames() {
+ return Set.of("Colour", "GradientColour", "BetterColor");
+ }
+
+ @Override
+ protected void compile(PageCompiler compiler, LytFlowParent parent, MdxJsxElementFields el) {
+ String string1 = MdxAttrs.getString(compiler, parent, el, "firstColor", null);
+ String string2 = MdxAttrs.getString(compiler, parent, el, "lastColor", null);
+ if (string1 == null) {
+ parent.appendError(compiler, "Missing 'firstColor' attribute", el);
+ return;
+ } else if (string2 == null) {
+ parent.appendError(compiler, "Missing 'lastColor' attribute", el);
+ return;
+ }
+
+ ColorValue firstColor;
+ ColorValue lastColor;
+
+ try {
+ firstColor = new ColorUtil(string1);
+ lastColor = new ColorUtil(string2);
+ } catch (IllegalArgumentException e) {
+ parent.appendError(compiler, "Unknown color: '" + string1 + "||" + string2 + "'", el);
+ return;
+ }
+
+ List strings = new ArrayList<>();
+ List spans = new ArrayList<>();
+ List colorValues = new ArrayList<>();
+
+ boolean bold = MdxAttrs.getBoolean(compiler, parent, el, "bold", false);
+ boolean italic = MdxAttrs.getBoolean(compiler, parent, el, "italic", false);
+ boolean underlined = MdxAttrs.getBoolean(compiler, parent, el, "underlined", false);
+ boolean strikethrough = MdxAttrs.getBoolean(compiler, parent, el, "strikethrough", false);
+ boolean obfuscated = MdxAttrs.getBoolean(compiler, parent, el, "obfuscated", false);
+ boolean dropShadow = MdxAttrs.getBoolean(compiler, parent, el, "dropShadow", false);
+
+ if (el.children() != null) {
+ for (var child : el.children()) {
+ if (child instanceof MdAstNode node) {
+ String text = node.toText();
+ for (int i = 0; i < text.length(); i++) {
+ strings.add(String.valueOf(text.charAt(i)));
+ }
+ }
+ }
+ }
+
+ int stringSize = strings.size();
+ if (stringSize > 0) {
+ for (int i = 0; i < stringSize; i++) {
+ float ratio = stringSize > 1 ? (float) i / (stringSize - 1) : 0.0f;
+ String gradientColor = ColorUtil.calculateGradientColor(firstColor, lastColor, ratio);
+ colorValues.add(new ColorUtil(gradientColor));
+ }
+
+ for (String string : strings) {
+ LytFlowSpan span = new LytFlowSpan();
+ span.appendText(string);
+ spans.add(span);
+ }
+
+ int spanSize = spans.size();
+ for (int i = 0; i < spanSize; i++) {
+ var span = spans.get(i);
+ span.setStyle(
+ TextStyle.builder()
+ .color(colorValues.get(i))
+ .bold(bold)
+ .italic(italic)
+ .underlined(underlined)
+ .strikethrough(strikethrough)
+ .obfuscated(obfuscated)
+ .dropShadow(dropShadow)
+ .build()
+ );
+ parent.append(span);
+ }
+ }
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/ModInfoTagCompiler.java b/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/ModInfoTagCompiler.java
index b85c5bb..0f5e2fd 100644
--- a/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/ModInfoTagCompiler.java
+++ b/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/ModInfoTagCompiler.java
@@ -33,11 +33,13 @@ protected void compile(PageCompiler compiler, LytFlowParent parent, MdxJsxElemen
parent.appendError(compiler, "Missing 'id' attribute", el);
return;
}
+
LytFlowLink link = new LytFlowLink();
String modName = IntegrationUtil.getName(id);
String modVersion = IntegrationUtil.getVersion(id);
String url = el.getAttributeString("url", null);
String nameAndVersion;
+
if (modName != null && modVersion != null) {
nameAndVersion = modName + " " + modVersion;
link.appendText(Component.translatable("gui.ac_guideme.loaded", nameAndVersion).getString());
diff --git a/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/NeoColorTagCompiler.java b/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/NeoColorTagCompiler.java
index 263eb68..e2c371f 100644
--- a/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/NeoColorTagCompiler.java
+++ b/src/main/java/dev/anvilcraft/guideme/guide/compiler/tag/NeoColorTagCompiler.java
@@ -30,17 +30,17 @@ protected void compile(PageCompiler compiler, LytFlowParent parent, MdxJsxElemen
return;
}
- ColorValue firstColor;
+ ColorValue colorValue;
try {
- firstColor = new ColorUtil(string);
+ colorValue = new ColorUtil(string);
} catch (IllegalArgumentException e) {
parent.appendError(compiler, "Unknown color: '" + string + "'", el);
return;
}
LytFlowSpan span = new LytFlowSpan();
- span.setStyle(TextStyle.builder().color(firstColor).build());
+ span.setStyle(TextStyle.builder().color(colorValue).build());
parent.append(span);
compiler.compileFlowContext(el.children(), span);
}
diff --git a/src/main/java/dev/anvilcraft/guideme/guide/compiler/util/ColorUtil.java b/src/main/java/dev/anvilcraft/guideme/guide/compiler/util/ColorUtil.java
index 746deb9..cebdb67 100644
--- a/src/main/java/dev/anvilcraft/guideme/guide/compiler/util/ColorUtil.java
+++ b/src/main/java/dev/anvilcraft/guideme/guide/compiler/util/ColorUtil.java
@@ -74,6 +74,28 @@ public static int argb(int a, int r, int g, int b) {
return FastColor.ARGB32.color(a, r, g, b);
}
+ public static String calculateGradientColor(ColorValue firstColor, ColorValue lastColor, float ratio) {
+ int firstColorInt = firstColor.resolve(LightDarkMode.LIGHT_MODE);
+ int lastColorInt = lastColor.resolve(LightDarkMode.LIGHT_MODE);
+
+ int firstR = (firstColorInt >> 16) & 0xFF;
+ int firstG = (firstColorInt >> 8) & 0xFF;
+ int firstB = firstColorInt & 0xFF;
+ int firstA = (firstColorInt >> 24) & 0xFF;
+
+ int lastR = (lastColorInt >> 16) & 0xFF;
+ int lastG = (lastColorInt >> 8) & 0xFF;
+ int lastB = lastColorInt & 0xFF;
+ int lastA = (lastColorInt >> 24) & 0xFF;
+
+ int r = Math.max(0, Math.min(255, (int) (firstR + ratio * (lastR - firstR))));
+ int g = Math.max(0, Math.min(255, (int) (firstG + ratio * (lastG - firstG))));
+ int b = Math.max(0, Math.min(255, (int) (firstB + ratio * (lastB - firstB))));
+ int a = Math.max(0, Math.min(255, (int) (firstA + ratio * (lastA - firstA))));
+
+ return String.format("#%02X%02X%02X%02X", r, g, b, a);
+ }
+
@Override
public int resolve(LightDarkMode lightDarkMode) {
return color;