55import org .bukkit .command .Command ;
66import org .bukkit .command .CommandExecutor ;
77import org .bukkit .command .CommandSender ;
8- import org .bukkit .command .TabCompleter ;
98import org .bukkit .configuration .file .FileConfiguration ;
109import org .bukkit .entity .Player ;
11- import org .bukkit .util .StringUtil ;
1210
11+ import java .io .File ;
1312import 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}
0 commit comments