Skip to content

Commit 0a794fe

Browse files
committed
必要空きスロット指定メソッド追加
1 parent 6279358 commit 0a794fe

File tree

6 files changed

+66
-8
lines changed

6 files changed

+66
-8
lines changed

src/main/java/dev/felnull/pointed/Pointed.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dev.felnull.pointed.core.database.api.PointService;
88
import dev.felnull.pointed.core.database.api.PointServiceImpl;
99
import dev.felnull.pointed.core.listener.ChatListener;
10+
import dev.felnull.pointed.core.listener.RewardPendingAutoDeliverListener;
1011
import dev.felnull.pointed.core.util.ChatReader;
1112
import dev.felnull.pointed.teams.database.TeamTableInitializer;
1213
import dev.felnull.pointed.teams.manager.TeamManager;
@@ -80,6 +81,7 @@ public void setupCommand(){
8081
}
8182
public void setupListener(){
8283
Bukkit.getPluginManager().registerEvents(new ChatListener(this), this);
84+
Bukkit.getPluginManager().registerEvents(new RewardPendingAutoDeliverListener(getRewardAdminService()), this);
8385
}
8486
public void setupPlugin(){
8587
}

src/main/java/dev/felnull/pointed/core/commands/RewardCommand.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,13 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
2828
if (args.length == 1 && args[0].equalsIgnoreCase("claim")) {
2929
Bukkit.getScheduler().runTaskAsynchronously(Pointed.getInstance(), () -> {
3030
try {
31-
int[] res = admin.claimPendingRewards(p.getUniqueId());
31+
// メインスレッドで claimPendingRewards を実行して結果を受け取る
32+
int[] res = Bukkit.getScheduler()
33+
.callSyncMethod(Pointed.getInstance(), () -> admin.claimPendingRewards(p.getUniqueId()))
34+
.get(); // ここは今の非同期スレッドで待つのでサーバはブロックしない
35+
3236
int delivered = res[0], remaining = res[1];
37+
// プレイヤーへのメッセージ送信はメインに戻す
3338
Bukkit.getScheduler().runTask(Pointed.getInstance(), () -> {
3439
if (delivered == 0 && remaining == 0) {
3540
p.sendMessage(Util.f("&7受け取れる報酬はありません。"));
@@ -38,7 +43,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
3843
if (remaining > 0) p.sendMessage(Util.f("&e空き不足で {0} 件保留です。", remaining));
3944
}
4045
});
41-
} catch (SQLException e) {
46+
} catch (Exception e) {
4247
Bukkit.getScheduler().runTask(Pointed.getInstance(), () ->
4348
p.sendMessage(Util.f("&cエラー: {0}", e.getMessage())));
4449
}

src/main/java/dev/felnull/pointed/core/listener/RewardPendingAutoDeliverListener.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import dev.felnull.pointed.core.util.Util;
55
import dev.felnull.pointed.teams.manager.reward.RewardAdminService;
66
import org.bukkit.Bukkit;
7+
import org.bukkit.entity.Player;
78
import org.bukkit.event.EventHandler;
89
import org.bukkit.event.Listener;
910
import org.bukkit.event.player.PlayerJoinEvent;
@@ -20,21 +21,36 @@ public RewardPendingAutoDeliverListener(RewardAdminService admin) {
2021

2122
@EventHandler
2223
public void onJoin(PlayerJoinEvent e) {
23-
if(!(Pointed.getInstance().getConfig().getBoolean("reward", false))){
24+
if (!Pointed.getInstance().getConfig().getBoolean("reward", false)) {
2425
return;
2526
}
2627
UUID uuid = e.getPlayer().getUniqueId();
28+
29+
// 非同期で起点 → メインで claim 実行 → 結果を受け取る
2730
Bukkit.getScheduler().runTaskAsynchronously(Pointed.getInstance(), () -> {
2831
try {
29-
int[] res = admin.claimPendingRewards(uuid);
32+
// ★ claimPendingRewards を必ずメインスレッドで実行
33+
int[] res = Bukkit.getScheduler()
34+
.callSyncMethod(Pointed.getInstance(), () -> admin.claimPendingRewards(uuid))
35+
.get(); // 非同期側で待つのでサーバ主スレッドはここでは止まらない
36+
3037
int delivered = res[0], remaining = res[1];
38+
3139
if (delivered > 0 || remaining > 0) {
40+
// メッセージ送信もメインで
3241
Bukkit.getScheduler().runTask(Pointed.getInstance(), () -> {
33-
if (delivered > 0) e.getPlayer().sendMessage(Util.f("&a{0}件の報酬を受け取りました。", delivered));
34-
if (remaining > 0) e.getPlayer().sendMessage(Util.f("&eインベントリの空きが足りません(保留 {0} 件)。空けて /reward claim を実行してください。", remaining));
42+
Player p = Bukkit.getPlayer(uuid);
43+
if (p == null || !p.isOnline()) return;
44+
45+
if (delivered > 0) {
46+
p.sendMessage(Util.f("&a{0}件の報酬を受け取りました。", delivered));
47+
}
48+
if (remaining > 0) {
49+
p.sendMessage(Util.f("&eインベントリの空きが足りません(保留 {0} 件)。空けて /reward claim を実行してください。", remaining));
50+
}
3551
});
3652
}
37-
} catch (SQLException ex) {
53+
} catch (Exception ex) {
3854
Bukkit.getLogger().warning("[Pointed] claim on login failed: " + ex.getMessage());
3955
}
4056
});

src/main/java/dev/felnull/pointed/teams/manager/reward/RewardAdminService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public interface RewardAdminService {
2626
void setCommandEnabled(int rewardId, int idx, boolean enabled) throws SQLException;
2727
void updateCommandText(int rewardId, int idx, String newText) throws SQLException;
2828
boolean rewardExists(long rewardId);
29+
/** rewards.required_slots を更新(0以上) */
30+
void setRequiredSlots(int rewardId, int requiredSlots) throws SQLException;
31+
32+
/** rewards.required_slots を取得(null=存在しない) */
33+
Integer getRequiredSlots(int rewardId) throws SQLException;
2934

3035
// ===== Reward =====
3136
/**

src/main/java/dev/felnull/pointed/teams/manager/reward/impl/RewardAdminServiceImpl.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,4 +1026,29 @@ private Long findPlayerSubjectId(Connection c, String uuid) throws SQLException
10261026
}
10271027
}
10281028

1029+
@Override
1030+
public void setRequiredSlots(int rewardId, int requiredSlots) throws SQLException {
1031+
if (requiredSlots < 0) throw new SQLException("required_slots must be >= 0");
1032+
try (Connection c = ds.getConnection();
1033+
PreparedStatement ps = c.prepareStatement(
1034+
"UPDATE " + Names.t("rewards") + " SET required_slots=? WHERE id=?")) {
1035+
ps.setInt(1, requiredSlots);
1036+
ps.setInt(2, rewardId);
1037+
int n = ps.executeUpdate();
1038+
if (n == 0) throw new SQLException("Reward not found: id=" + rewardId);
1039+
}
1040+
}
1041+
1042+
@Override
1043+
public Integer getRequiredSlots(int rewardId) throws SQLException {
1044+
try (Connection c = ds.getConnection();
1045+
PreparedStatement ps = c.prepareStatement(
1046+
"SELECT required_slots FROM " + Names.t("rewards") + " WHERE id=?")) {
1047+
ps.setInt(1, rewardId);
1048+
try (ResultSet rs = ps.executeQuery()) {
1049+
return rs.next() ? rs.getInt(1) : null;
1050+
}
1051+
}
1052+
}
1053+
10291054
}

src/main/resources/plugin.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ commands:
1313
permission: pointed.admin
1414
description: Pointed commands
1515
usage: "/ptteam <>"
16+
reward:
17+
permission: pointed.player
18+
1619
permissions:
1720
pointed.admin:
18-
default: op
21+
default: op
22+
pointed.player:
23+
default: true

0 commit comments

Comments
 (0)