Skip to content

Commit 22cd2ce

Browse files
committed
chore: migrating match system to core module
1 parent 07abb37 commit 22cd2ce

File tree

13 files changed

+153
-39
lines changed

13 files changed

+153
-39
lines changed

build.gradle.kts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77

88
dependencies {
99
implementation(project("nmswrap"))
10-
implementation(project("plugin"))
10+
implementation(project("core"))
1111
}
1212

1313
tasks {
@@ -86,12 +86,14 @@ allprojects {
8686
compileOnly("com.github.Be4rJP:DADADAChecker:1.0.0")
8787
compileOnly("com.github.Be4rJP:BlockStudio:-SNAPSHOT")
8888
compileOnly("com.destroystokyo.paper:paper-api:1.15.2-R0.1-SNAPSHOT")
89+
testImplementation("com.destroystokyo.paper:paper-api:1.15.2-R0.1-SNAPSHOT")
90+
testImplementation("org.slf4j:slf4j-simple:1.7.25")
8991
implementation("co.aikar:acf-paper:0.5.1-SNAPSHOT")
9092
compileOnly("org.jspecify:jspecify:1.0.0")
9193
}
9294

9395
// Project Settings
94-
val targetJavaVersion = 8
96+
val targetJavaVersion = 11
9597
val defaultEncoding: String = "UTF-8"
9698

9799
java {

core/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ dependencies {
1313
testImplementation(platform("org.junit:junit-bom:5.10.0"))
1414
testImplementation("org.junit.jupiter:junit-jupiter")
1515
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
16+
testImplementation("org.mockito:mockito-core:5.21.0")
17+
testImplementation("org.mockito:mockito-junit-jupiter:5.21.0")
1618
}
1719

1820
tasks.test {

core/src/main/java/be4rjp/sclat/SclatAPI.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import org.bukkit.plugin.java.JavaPlugin;
44

55
public class SclatAPI {
6-
protected static JavaPlugin plugin;
6+
protected static JavaPlugin plugin;
77

8-
public static JavaPlugin getPlugin() {
9-
return plugin;
10-
}
8+
public static JavaPlugin getPlugin() {
9+
return plugin;
10+
}
1111
}

core/src/main/java/be4rjp/sclat/match/Match.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,6 @@ public void onLeavePlayer(Player player) {
7171
}
7272

7373
public Set<UUID> joinedPlayers() {
74-
return (Set<UUID>) joinedPlayers.clone();
74+
return new HashSet<>(joinedPlayers);
7575
}
7676
}

src/main/java/be4rjp/sclat/api/SimpleRunnable.java renamed to core/src/main/java/be4rjp/sclat/schedule/SimpleRunnable.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package be4rjp.sclat.api;
1+
package be4rjp.sclat.schedule;
22

3-
import be4rjp.sclat.Sclat;
3+
import be4rjp.sclat.SclatAPI;
44
import org.bukkit.scheduler.BukkitRunnable;
55
import org.bukkit.scheduler.BukkitTask;
66

@@ -17,10 +17,10 @@ public void run() {
1717
}
1818

1919
public static BukkitTask runTaskLater(Consumer<Runnable> action, long delay) {
20-
return from(action).runTaskLater(Sclat.getPlugin(), delay);
20+
return from(action).runTaskLater(SclatAPI.getPlugin(), delay);
2121
}
2222

2323
public static BukkitTask runTaskTimer(Consumer<Runnable> action, long delay, long period) {
24-
return from(action).runTaskTimer(Sclat.getPlugin(), delay, period);
24+
return from(action).runTaskTimer(SclatAPI.getPlugin(), delay, period);
2525
}
2626
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package be4rjp.sclat.schedule;
2+
3+
import be4rjp.sclat.SclatAPI;
4+
import org.bukkit.scheduler.BukkitRunnable;
5+
import org.bukkit.scheduler.BukkitTask;
6+
7+
import java.util.HashMap;
8+
9+
public class TickScheduler {
10+
private final BukkitRunnable runnable = new BukkitRunnable() {
11+
@Override
12+
public void run() {
13+
onTick();
14+
}
15+
};
16+
private final HashMap<Integer, Runnable> tickActionMap = new HashMap<>();
17+
private int currentTick = 0;
18+
private BukkitTask task = null;
19+
public TickScheduler() {
20+
}
21+
22+
public void add(int tick, Runnable action) {
23+
tickActionMap.put(tick, action);
24+
}
25+
26+
public void onTick() {
27+
Runnable action = tickActionMap.get(currentTick);
28+
if (action != null)
29+
action.run();
30+
currentTick++;
31+
}
32+
33+
public void run(long delay) {
34+
task = runnable.runTaskTimer(SclatAPI.getPlugin(), delay, 1);
35+
}
36+
37+
public void runAsync(long delay) {
38+
task = runnable.runTaskTimerAsynchronously(SclatAPI.getPlugin(), delay, 1);
39+
}
40+
41+
public void stop() {
42+
if (task != null)
43+
task.cancel();
44+
}
45+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package be4rjp.sclat.match;
2+
3+
import org.bukkit.entity.Player;
4+
import org.junit.jupiter.api.BeforeEach;
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.ExtendWith;
8+
import org.mockito.Mockito;
9+
import org.mockito.junit.jupiter.MockitoExtension;
10+
11+
import java.util.Set;
12+
import java.util.UUID;
13+
14+
import static org.junit.jupiter.api.Assertions.assertEquals;
15+
import static org.junit.jupiter.api.Assertions.assertFalse;
16+
import static org.junit.jupiter.api.Assertions.assertTrue;
17+
import static org.mockito.Mockito.lenient;
18+
19+
@ExtendWith(MockitoExtension.class)
20+
public class MatchTest {
21+
private Match match;
22+
private UUID testUuid;
23+
private Player mockPlayer;
24+
25+
@BeforeEach
26+
void setup() {
27+
match = new Match();
28+
testUuid = UUID.randomUUID();
29+
mockPlayer = Mockito.mock(Player.class);
30+
lenient().when(mockPlayer.getUniqueId()).thenReturn(testUuid);
31+
lenient().when(mockPlayer.getName()).thenReturn("TestPlayer");
32+
}
33+
34+
@Test
35+
@DisplayName("プレイヤーが正常に参加し、一覧に反映されること")
36+
void testOnJoinPlayer() {
37+
match.onJoinPlayer(mockPlayer);
38+
39+
Set<UUID> players = match.joinedPlayers();
40+
assertTrue(players.contains(testUuid), "参加したプレイヤーのUUIDが含まれている必要があります");
41+
assertEquals(1, players.size());
42+
}
43+
44+
@Test
45+
@DisplayName("重複して参加しようとした場合、追加されないこと")
46+
void testDuplicateJoin() {
47+
match.onJoinPlayer(mockPlayer); // 1回目
48+
match.onJoinPlayer(mockPlayer); // 2回目 (警告ログが出るケース)
49+
50+
assertEquals(1, match.joinedPlayers().size(), "重複しても人数は増えないはずです");
51+
}
52+
53+
@Test
54+
@DisplayName("プレイヤーが退出した際、一覧から削除されること")
55+
void testOnLeavePlayer() {
56+
match.onJoinPlayer(mockPlayer);
57+
match.onLeavePlayer(mockPlayer);
58+
59+
Set<UUID> players = match.joinedPlayers();
60+
assertFalse(players.contains(testUuid));
61+
assertTrue(players.isEmpty());
62+
}
63+
64+
@Test
65+
@DisplayName("joinedPlayers() が元のリストのコピーを返していること(防御的コピーの確認)")
66+
void testJoinedPlayersIsDefensiveCopy() {
67+
match.onJoinPlayer(mockPlayer);
68+
Set<UUID> players = match.joinedPlayers();
69+
70+
// 返されたSetを操作しても、Matchクラス内部のSetには影響を与えないはず
71+
players.clear();
72+
73+
assertFalse(match.joinedPlayers().isEmpty(), "返されたSetを操作しても内部状態が壊れてはいけません");
74+
}
75+
76+
}

src/main/java/be4rjp/sclat/manager/MatchMgr.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import be4rjp.sclat.data.Path;
2929
import be4rjp.sclat.data.WeaponClass;
3030
import be4rjp.sclat.gui.OpenGUI;
31+
import be4rjp.sclat.schedule.TickScheduler;
3132
import be4rjp.sclat.weapon.Charger;
3233
import be4rjp.sclat.weapon.Decoy;
3334
import be4rjp.sclat.weapon.Funnel;
@@ -439,30 +440,18 @@ public void run() {
439440
task.runTaskLater(Sclat.getPlugin(), 3600);
440441
}
441442

443+
// Todo: should broadcast to everyone?
442444
public static void StartCount(Player player) {
443-
BukkitRunnable task = new BukkitRunnable() {
444-
Player p = player;
445-
int i = 0;
446-
@Override
447-
public void run() {
448-
if (i == 10)
449-
p.sendTitle("R§7EADY?", "", 0, 56, 0);
450-
if (i == 12)
451-
p.sendTitle("RE§7ADY?", "", 0, 46, 0);
452-
if (i == 14)
453-
p.sendTitle("REA§7DY?", "", 0, 36, 0);
454-
if (i == 16)
455-
p.sendTitle("READ§7Y?", "", 0, 26, 0);
456-
if (i == 18)
457-
p.sendTitle("READY§7?", "", 0, 16, 0);
458-
if (i == 20)
459-
p.sendTitle("READY?", "", 0, 6, 2);
460-
if (i == 47)
461-
p.sendTitle(DataMgr.getPlayerData(p).getTeam().getTeamColor().getColorCode() + "GO!", "", 2, 6, 2);
462-
i++;
463-
}
464-
};
465-
task.runTaskTimer(Sclat.getPlugin(), 230, 1);
445+
String teamColorCode = DataMgr.getPlayerData(player).getTeam().getTeamColor().getColorCode();
446+
TickScheduler scheduler = new TickScheduler();
447+
scheduler.add(10, () -> player.sendTitle("R§7EADY?", "", 0, 56, 0));
448+
scheduler.add(12, () -> player.sendTitle("RE§7ADY?", "", 0, 46, 0));
449+
scheduler.add(14, () -> player.sendTitle("REA§7DY?", "", 0, 36, 0));
450+
scheduler.add(16, () -> player.sendTitle("READ§7Y?", "", 0, 26, 0));
451+
scheduler.add(18, () -> player.sendTitle("READY§7?", "", 0, 16, 0));
452+
scheduler.add(20, () -> player.sendTitle("READY?", "", 0, 6, 2));
453+
scheduler.add(47, () -> player.sendTitle(teamColorCode + "GO!", "", 2, 6, 2));
454+
scheduler.run(230);
466455
}
467456

468457
public static void MatchRunnable(Player player, Match match) {

src/main/java/be4rjp/sclat/weapon/Funnel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
import be4rjp.sclat.api.GlowingAPI;
55
import be4rjp.sclat.api.IOwnable;
66
import be4rjp.sclat.api.SclatUtil;
7-
import be4rjp.sclat.api.SimpleRunnable;
87
import be4rjp.sclat.api.player.PlayerData;
98
import be4rjp.sclat.api.raytrace.BoundingBox;
109
import be4rjp.sclat.api.raytrace.RayTrace;
1110
import be4rjp.sclat.api.team.Team;
1211
import be4rjp.sclat.data.DataMgr;
1312
import be4rjp.sclat.data.KasaData;
1413
import be4rjp.sclat.manager.ArmorStandMgr;
14+
import be4rjp.sclat.schedule.SimpleRunnable;
1515
import net.minecraft.server.v1_15_R1.EnumItemSlot;
1616
import net.minecraft.server.v1_15_R1.PacketPlayOutEntityEquipment;
1717
import net.minecraft.server.v1_15_R1.PlayerConnection;

src/main/java/be4rjp/sclat/weapon/blaster/Blaster.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
import be4rjp.sclat.Sclat;
55
import be4rjp.sclat.api.SclatUtil;
6-
import be4rjp.sclat.api.SimpleRunnable;
76
import be4rjp.sclat.api.Sphere;
87
import be4rjp.sclat.api.player.PlayerData;
98
import be4rjp.sclat.data.DataMgr;
109
import be4rjp.sclat.data.KasaData;
1110
import be4rjp.sclat.data.SplashShieldData;
1211
import be4rjp.sclat.manager.ArmorStandMgr;
1312
import be4rjp.sclat.manager.PaintMgr;
13+
import be4rjp.sclat.schedule.SimpleRunnable;
1414
import be4rjp.sclat.weapon.Gear;
1515
import org.bukkit.ChatColor;
1616
import org.bukkit.GameMode;

0 commit comments

Comments
 (0)