2525import org .jetbrains .annotations .NotNull ;
2626
2727import java .util .*;
28+ import java .util .concurrent .atomic .AtomicInteger ;
2829import java .util .stream .Collectors ;
2930
3031public 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