001package fr.aumgn.dac2.game.training; 002 003import java.util.ArrayList; 004import java.util.List; 005import java.util.Map; 006import java.util.Map.Entry; 007 008import org.bukkit.World; 009import org.bukkit.command.CommandSender; 010import org.bukkit.entity.Player; 011 012import fr.aumgn.bukkitutils.localization.PluginMessages; 013import fr.aumgn.bukkitutils.playerref.PlayerRef; 014import fr.aumgn.bukkitutils.playerref.map.PlayersRefHashMap; 015import fr.aumgn.bukkitutils.playerref.map.PlayersRefMap; 016import fr.aumgn.dac2.DAC; 017import fr.aumgn.dac2.arena.regions.Pool; 018import fr.aumgn.dac2.game.AbstractGame; 019import fr.aumgn.dac2.game.GameParty; 020import fr.aumgn.dac2.game.start.GameStartData; 021import fr.aumgn.dac2.game.start.PlayerStartData; 022import fr.aumgn.dac2.shape.column.Column; 023import fr.aumgn.dac2.shape.column.ColumnPattern; 024import fr.aumgn.dac2.shape.column.GlassyPattern; 025 026public class Training extends AbstractGame { 027 028 private GameParty<TrainingPlayer> party; 029 private PlayersRefMap<TrainingPlayer> playersMap; 030 031 public Training(DAC dac, GameStartData data) { 032 super(dac, data); 033 034 Map<PlayerRef, ? extends PlayerStartData> playersData = 035 data.getPlayersData(); 036 List<TrainingPlayer> list = 037 new ArrayList<TrainingPlayer>(playersData.size()); 038 playersMap = new PlayersRefHashMap<TrainingPlayer>(); 039 040 for (Entry<PlayerRef, ? extends PlayerStartData> entry : 041 playersData.entrySet()) { 042 PlayerRef playerId = entry.getKey(); 043 TrainingPlayer player = 044 new TrainingPlayer(playerId, entry.getValue()); 045 list.add(player); 046 playersMap.put(playerId, player); 047 } 048 party = new GameParty<TrainingPlayer>(this, TrainingPlayer.class, 049 list); 050 } 051 052 @Override 053 public void start() { 054 resetPoolOnStart(); 055 send("training.start"); 056 nextTurn(); 057 } 058 059 private void nextTurn() { 060 TrainingPlayer player = party.nextTurn(); 061 tpBeforeJump(player); 062 send("training.playerturn", player.getDisplayName()); 063 } 064 065 @Override 066 public void stop(boolean force) { 067 resetPoolOnEnd(); 068 for (TrainingPlayer player : party.iterable()) { 069 player.sendStats(dac.getMessages()); 070 } 071 } 072 073 @Override 074 public boolean contains(Player player) { 075 return playersMap.containsKey(player); 076 } 077 078 @Override 079 public void sendMessage(String message) { 080 for (TrainingPlayer player : party.iterable()) { 081 player.sendMessage(message); 082 } 083 sendSpectators(message); 084 } 085 086 @Override 087 public boolean isPlayerTurn(Player player) { 088 TrainingPlayer trainingPlayer = playersMap.get(player); 089 return trainingPlayer != null && party.isTurn(trainingPlayer); 090 } 091 092 @Override 093 public void onJumpSuccess(Player player) { 094 TrainingPlayer trainingPlayer = playersMap.get(player); 095 World world = arena.getWorld(); 096 Pool pool = arena.getPool(); 097 098 Column column = pool.getColumn(player); 099 ColumnPattern pattern = trainingPlayer.getColumnPattern(); 100 101 if (column.isADAC(world)) { 102 send("training.jump.dac", trainingPlayer.getDisplayName()); 103 trainingPlayer.incrementDacs(); 104 pattern = new GlassyPattern(pattern); 105 } else { 106 send("training.jump.success", trainingPlayer.getDisplayName()); 107 trainingPlayer.incrementSuccesses(); 108 } 109 110 column.set(world, pattern); 111 if (pool.isFilled(world)) { 112 pool.reset(world); 113 } 114 tpAfterJumpSuccess(trainingPlayer, column); 115 nextTurn(); 116 } 117 118 @Override 119 public void onJumpFail(Player player) { 120 TrainingPlayer trainingPlayer = playersMap.get(player); 121 send("training.jump.fail", trainingPlayer.getDisplayName()); 122 trainingPlayer.incrementFails(); 123 124 tpAfterJumpFail(trainingPlayer); 125 nextTurn(); 126 } 127 128 @Override 129 public void onQuit(Player player) { 130 TrainingPlayer trainingPlayer = playersMap.get(player); 131 party.removePlayer(trainingPlayer); 132 playersMap.remove(player); 133 trainingPlayer.sendStats(dac.getMessages()); 134 } 135 136 @Override 137 public void list(CommandSender sender) { 138 PluginMessages messages = dac.getMessages(); 139 140 sender.sendMessage(messages.get("training.playerslist")); 141 for (TrainingPlayer player : party.iterable()) { 142 sender.sendMessage(messages.get("training.playerentry", 143 player.getIndex(), player.getDisplayName(), 144 player.getSuccesses(), player.getDacs(), 145 player.getFails())); 146 } 147 } 148}