Skip to content

Commit 47d7c5c

Browse files
committed
死亡したプレイヤーが一旦抜けて再度接続した場合、サバイバルで復活する
→スペクテーターに。死んでいない場合サバイバルで復活 fix 残りの人数 feat ランキングシステム実装
1 parent 031bd2d commit 47d7c5c

File tree

1 file changed

+49
-15
lines changed

1 file changed

+49
-15
lines changed

src/main/java/com/github/elic0de/hungergames/game/HungerGame.java

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.jetbrains.annotations.NotNull;
2626

2727
import java.util.*;
28+
import java.util.concurrent.atomic.AtomicInteger;
2829
import java.util.stream.Collectors;
2930

3031
public class HungerGame extends AbstractGame {
@@ -39,6 +40,9 @@ public class HungerGame extends AbstractGame {
3940

4041
private final GameBorder border;
4142

43+
@Getter
44+
private final Set<GameUser> gameUsers = new HashSet<>();
45+
4246
private final Set<Team> aliveTeams = new HashSet<>();
4347

4448
@Getter
@@ -60,12 +64,12 @@ public HungerGame() {
6064
}
6165

6266
public void join(GameUser user) {
63-
super.join(user);
67+
gameUsers.add(user);
6468
bossBar.addPlayer(user);
6569
}
6670

6771
public void leave(GameUser user) {
68-
super.leave(user);
72+
gameUsers.remove(user);
6973
bossBar.removePlayer(user);
7074
}
7175

@@ -74,14 +78,16 @@ public void startGame(Player player) {
7478
final WorldBorder border = player.getWorld().getWorldBorder();
7579
final Location start = border.getCenter().clone().add(border.getSize() / 2, 130, border.getSize() / 2);
7680

77-
getPlayers(GameUser.class).forEach(user -> {
81+
getGameUsers().forEach(user -> {
7882
// プレイヤーが所属しているチームを生存しているチームとして登録
7983
// チームに所属していなかったら観戦者とする
8084
getUserTeam(user).ifPresentOrElse(aliveTeams::add, () -> deadPlayers.add(user.getUsername()));
8185

82-
user.getPlayer().getInventory().clear();
83-
user.getPlayer().teleport(start);
84-
user.getPlayer().setGameMode(GameMode.SPECTATOR);
86+
Bukkit.getScheduler().runTask(HungerGames.getInstance(), () -> {
87+
user.getPlayer().getInventory().clear();
88+
user.getPlayer().teleport(start);
89+
user.getPlayer().setGameMode(GameMode.SPECTATOR);
90+
});
8591
});
8692
nextPhase();
8793
spawnEnderDragon(player);
@@ -109,7 +115,7 @@ public void spawnEnderDragon(Player player) {
109115
dragon.addTrait(dragonTrait);
110116

111117
if (dragon.isSpawned()) {
112-
getPlayers().stream().filter(onlineUser -> !deadPlayers.contains(onlineUser.getUsername())).forEach(onlineUser -> dragon.getEntity().addPassenger(onlineUser.getPlayer()));
118+
getGameUsers().stream().filter(onlineUser -> !deadPlayers.contains(onlineUser.getUsername())).forEach(onlineUser -> dragon.getEntity().addPassenger(onlineUser.getPlayer()));
113119
task.cancel();
114120
}
115121
}, 0, 20);
@@ -122,20 +128,16 @@ public void dismountWithTeam(GameUser user) {
122128

123129
public void onDeath(GameUser user) {
124130
if (getPhase() instanceof InGamePhase) {
125-
/* if (isSpectator(user)) return;
131+
if (isSpectator(user)) return;
126132

127133
deadPlayers.add(user.getUsername());
128-
if ((getPlayers().size() - getDeadPlayers().size()) == 10) {
134+
if (getAlivePlayersSize() == 10) {
129135
broadcast(new MineDown("残りプレイヤー10人"));
130136
}
131137

132138
getUserTeam(user).ifPresent(team -> {
133139
if (checkTeamDead(user)) aliveTeams.remove(team);
134140
});
135-
// 生存チーム数が2チーム以下になったら勝利
136-
if (aliveTeams.size() < 2) {
137-
wonGame();
138-
}*/
139141

140142
if (user.getPlayer().getKiller() != null) {
141143
records.addKill(GameUserManager.getGameUser(user.getPlayer().getKiller()));
@@ -146,6 +148,11 @@ public void onDeath(GameUser user) {
146148
user.getPlayer().setGameMode(GameMode.SPECTATOR);
147149
user.getPlayer().getWorld().strikeLightningEffect(user.getPlayer().getLocation());
148150
});
151+
152+
// 生存チーム数が2チーム以下になったら勝利
153+
if (aliveTeams.size() < 2) {
154+
wonGame();
155+
}
149156
}
150157
}
151158

@@ -160,10 +167,25 @@ public void wonGame() {
160167
}
161168

162169
public void endGame() {
170+
showResult();
163171
sound(Sound.UI_TOAST_CHALLENGE_COMPLETE);
164172
reset();
165173
}
166174

175+
// todo
176+
private void showResult() {
177+
178+
final List<Map.Entry<UUID, Integer>> list = new ArrayList<>(records.getRank().entrySet());
179+
180+
list.stream().limit(10).forEach(entry -> {
181+
final UUID uuid = entry.getKey();
182+
final OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
183+
final String playerName = player != null ? player.getName() : "No name";
184+
185+
broadcast(new MineDown(String.format("&c%s&r位 &a%s&r &c%s&r kills", entry.getValue(), playerName, records.personalBest(uuid))));
186+
});
187+
}
188+
167189
@Override
168190
public void reset() {
169191
if (getPhase() instanceof InGamePhase) setCurrentPhase(0);
@@ -178,7 +200,7 @@ public void reset() {
178200
}
179201

180202
public void sendMessageSpectators(GameUser user, String message) {
181-
getPlayers(GameUser.class).forEach(onlineUser -> {
203+
getGameUsers().forEach(onlineUser -> {
182204
if (isSpectator(onlineUser)) onlineUser.sendMessage(new MineDown(String.format("[観戦者] %s: %s", user.getUsername(), message)));
183205
});
184206
}
@@ -197,7 +219,7 @@ public void rejoin(GameUser user) {
197219
final Player player = user.getPlayer();
198220
final ItemStack chestPlate = player.getInventory().getChestplate();
199221
if (chestPlate == null) return;
200-
if (chestPlate.getType() == Material.ELYTRA) {
222+
if (chestPlate.getType() == Material.ELYTRA || player.getGameMode() == GameMode.SPECTATOR) {
201223
player.getInventory().setChestplate(null);
202224
player.getInventory().addItem(ItemBuilder.of(Material.BREAD).amount(20).build());
203225
player.getPassengers().forEach(player::removePassenger);
@@ -239,6 +261,18 @@ private Set<GameUser> getTeamUsers(GameUser user) {
239261
return team.getEntries().stream().map(Bukkit::getPlayer).filter(Objects::nonNull).map(GameUserManager::getGameUser).collect(Collectors.toSet());
240262
}
241263

264+
public int getAlivePlayersSize() {
265+
final AtomicInteger playersSize = new AtomicInteger();
266+
aliveTeams.forEach(team -> {
267+
for (String playerName : team.getEntries()) {
268+
if (deadPlayers.contains(playerName)) continue;
269+
playersSize.incrementAndGet();
270+
}
271+
});
272+
273+
return playersSize.get();
274+
}
275+
242276
@Override
243277
public @NotNull Phase[] getPhases() {
244278
return new Phase[]{

0 commit comments

Comments
 (0)