package jk_5.nailed.server.map; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import jk_5.nailed.api.GameMode; import jk_5.nailed.api.chat.BaseComponent; import jk_5.nailed.api.map.GameManager; import jk_5.nailed.api.map.Map; import jk_5.nailed.api.map.Team; import jk_5.nailed.api.map.stat.StatManager; import jk_5.nailed.api.mappack.Mappack; import jk_5.nailed.api.player.Player; import jk_5.nailed.api.scoreboard.ScoreboardManager; import jk_5.nailed.api.world.World; import jk_5.nailed.server.map.game.NailedGameManager; import jk_5.nailed.server.map.stat.NailedStatManager; import jk_5.nailed.server.player.NailedPlayer; import jk_5.nailed.server.scoreboard.MapScoreboardManager; import net.minecraft.nbt.NBTTagList; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.File; import java.util.*; public class NailedMap implements Map { private final int id; private final Mappack mappack; private final File baseDir; private final Set<Player> players = new HashSet<Player>(); private World defaultWorld; private final MapScoreboardManager scoreboardManager; private final MapTeamManager teamManager; private final NailedGameManager gameManager; private final NailedStatManager statManager; public final HashMap<Player, NBTTagList> inventories = new HashMap<Player, NBTTagList>(); public NailedMap(int id, Mappack mappack, File baseDir) { this.id = id; this.mappack = mappack; this.baseDir = baseDir; this.scoreboardManager = new MapScoreboardManager(this); this.teamManager = new MapTeamManager(this); this.gameManager = new NailedGameManager(this); this.statManager = new NailedStatManager(this); } @Override public int id() { return this.id; } @Nonnull @Override public Collection<World> worlds() { List<World> worlds = NailedMapLoader.instance().getWorldsForMap(this); if(worlds != null){ return ImmutableList.copyOf(worlds); }else{ return Collections.emptyList(); } } @Nonnull @Override public World[] worldsArray() { List<World> worlds = NailedMapLoader.instance().getWorldsForMap(this); if(worlds != null){ return worlds.toArray(new World[worlds.size()]); }else{ return new World[0]; } } @Nonnull @Override public World defaultWorld() { return defaultWorld; } @Nullable @Override public Mappack mappack() { return mappack; } @Override public void addWorld(@Nonnull World world) { NailedMapLoader.instance().addWorldToMap(world, this); if(world.getConfig().isDefault()){ defaultWorld = world; } } public void onPlayerJoined(Player player){ players.add(player); scoreboardManager.onPlayerJoined(player); teamManager.onPlayerJoined(player); } public void onPlayerLeft(Player player){ players.remove(player); scoreboardManager.onPlayerLeft(player); teamManager.onPlayerLeft(player); ((NailedPlayer) player).getEntity().fallDistance = 0; player.setGameMode(GameMode.ADVENTURE); //TODO: Maps default gamemode player.setAllowedToFly(false); } @Override public void broadcastChatMessage(BaseComponent... message) { for (Player player : players) { player.sendMessage(message); } } @Nonnull @Override public Collection<Player> players() { return ImmutableSet.copyOf(players); } @Nonnull @Override public ScoreboardManager getScoreboardManager() { return this.scoreboardManager; } @Nonnull @Override public GameManager getGameManager() { return this.gameManager; } @Nonnull @Override public StatManager getStatManager() { return this.statManager; } @Nullable @Override public Team getTeam(String name) { return teamManager.getTeam(name); } @Nullable @Override public Team getPlayerTeam(Player player) { return teamManager.getPlayerTeam(player); } @Override public void setPlayerTeam(@Nonnull Player player, @Nullable Team team) { teamManager.setPlayerTeam(player, team); } @Nonnull @Override public Collection<Team> getTeams() { return teamManager.getTeams(); } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("id", id) .add("mappack", mappack) .add("baseDir", baseDir) .toString(); } }