Skip to content

Commit 2ec51a4

Browse files
committed
fix: tab補完
1 parent c797358 commit 2ec51a4

File tree

2 files changed

+51
-84
lines changed

2 files changed

+51
-84
lines changed

src/main/java/net/azisaba/simplepoint/SPPCommand.java

Lines changed: 41 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
import org.bukkit.command.Command;
66
import org.bukkit.command.CommandExecutor;
77
import org.bukkit.command.CommandSender;
8-
import org.bukkit.command.TabCompleter;
98
import org.bukkit.configuration.file.FileConfiguration;
109
import org.bukkit.entity.Player;
11-
import org.bukkit.util.StringUtil;
1210

11+
import java.io.File;
1312
import java.util.*;
14-
import java.util.stream.Collectors;
1513

16-
public class SPPCommand implements CommandExecutor, TabCompleter {
14+
public class SPPCommand implements CommandExecutor {
1715
private final SimplePointPlugin plugin;
1816

1917
public SPPCommand(SimplePointPlugin plugin) {
@@ -37,10 +35,9 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
3735
}
3836
String id = args[1];
3937

40-
4138
StringBuilder dispNameBuilder = new StringBuilder();
4239
for (int i = 2; i < args.length; i++) {
43-
if (i > 2) dispNameBuilder.append(" "); // 引数間にスペースを戻す
40+
if (i > 2) dispNameBuilder.append(" ");
4441
dispNameBuilder.append(args[i]);
4542
}
4643
String displayName = dispNameBuilder.toString();
@@ -57,10 +54,14 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
5754
case "add":
5855
case "remove":
5956
case "set":
60-
if (args.length < 4) return false;
57+
// 順序修正: <ID> <Player> <Amount>
58+
if (args.length < 4) {
59+
sender.sendMessage("§c使用法: /spp " + sub + " <ID> <プレイヤー> <数>");
60+
return true;
61+
}
6162

62-
OfflinePlayer target = Bukkit.getOfflinePlayer(args[1]);
63-
String pointName = args[2];
63+
String pointId = args[1];
64+
OfflinePlayer target = Bukkit.getOfflinePlayer(args[2]);
6465
int amount;
6566

6667
try {
@@ -71,20 +72,17 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
7172
}
7273

7374
if (sub.equals("add")) {
74-
plugin.getPointManager().addPoint(pointName, target.getUniqueId(), amount);
75+
plugin.getPointManager().addPoint(pointId, target.getUniqueId(), amount);
7576
sender.sendMessage("§a" + target.getName() + " に " + amount + " pt 追加しました。");
76-
plugin.getLogManager().logPointChange(target.getName(), pointName, amount, "ADD");
77-
}
78-
else if (sub.equals("remove")) {
79-
// 数値をマイナスにして加算処理
80-
plugin.getPointManager().addPoint(pointName, target.getUniqueId(), -amount);
77+
plugin.getLogManager().logPointChange(target.getName(), pointId, amount, "ADD");
78+
} else if (sub.equals("remove")) {
79+
plugin.getPointManager().addPoint(pointId, target.getUniqueId(), -amount);
8180
sender.sendMessage("§a" + target.getName() + " から " + amount + " pt 差し引きました。");
82-
plugin.getLogManager().logPointChange(target.getName(), pointName, -amount, "REMOVE");
83-
}
84-
else if (sub.equals("set")) {
85-
plugin.getPointManager().setPoint(pointName, target.getUniqueId(), amount);
81+
plugin.getLogManager().logPointChange(target.getName(), pointId, -amount, "REMOVE");
82+
} else if (sub.equals("set")) {
83+
plugin.getPointManager().setPoint(pointId, target.getUniqueId(), amount);
8684
sender.sendMessage("§a" + target.getName() + " のポイントを " + amount + " pt に設定しました。");
87-
plugin.getLogManager().logPointChange(target.getName(), pointName, amount, "SET");
85+
plugin.getLogManager().logPointChange(target.getName(), pointId, amount, "SET");
8886
}
8987
break;
9088

@@ -107,27 +105,20 @@ else if (sub.equals("set")) {
107105
break;
108106

109107
case "setreq":
110-
// ... 前後の引数チェックなどは既存通り ...
108+
if (args.length < 4) return false;
111109
String pName = args[1];
112110
int slot = Integer.parseInt(args[2]);
113111
int req = Integer.parseInt(args[3]);
114112

115113
FileConfiguration config = plugin.getRewardManager().getRewardConfig(pName);
116-
if (config.contains(String.valueOf(slot))) {
117-
// 解放条件(requirement)だけをセット
114+
if (config != null && config.contains(String.valueOf(slot))) {
118115
config.set(slot + ".requirement", req);
119-
120-
// ✨ saveReward の引数に config から読み取った is_personal を追加して呼び出す
121-
plugin.getRewardManager().saveReward(
122-
pName,
123-
slot,
124-
config.getItemStack(slot + ".item"),
125-
config.getInt(slot + ".price", 100),
126-
config.getInt(slot + ".stock", -1),
127-
config.getBoolean(slot + ".is_personal", false) // ← ここを追加!
128-
);
129-
130-
sender.sendMessage("§a" + pName + " " + slot + "番に解放条件 " + req + " pt を設定しました。");
116+
try {
117+
config.save(new File(plugin.getDataFolder(), "rewards/" + pName + ".yml"));
118+
sender.sendMessage("§a" + pName + " " + slot + "番に解放条件 " + req + " pt を設定しました。");
119+
} catch (Exception e) {
120+
sender.sendMessage("§c保存に失敗しました。");
121+
}
131122
} else {
132123
sender.sendMessage("§c指定されたスロットに報酬が存在しません。");
133124
}
@@ -140,24 +131,26 @@ else if (sub.equals("set")) {
140131

141132
case "score":
142133
if (args.length < 3) return false;
143-
String ptName = args[1];
144-
OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[2]);
145-
int score = plugin.getPointManager().getPoint(ptName, targetPlayer.getUniqueId());
146-
sender.sendMessage("§e" + targetPlayer.getName() + " の " + ptName + ": §f" + score + "pt");
134+
String ptId = args[1];
135+
OfflinePlayer tPlayer = Bukkit.getOfflinePlayer(args[2]);
136+
int score = plugin.getPointManager().getPoint(ptId, tPlayer.getUniqueId());
137+
sender.sendMessage("§e" + tPlayer.getName() + " の " + ptId + ": §f" + score + "pt");
147138
break;
148139

149140
case "toggleranking":
150141
if (args.length < 2) return false;
151142
FileConfiguration cfg = plugin.getPointManager().getPointConfig(args[1]);
143+
if (cfg == null) return true;
152144
boolean newState = !cfg.getBoolean("_settings.ranking_enabled", true);
153145
cfg.set("_settings.ranking_enabled", newState);
154-
plugin.getPointManager().saveConfig(args[1], cfg);
146+
plugin.getPointManager().savePointConfig(args[1]);
155147
sender.sendMessage("§a報酬/ランキングを " + (newState ? "§2有効" : "§4無効") + " にしました。");
156148
break;
157149

158-
case "reload": // ✨ 全体リロードに変更
159-
plugin.reloadConfig(); // Bukkit標準のconfig.ymlリロード
160-
plugin.getRewardManager().reload(); // 報酬キャッシュクリア
150+
case "reload":
151+
plugin.reloadConfig();
152+
plugin.getRewardManager().reload();
153+
plugin.getPointManager().reload();
161154
sender.sendMessage("§a[SimplePoint] 設定と報酬データをリロードしました。");
162155
break;
163156

@@ -179,78 +172,49 @@ private void showRanking(CommandSender sender, String pointName) {
179172
for (String key : config.getKeys(false)) {
180173
if (key.startsWith("_")) continue;
181174
int total = config.getInt(key + ".total", 0);
182-
OfflinePlayer op = Bukkit.getOfflinePlayer(UUID.fromString(key));
183-
if (op.getName() != null) scores.put(op.getName(), total);
175+
try {
176+
OfflinePlayer op = Bukkit.getOfflinePlayer(UUID.fromString(key));
177+
if (op.getName() != null) scores.put(op.getName(), total);
178+
} catch (IllegalArgumentException ignored) {}
184179
}
185180

186181
List<Map.Entry<String, Integer>> list = new ArrayList<>(scores.entrySet());
187182
list.sort((a, b) -> b.getValue().compareTo(a.getValue()));
188183

189-
// --- 全体放送用のメッセージ構築 ---
190-
String header = "§8§l[§6§lRanking§8§l] §e§l" + pointName.toUpperCase();
191184
Bukkit.broadcastMessage("§7§m--------------------------------------");
192-
Bukkit.broadcastMessage(header);
185+
Bukkit.broadcastMessage("§8§l[§6§lRanking§8§l] §e§l" + pointName.toUpperCase());
193186

194187
for (int i = 0; i < Math.min(list.size(), 7); i++) {
195188
String color = (i == 0) ? "§e§l" : (i == 1) ? "§f§l" : (i == 2) ? "§6§l" : "§7";
196189
String name = list.get(i).getKey();
197190
int score = list.get(i).getValue();
198-
199191
Bukkit.broadcastMessage(color + (i + 1) + ". §r" + name + " §7- §b" + score + " pt");
200192
}
201193
Bukkit.broadcastMessage("§7§m--------------------------------------");
202-
203194
}
204195

205196
private void sendHelp(CommandSender sender) {
206197
sender.sendMessage("§8§m-----------------------------------------");
207198
sender.sendMessage(" §6§lSimplePoint §e§l管理マネージャー");
208199
sender.sendMessage("");
209-
210-
// 基本操作 (強調)
211200
sender.sendMessage(" §e§l▶ §a§lポイント基本操作");
212201
sender.sendMessage(" §f/spp §a§lcreate §b<ID> <表示名...> §7- 新規作成");
213202
sender.sendMessage(" §f/spp §a§ladd §b<ID> <プレイヤー> <数> §7- 付与");
214203
sender.sendMessage(" §f/spp §a§lremove §b<ID> <プレイヤー> <数> §7- 剥奪");
215204
sender.sendMessage(" §f/spp §a§lset §b<ID> <プレイヤー> <数> §7- 上書き");
216205
sender.sendMessage("");
217-
218-
// 確認・報酬 (強調)
219206
sender.sendMessage(" §e§l▶ §a§lデータ確認・報酬設定");
220207
sender.sendMessage(" §f/spp §a§lscore §b<ID> <プレイヤー> §7- 所持状況確認");
221208
sender.sendMessage(" §f/spp §a§lrewardgui §b<ID> §7- 報酬スロット編集");
222209
sender.sendMessage(" §f/spp §a§lranking §b<ID> §7- ランキング表示");
223210
sender.sendMessage("");
224-
225-
// システム設定
226211
sender.sendMessage(" §e§l▶ §fシステム設定");
227212
sender.sendMessage(" §f/spp §fsetreq §7<ID> <Slot> <pt> - 解放条件設定");
228213
sender.sendMessage(" §f/spp §ftoggleranking §7<ID> - ランキング有効化切替");
229214
sender.sendMessage(" §f/spp §fcreateteam §7<チーム名> - チームデータ作成");
230215
sender.sendMessage(" §f/spp §freload §7- コンフィグリロード");
231-
232216
sender.sendMessage("");
233217
sender.sendMessage(" §7※ §b<ID>§7は内部用英数字、§b<表示名>§7は日本語/色可");
234218
sender.sendMessage("§8§m-----------------------------------------");
235219
}
236-
237-
@Override
238-
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
239-
List<String> completions = new ArrayList<>();
240-
if (args.length == 1) {
241-
StringUtil.copyPartialMatches(args[0], Arrays.asList("help","create", "add", "set","remove", "rewardgui", "teamrewardgui", "createteam", "setreq", "ranking", "reload", "score", "toggleranking"), completions);
242-
} else if (args.length == 2) {
243-
if (Arrays.asList("add", "set","remove").contains(args[0].toLowerCase())) {
244-
List<String> names = Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList());
245-
StringUtil.copyPartialMatches(args[1], names, completions);
246-
} else if (Arrays.asList("rewardgui", "ranking", "toggleranking", "score", "setreq").contains(args[0].toLowerCase())) {
247-
StringUtil.copyPartialMatches(args[1], plugin.getPointManager().getPointNames(), completions);
248-
} else if (args[0].equalsIgnoreCase("teamrewardgui")) {
249-
StringUtil.copyPartialMatches(args[1], new ArrayList<>(plugin.getTeamManager().getTeamNames()), completions);
250-
}
251-
} else if (args.length == 3 && Arrays.asList("add", "set","remove").contains(args[0].toLowerCase())) {
252-
StringUtil.copyPartialMatches(args[2], plugin.getPointManager().getPointNames(), completions);
253-
}
254-
return completions;
255-
}
256220
}

src/main/java/net/azisaba/simplepoint/SimplePointPlugin.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class SimplePointPlugin extends JavaPlugin {
1212

1313
@Override
1414
public void onEnable() {
15-
// 1. settings.yml の書き出し (エラー対策)
15+
// 1. settings.yml の書き出し
1616
try {
1717
if (!new File(getDataFolder(), "settings.yml").exists()) {
1818
saveResource("settings.yml", false);
@@ -31,16 +31,21 @@ public void onEnable() {
3131
// 3. イベントとコマンドの登録
3232
getServer().getPluginManager().registerEvents(guiManager, this);
3333

34+
// --- SPP Command ---
3435
if (getCommand("spp") != null) {
35-
SPPCommand spp = new SPPCommand(this);
36-
getCommand("spp").setExecutor(spp);
37-
getCommand("spp").setTabCompleter(spp);
36+
SPPCommand sppExecutor = new SPPCommand(this);
37+
getCommand("spp").setExecutor(sppExecutor);
38+
// ✨ 修正: SPPCommand自身ではなく、専用の補完クラスのみをセット
3839
getCommand("spp").setTabCompleter(new SPPTabCompleter(this));
3940
}
41+
42+
// --- SPT Command ---
4043
if (getCommand("spt") != null) {
4144
getCommand("spt").setExecutor(new SPTCommand(this));
4245
getCommand("spt").setTabCompleter(new SPTTabCompleter(this));
4346
}
47+
48+
// --- SPTT Command ---
4449
if (getCommand("sptt") != null) {
4550
getCommand("sptt").setExecutor(new SPTTCommand(this));
4651
}
@@ -53,11 +58,9 @@ public void onEnable() {
5358
public GUIManager getGuiManager() { return guiManager; }
5459
public LogManager getLogManager() { return logManager; }
5560
public TeamManager getTeamManager() { return teamManager; }
61+
5662
public void reloadAllConfig() {
57-
// Bukkit標準のconfig.ymlリロード
5863
reloadConfig();
59-
60-
// 各マネージャーのキャッシュ/ファイルをリロード
6164
if (rewardManager != null) rewardManager.reload();
6265
if (pointManager != null) pointManager.reload();
6366
if (teamManager != null) teamManager.loadTeams();

0 commit comments

Comments
 (0)