Skip to content

Commit 033892f

Browse files
author
Meru
authored
feat: チケットシステムの完成 (#15)
* chore: add permissions and command * chore: add config_reload command * fix: アイテム配布が正常に行われない問題の修正 * chore: チケット関連のコンフィグ項目を追加 * chore: チケットコマンドの追加 * chore: チケット送信コマンドの追加
1 parent f396953 commit 033892f

File tree

6 files changed

+138
-6
lines changed

6 files changed

+138
-6
lines changed

src/main/java/net/azisaba/afnw/afnwcore2/AfnwCore2.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package net.azisaba.afnw.afnwcore2;
22

3-
import net.azisaba.afnw.afnwcore2.commands.AfnwCommand;
4-
import net.azisaba.afnw.afnwcore2.commands.RespawnCommand;
5-
import net.azisaba.afnw.afnwcore2.commands.VoteCommand;
3+
import net.azisaba.afnw.afnwcore2.commands.*;
64
import net.azisaba.afnw.afnwcore2.listeners.player.DeathListener;
75
import net.azisaba.afnw.afnwcore2.listeners.player.FirstPlayerJoinListener;
86
import net.azisaba.afnw.afnwcore2.listeners.player.JoinListener;
@@ -37,6 +35,8 @@ public void onEnable() {
3735
Objects.requireNonNull(getCommand("afnw")).setExecutor(new AfnwCommand(this));
3836
Objects.requireNonNull(getCommand("vote")).setExecutor(new VoteCommand());
3937
Objects.requireNonNull(getCommand("respawn")).setExecutor(new RespawnCommand());
38+
Objects.requireNonNull(getCommand("config_reload")).setExecutor(new ConfigReloadCommand(this));
39+
Objects.requireNonNull(getCommand("ticket")).setExecutor(new TicketCommand(this));
4040

4141
getLogger().info("[AfnwCore2] Enabled!");
4242
}

src/main/java/net/azisaba/afnw/afnwcore2/commands/AfnwCommand.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
4646
sender.sendMessage(Component.text("インベントリに空きがありません。").color(NamedTextColor.RED));
4747
return true;
4848
}
49-
if (!inv.contains(AfnwTicket.afnwTicket)) {
49+
if (!inv.containsAtLeast(AfnwTicket.afnwTicket, 1)) {
5050
sender.sendMessage(Component.text("チケットが見つかりません。").color(NamedTextColor.RED));
5151
return true;
5252
}
@@ -70,8 +70,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
7070
throw new RuntimeException(e);
7171
}
7272

73-
inv.remove(AfnwTicket.afnwTicket);
74-
73+
inv.removeItem(AfnwTicket.afnwTicket);
7574
inv.addItem(afnwItem);
7675
for (int i = 0; i < scaffoldSize; i++) {
7776
inv.addItem(AfnwScaffold.afnwScaffold);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package net.azisaba.afnw.afnwcore2.commands;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.format.NamedTextColor;
5+
import org.bukkit.command.Command;
6+
import org.bukkit.command.CommandExecutor;
7+
import org.bukkit.command.CommandSender;
8+
import org.bukkit.plugin.java.JavaPlugin;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
public record ConfigReloadCommand(JavaPlugin plugin) implements CommandExecutor {
12+
13+
@Override
14+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
15+
if(!(command.getName().equals("config_reload"))) {
16+
return true;
17+
}
18+
if(!(sender.hasPermission("afnw.command.config_reload"))) {
19+
return true;
20+
}
21+
22+
sender.sendMessage(Component.text("コンフィグファイルの再読み込みを開始します。", NamedTextColor.YELLOW));
23+
plugin.reloadConfig();
24+
sender.sendMessage(Component.text("コンフィグファイルの再読み込みが完了しました。", NamedTextColor.YELLOW));
25+
26+
return true;
27+
}
28+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package net.azisaba.afnw.afnwcore2.commands;
2+
3+
import net.azisaba.afnw.afnwcore2.util.item.AfnwTicket;
4+
import net.kyori.adventure.text.Component;
5+
import net.kyori.adventure.text.format.NamedTextColor;
6+
import org.bukkit.Bukkit;
7+
import org.bukkit.command.Command;
8+
import org.bukkit.command.CommandExecutor;
9+
import org.bukkit.command.CommandSender;
10+
import org.bukkit.configuration.file.FileConfiguration;
11+
import org.bukkit.entity.Player;
12+
import org.bukkit.plugin.java.JavaPlugin;
13+
import org.jetbrains.annotations.NotNull;
14+
15+
public record TicketCommand(JavaPlugin plugin) implements CommandExecutor {
16+
17+
18+
@Override
19+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
20+
// TODO: パーミッションチェックの導入
21+
if(!(command.getName().equals("ticket"))) {
22+
return true;
23+
}
24+
if(args.length == 0) {
25+
sender.sendMessage(Component.text("Usage: /ticket <sub-command>\nsub-command: give, show", NamedTextColor.RED));
26+
return true;
27+
}
28+
29+
switch (args[0]) {
30+
case "send" -> {
31+
if (sender instanceof Player) {
32+
sender.sendMessage(Component.text("/ticketコマンドはコンソールからのみ実行可能です。チケットの配布は/ticket giveを使用してください。"));
33+
break;
34+
}
35+
36+
FileConfiguration config = plugin.getConfig();
37+
if (!(config.isInt("vote.send-ticket-size"))) {
38+
throw new Error("configの値が数値ではありません。対象:vote> item-size, scaffold-size");
39+
}
40+
41+
int ticketSize = config.getInt("vote.send-ticket-size", 1);
42+
Player sendTarget = Bukkit.getPlayerExact(args[1]);
43+
if (sendTarget == null) {
44+
sender.sendMessage(Component.text("対象のプレイヤーを発見することができませんでした。本来のターゲット:" + args[2]));
45+
break;
46+
}
47+
48+
for (int i = 0; i < ticketSize; i++) {
49+
sendTarget.getInventory().addItem(AfnwTicket.afnwTicket);
50+
}
51+
52+
// 成功した趣旨の情報送信
53+
sender.sendMessage(Component.text(sendTarget.getName() + "へのチケット送信に成功しました。配布数:" + ticketSize));
54+
// 通知
55+
sendTarget.sendMessage(Component.text("チケットを入手しました。/afnwを実行することでアイテムと交換することができます。", NamedTextColor.YELLOW));
56+
}
57+
case "give" -> {
58+
if(!(args.length == 3)) {
59+
sender.sendMessage(Component.text("Usage(give): /ticket give <size> <player>", NamedTextColor.RED));
60+
return true;
61+
}
62+
63+
int giveTicketInt = Integer.parseInt(args[1]);
64+
Player giveTarget = Bukkit.getPlayerExact(args[2]);
65+
if(giveTarget == null) {
66+
sender.sendMessage(Component.text("対象のプレイヤーを発見することができませんでした", NamedTextColor.RED));
67+
break;
68+
}
69+
if(giveTicketInt <= 0) {
70+
sender.sendMessage(Component.text("配布数は0以上を指定する必要があります。", NamedTextColor.RED));
71+
break;
72+
}
73+
74+
for(int i = 0; i < giveTicketInt; i++) {
75+
giveTarget.getInventory().addItem(AfnwTicket.afnwTicket);
76+
}
77+
78+
// 成功した趣旨の情報送信
79+
Bukkit.getLogger().info(sender.getName() + "が" + giveTarget.getName() + "にチケットを配布しました。: " + giveTicketInt + "枚");
80+
sender.sendMessage(Component.text(giveTarget.getName() + "に" + giveTicketInt + "枚のチケットを配布しました。", NamedTextColor.YELLOW));
81+
// 通知
82+
giveTarget.sendMessage(Component.text("チケットを入手しました。(補填)/afnwを実行することでアイテムと交換することができます。", NamedTextColor.YELLOW));
83+
}
84+
85+
// TODO: 連続投票ボーナス数の表示処理の作成 : /ticket show
86+
}
87+
return true;
88+
}
89+
}

src/main/resources/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ vote: # 投票周りの設定
77
# /afnwで交換できるアイテムの数を指定してください。int(数)ではない場合はエラーが発生します。デフォルト: 1
88
scaffold-size: 8
99
# /afnwで交換時に一緒に配布される足場の数を指定してください。int(数)ではない場合はエラーが発生します。デフォルト: 8
10+
send-ticket-size: 1
11+
# 投票時に受け取れるチケットの数を指定してください。int(数)ではない場合はエラーが発生します。デフォルト: 1

src/main/resources/plugin.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ permissions:
2121
default: false
2222
afnw.command.respawn:
2323
default: false
24+
afnw.command.ticket-give:
25+
default: false
26+
afnw.command.ticket-show:
27+
default: false
28+
afnw.command.ticket-send:
29+
default: false
30+
description: DO NOT RUN COMMAND BY PLAYER
31+
afnw.command.config_reload:
32+
default: false
2433

2534
commands:
2635
afnw:
@@ -30,3 +39,8 @@ commands:
3039
respawn:
3140
description: プレイヤーを強制的にリスポーンさせます。
3241
usage: /respawn <player>
42+
ticket:
43+
description: チケットに関するコマンド
44+
usage: /ticket <subcommand>
45+
config_reload:
46+
description: コンフィグファイルのリロード

0 commit comments

Comments
 (0)