diff --git a/src/main/java/com/biel/lobby/mapes/Joc.java b/src/main/java/com/biel/lobby/mapes/Joc.java index 393f27f..e36b1e0 100644 --- a/src/main/java/com/biel/lobby/mapes/Joc.java +++ b/src/main/java/com/biel/lobby/mapes/Joc.java @@ -3,10 +3,7 @@ import java.lang.reflect.InvocationTargetException; import java.time.Duration; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; +import java.util.*; import java.util.stream.Collectors; import org.bukkit.*; @@ -70,7 +67,10 @@ public abstract class Joc extends MapaResetejable { protected boolean won = false; protected boolean unfairFlag = false; protected String host; - + protected boolean allowRejoin = false; + + private HashMap Players = new HashMap<>(); + //--Other-- private Boolean blockBreakPlace = false; private Boolean giveStartingItemsRespawn = false; @@ -118,25 +118,82 @@ public void setDefaultGameRules(){ setCustomGameRules(); } protected abstract void setCustomGameRules(); - public void JocIniciat(){ - if (JocIniciat){Bukkit.broadcastMessage("S'ha intentat iniciar una partida que ja estava iniciada. Operació anul·lada!"); return;} + + protected HashMap savePlayersForRejoin() { + + HashMap players = new HashMap<>(); + + for(Player p: getPlayers()) { + ArrayList pl = new ArrayList<>(); + pl.add(p.getUniqueId()); + players.put(p.getName(), pl); + } + + return players; + + } + + protected void onPlayerRejoin(Player p) { + + p.sendMessage(ChatColor.AQUA + "Benvingut de nou!"); + p.getInventory().clear(); + customPlayerRejoin(p); + + } + + protected void customPlayerRejoin(Player p) { + p.teleport(world.getSpawnLocation()); + } + + protected boolean canPlayerRejoin(Player p) { + + for(String s: Players.keySet()) { + + ArrayList list = Players.get(s); + if(list.contains(p.getUniqueId())) return true; + + } + + return false; + + } + + public boolean getAllowRejoin(){ + return allowRejoin; + } + public void setAllowRejoin(boolean b) { + allowRejoin = b; + } + + public void JocIniciat() { + + // Prevent starting the game if already started + if (JocIniciat) return; + + // Broadcast game start Bukkit.broadcastMessage(getGameDisplayName() + "S'ha iniciat la partida!"); + + // Save start status and enable pbp JocIniciat = true; - //--- - customJocIniciat(); world.setPVP(true); + + // Setup game + customJocIniciat(); donarItemsInicials(); teletransportarTothom(); establirTempsInicial(); resetHeartbeat(); - //--- + updateScoreBoards(); + sendGameInfo(); + + // Save match data matchData = MatchData.registerStart(this); for(Player p : getPlayers()){ getPlayerInfo(p); } - updateScoreBoards(); - sendGameInfo(); - //sendGlobalMessage("W:" + getWorld().getName()); + + // Save players for rejoin later + Players = savePlayersForRejoin(); } @@ -326,29 +383,44 @@ public void setHost(String name){ public boolean hasHostPrivilleges(Player p){ return host.equalsIgnoreCase(p.getName()); } + @Override public void Join(Player ply) { - // TODO Auto-generated method stub - if(canJoin(ply)){ - if(getPlayers().size() == 0)setHost(ply); + + if(getGameState() == GameState.InGame && canPlayerRejoin(ply)) { + onPlayerRejoin(ply); + return; } + + if(canJoin(ply)) { + + if(getPlayers().size() == 0) setHost(ply); + } + super.Join(ply); } public boolean canJoin(Player ply) { + switch (getGameState()){ - case Complete: - return false; - case Editant: - return ply.isOp(); - case InGame: - return getAllowSpectators(); - case Preparing: - return true; - case Resetejant: - return false; - case WaitingForPlayers: - return true; + + case Complete: + return false; + + case Editant: + return ply.isOp(); + + case InGame: + return getAllowSpectators(); + + case Preparing: + return true; + + case Resetejant: + return false; + + case WaitingForPlayers: + return true; } return true; @@ -462,7 +534,7 @@ private void teleportCameraRandomly(Player p) { public void addSpectator(Player ply){ for (Player p : getPlayers()) { - p.sendMessage(getGameDisplayName() + ply.getName() + " ha entrar com a espectador"); + p.sendMessage(getGameDisplayName() + ply.getName() + " ha entrat com a espectador"); } if (!getSpectators().contains(ply)){ Espectadors.add(ply); @@ -638,16 +710,19 @@ public void planificarReseteig(int delay){ @Override protected void customJoin(Player ply){ - //getPlayerInfo(ply); + Utils.clearPlayer(ply); if (getGameState() == GameState.InGame) { - + + if(canPlayerRejoin(ply)) { + onPlayerRejoin(ply); + return; + } addSpectator(ply); } else { sendGlobalMessage(getGameDisplayName() + ply.getName() + " ha entrat al joc"); donarItemsPreparatiusGenerals(ply); - } updateScoreBoard(ply); diff --git a/src/main/java/com/biel/lobby/mapes/JocEquips.java b/src/main/java/com/biel/lobby/mapes/JocEquips.java index 2160419..0ba6076 100644 --- a/src/main/java/com/biel/lobby/mapes/JocEquips.java +++ b/src/main/java/com/biel/lobby/mapes/JocEquips.java @@ -5,9 +5,7 @@ import java.text.MessageFormat; import java.time.Duration; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import org.bukkit.Bukkit; @@ -78,6 +76,36 @@ protected void customJocIniciat() { updateScoreBoards(); } + + // Rejoin + @Override + protected HashMap savePlayersForRejoin() { + + HashMap players = new HashMap<>(); + + for (Equip e : Equips) { + ArrayList pl = new ArrayList<>(); + + for (Player p: e.getPlayers()) { + pl.add(p.getUniqueId()); + } + + players.put(e.getAdjectiu(), pl); + } + + return players; + + } + + @Override + protected void customPlayerRejoin(Player p) { + + fixarSpawn(p); + p.teleport(obtenirEquip(p).getTeamSpawnLocation()); + Utils.donarItemsPlayer(p, getStartingItems(p)); + + } + public void winGame(Equip e){ //TODO if(won)return; if(e == null){ @@ -201,31 +229,31 @@ public void updateHeadColor(Player p){ Com.setHeadColor(p, ColorConverter.chatToRaw(e.getChatColor())); } } - public void establirEquipJugador(Player ply, Equip eq){ - if (!eq.getPlayers().contains(ply)){ - for (Equip e : Equips){ - if (e == eq){ - e.addPlayer(ply); - }else{ - e.removePlayer(ply); - } - } - - if(generationMode == TeamGenerationMode.RANDOM) { - - - } else { - sendGlobalMessage(getGameDisplayName() + ply.getName() + " és a l'equip " + eq.getChatColor() + eq.getAdjectiu()); + public void establirEquipJugador(Player ply, Equip eq) { + + if (eq.getPlayers().contains(ply)) return; + + for (Equip e : Equips){ + if (e == eq) { + e.addPlayer(ply); + }else{ + e.removePlayer(ply); } - - - - updateScoreBoards(); - ScoreBoardUpdater.updateTeamScore(this); - updateHeadColor(ply); - updateScoreBoards(); } + if(generationMode == TeamGenerationMode.RANDOM) { + + + } else { + sendGlobalMessage(getGameDisplayName() + ply.getName() + " és a l'equip " + eq.getChatColor() + eq.getAdjectiu()); + } + + + updateScoreBoards(); + ScoreBoardUpdater.updateTeamScore(this); + updateHeadColor(ply); + updateScoreBoards(); + } @SuppressWarnings("unchecked") public T obtenirEquip(Player ply, Class type){ diff --git a/src/main/java/com/biel/lobby/mapes/jocs/RainbowClay.java b/src/main/java/com/biel/lobby/mapes/jocs/RainbowClay.java index 8d95eac..4b36150 100644 --- a/src/main/java/com/biel/lobby/mapes/jocs/RainbowClay.java +++ b/src/main/java/com/biel/lobby/mapes/jocs/RainbowClay.java @@ -90,6 +90,7 @@ protected void customJocIniciat() { super.customJocIniciat(); setBlockBreakPlace(true); setGiveStartingItemsRespawn(true); + setAllowRejoin(true); } @Override