Skip to content

Commit 194838b

Browse files
authored
Merge branch 'master' into detached
2 parents 120045d + 0fd369a commit 194838b

File tree

3 files changed

+150
-34
lines changed

3 files changed

+150
-34
lines changed

pom.xml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,39 @@
110110
<artifactId>mariadb-java-client</artifactId>
111111
<version>3.5.3</version>
112112
</dependency>
113+
<dependency>
114+
<groupId>net.azisaba</groupId>
115+
<artifactId>EnderChestPlus</artifactId>
116+
<version>1.3.1</version>
117+
<scope>provided</scope>
118+
</dependency>
119+
あなた:
120+
scopeは?
121+
113122

123+
ChatGPT:
124+
いい質問にゃ!MavenやGradleで adventure-api や adventure-platform-bukkit を使う場合、スコープ(scope or configuration)は compile または implementation にする必要があるにゃ。
125+
126+
理由は:
127+
128+
Spigot/Paper 1.16.5 環境では Adventure ライブラリが標準で含まれていないため、自分のプラグインにAdventureを内蔵する必要があるから。
129+
130+
✅ Maven の場合
131+
xml
132+
コピーする
133+
編集する
134+
<dependency>
135+
<groupId>net.kyori</groupId>
136+
<artifactId>adventure-api</artifactId>
137+
<version>4.14.0</version>
138+
<scope>compile</scope> <!-- ここ! -->
139+
</dependency>
140+
<dependency>
141+
<groupId>net.kyori</groupId>
142+
<artifactId>adventure-platform-bukkit</artifactId>
143+
<version>4.3.0</version>
144+
<scope>compile</scope>
145+
</dependency>
114146
</dependencies>
115147

116148
<distributionManagement>

src/main/java/dev/felnull/commands/BetterStorageCommand.java

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
package dev.felnull.commands;
22

33
import dev.felnull.BetterStorage;
4-
import dev.felnull.Data.DeletedGroupBackup;
54
import dev.felnull.Data.DeletedGroupInfo;
65
import dev.felnull.Data.GroupData;
76
import dev.felnull.DataIO.*;
8-
import dev.felnull.task.ItemLogSummaryTask;
9-
import net.kyori.adventure.text.Component;
10-
import net.kyori.adventure.text.event.ClickEvent;
11-
import net.kyori.adventure.text.event.HoverEvent;
127
import net.kyori.adventure.text.format.NamedTextColor;
138
import org.bukkit.Bukkit;
149
import org.bukkit.ChatColor;
@@ -115,14 +110,9 @@ public void run() {
115110
sender.sendMessage("[ " + nameOrGroup + " ] のログ一覧:");
116111
for (LocalDateTime log : logs) {
117112
String formatted = log.format(FORMATTER);
118-
Component msg = Component.text(" - [ ")
119-
.append(Component.text(formatted)
120-
.color(NamedTextColor.AQUA)
121-
.clickEvent(ClickEvent.suggestCommand("/bstorage rollback " + nameOrGroup + " \"" + formatted + "\""))
122-
123-
.hoverEvent(HoverEvent.showText(Component.text("クリックでロールバックコマンドをチャット欄に入力"))))
124-
.append(Component.text(" ]"));
125-
sender.sendMessage(msg);
113+
String command = "/bstorage rollback " + nameOrGroup + " \"" + formatted + "\"";
114+
String hover = "クリックでロールバックコマンドをチャット欄に入力";
115+
ComponentUtil.sendClickableMessage(sender, formatted, command, hover);
126116
}
127117
});
128118
}
@@ -214,27 +204,19 @@ public void run() {
214204
if (combined.isEmpty()) {
215205
sender.sendMessage("ログは見つかりませんでした。");
216206
} else {
217-
sender.sendMessage(Component.text("[ " + nameOrGroup + " ] のログ一覧:").color(NamedTextColor.YELLOW));
207+
ComponentUtil.sendPlainMessage(sender, "[ " + nameOrGroup + " ] のログ一覧:", NamedTextColor.YELLOW);
218208
for (LocalDateTime log : combined) {
219209
String formatted = log.format(FORMATTER);
220210
boolean isSnapshot = snapshots.contains(log);
221211

222-
NamedTextColor color = isSnapshot ? NamedTextColor.GREEN : NamedTextColor.AQUA;
223212
String command = isSnapshot
224-
? "/bstorage rollback " + nameOrGroup + " " + formatted
225-
: "/bstorage diff " + nameOrGroup + " " + formatted;
213+
? "/bstorage rollback " + nameOrGroup + " \"" + formatted + "\""
214+
: "/bstorage diff " + nameOrGroup + " \"" + formatted + "\"";
226215
String hoverText = isSnapshot
227216
? "クリックでロールバックコマンドを入力"
228217
: "クリックで差分表示コマンドを入力";
229218

230-
Component msg = Component.text(" - [ ")
231-
.append(Component.text(formatted)
232-
.color(color)
233-
.clickEvent(ClickEvent.suggestCommand(command))
234-
.hoverEvent(HoverEvent.showText(Component.text(hoverText))))
235-
.append(Component.text(" ]"));
236-
237-
sender.sendMessage(msg);
219+
ComponentUtil.sendClickableMessage(sender, formatted, command, hoverText);
238220
}
239221
}
240222
});
@@ -386,22 +368,18 @@ public void run() {
386368
}
387369

388370
Bukkit.getScheduler().runTask(BetterStorage.BSPlugin, () -> {
389-
sender.sendMessage(Component.text("削除されたグループ一覧:").color(NamedTextColor.YELLOW));
371+
ComponentUtil.sendPlainMessage(sender, "削除されたグループ一覧:", NamedTextColor.YELLOW);
390372

391373
for (DeletedGroupInfo info : deletedGroups) {
392374
String label = info.displayName != null ? info.displayName : info.groupName;
393375
String uuid = info.groupUUID.toString();
394376
String time = info.timestamp.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
395377

396-
Component msg = Component.text(" - [ ")
397-
.append(Component.text(label + " (" + time + ")")
398-
.color(NamedTextColor.AQUA)
399-
.clickEvent(ClickEvent.suggestCommand("/bstorage recover " + uuid))
400-
.hoverEvent(HoverEvent.showText(Component.text("クリックで復元コマンドを入力"))))
401-
.append(Component.text(" ]"))
402-
.color(NamedTextColor.GRAY);
378+
String text = label + " (" + time + ")";
379+
String command = "/bstorage recover " + uuid;
380+
String hover = "クリックで復元コマンドを入力";
403381

404-
sender.sendMessage(msg);
382+
ComponentUtil.sendClickableMessage(sender, text, command, hover);
405383
}
406384
});
407385
}
@@ -575,4 +553,10 @@ public void run() {
575553
// 第3引数以降の補完は提供しない
576554
return suggestions;
577555
}
556+
557+
// 共通形式で置換するメソッド
558+
private String buildInteractiveMessage(String label, String commandHint) {
559+
return ChatColor.GRAY + " - [ " + ChatColor.AQUA + label + ChatColor.GRAY + " ] " + ChatColor.DARK_GRAY + "(「" + commandHint + "」を手動で入力してください)";
560+
}
561+
578562
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package dev.felnull.commands;
2+
3+
import net.kyori.adventure.text.format.NamedTextColor;
4+
import net.md_5.bungee.api.chat.ClickEvent;
5+
import net.md_5.bungee.api.chat.ComponentBuilder;
6+
import net.md_5.bungee.api.chat.HoverEvent;
7+
import net.md_5.bungee.api.chat.TextComponent;
8+
import org.bukkit.Bukkit;
9+
import org.bukkit.ChatColor;
10+
import org.bukkit.command.CommandSender;
11+
import org.bukkit.entity.Player;
12+
13+
import static net.kyori.adventure.text.format.NamedTextColor.*;
14+
15+
public class ComponentUtil {
16+
private static final boolean USE_ADVENTURE = isAdventureSupported();
17+
18+
private static boolean isAdventureSupported() {
19+
String version = Bukkit.getBukkitVersion(); // 例: 1.16.5-R0.1-SNAPSHOT
20+
String[] parts = version.split("\\.");
21+
int major = Integer.parseInt(parts[0]);
22+
int minor = Integer.parseInt(parts[1]);
23+
return major > 1 || (major == 1 && minor >= 16);
24+
}
25+
26+
public static void sendClickableMessage(CommandSender sender, String label, String command, String hoverText) {
27+
if (USE_ADVENTURE) {
28+
// Paper 1.16.5以降
29+
net.kyori.adventure.text.Component msg =
30+
net.kyori.adventure.text.Component.text(" - [ ")
31+
.append(net.kyori.adventure.text.Component.text(label)
32+
.clickEvent(net.kyori.adventure.text.event.ClickEvent.suggestCommand(command))
33+
.hoverEvent(net.kyori.adventure.text.event.HoverEvent.showText(
34+
net.kyori.adventure.text.Component.text(hoverText))))
35+
.append(net.kyori.adventure.text.Component.text(" ]"));
36+
37+
sender.sendMessage(msg);
38+
} else {
39+
// Spigot 1.15.2以前
40+
if (sender instanceof Player) {
41+
Player player = (Player) sender;
42+
TextComponent base = new TextComponent(" - [ ");
43+
TextComponent clickable = new TextComponent(label);
44+
clickable.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command));
45+
clickable.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
46+
new ComponentBuilder(hoverText).create()));
47+
base.addExtra(clickable);
48+
base.addExtra(" ]");
49+
player.spigot().sendMessage(base);
50+
} else {
51+
sender.sendMessage(" - [ " + label + " ] (" + hoverText + ")");
52+
}
53+
}
54+
}
55+
56+
public static void sendPlainMessage(CommandSender sender, String text, NamedTextColor color) {
57+
if (USE_ADVENTURE) {
58+
net.kyori.adventure.text.Component msg = net.kyori.adventure.text.Component.text(text).color(color);
59+
sender.sendMessage(msg);
60+
} else {
61+
sender.sendMessage(namedTextColorToLegacy(color) + text);
62+
}
63+
}
64+
65+
private static String namedTextColorToLegacy(NamedTextColor color) {
66+
// 最小限の変換(必要に応じて追加)
67+
if (color.equals(RED)) {
68+
return ChatColor.RED.toString();
69+
} else if (color.equals(GREEN)) {
70+
return ChatColor.GREEN.toString();
71+
} else if (color.equals(BLUE)) {
72+
return ChatColor.BLUE.toString();
73+
} else if (color.equals(YELLOW)) {
74+
return ChatColor.YELLOW.toString();
75+
} else if (color.equals(AQUA)) {
76+
return ChatColor.AQUA.toString();
77+
} else if (color.equals(GRAY)) {
78+
return ChatColor.GRAY.toString();
79+
} else if (color.equals(DARK_GRAY)) {
80+
return ChatColor.DARK_GRAY.toString();
81+
} else if (color.equals(GOLD)) {
82+
return ChatColor.GOLD.toString();
83+
} else if (color.equals(WHITE)) {
84+
return ChatColor.WHITE.toString();
85+
} else if (color.equals(BLACK)) {
86+
return ChatColor.BLACK.toString();
87+
} else if (color.equals(DARK_RED)) {
88+
return ChatColor.DARK_RED.toString();
89+
} else if (color.equals(DARK_GREEN)) {
90+
return ChatColor.DARK_GREEN.toString();
91+
} else if (color.equals(DARK_BLUE)) {
92+
return ChatColor.DARK_BLUE.toString();
93+
} else if (color.equals(DARK_PURPLE)) {
94+
return ChatColor.DARK_PURPLE.toString();
95+
} else if (color.equals(LIGHT_PURPLE)) {
96+
return ChatColor.LIGHT_PURPLE.toString();
97+
}
98+
return ChatColor.RESET.toString();
99+
}
100+
}

0 commit comments

Comments
 (0)