diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/dungeon/Game.java b/api/src/main/java/de/erethon/dungeonsxl/api/dungeon/Game.java index a57305dc..3d8df7b2 100644 --- a/api/src/main/java/de/erethon/dungeonsxl/api/dungeon/Game.java +++ b/api/src/main/java/de/erethon/dungeonsxl/api/dungeon/Game.java @@ -126,6 +126,38 @@ public interface Game { */ List getUnplayedFloors(); + /** + * Adds a floor to the list of floors to play. + * + * @param unplayedFloor the resource world of the floor + * @return if the addition was successful + */ + boolean addUnplayedFloor(ResourceWorld unplayedFloor); + + /** + * Removes a floor from the list of floors to play. + * + * @param unplayedFloor the resource world of the floor + * @param force if the floor shall be removed even if the {@link #getDungeon() dungeon}'s floors are not to be + * {@link Dungeon#getRemoveWhenPlayed() removed when played.} + * @return if the removal was successful + */ + boolean removeUnplayedFloor(ResourceWorld unplayedFloor, boolean force); + + /** + * Returns the resource of the next floor to play. + * + * @return the resource of the next floor to play + */ + ResourceWorld getNextFloor(); + + /** + * Sets the next floor to play. + * + * @param floor the resource world of the floor + */ + void setNextFloor(ResourceWorld floor); + /** * Returns the amount of played floors in this game. * @@ -154,6 +186,13 @@ public interface Game { */ boolean isEmpty(); + /** + * Starts the game. This is what happens when the ready sign is triggered by everyone. + * + * @return if the game has started correctly + */ + boolean start(); + /** * Deletes this game. */ diff --git a/core/src/main/java/de/erethon/dungeonsxl/DungeonsXL.java b/core/src/main/java/de/erethon/dungeonsxl/DungeonsXL.java index cca11cde..70dd6250 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/DungeonsXL.java +++ b/core/src/main/java/de/erethon/dungeonsxl/DungeonsXL.java @@ -93,6 +93,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Predicate; import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.World; @@ -814,4 +815,18 @@ public class DungeonsXL extends DREPlugin implements DungeonsAPI { return true; } + private boolean xlDevMode = System.getProperty("XLDevMode") != null; + + public void log(String message) { + if (xlDevMode) { + MessageUtil.log(this, message); + } + } + + public void log(String message, T t, Predicate predicate) { + if (xlDevMode && !predicate.test(t)) { + throw new AssertionError(message); + } + } + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/dungeon/DGame.java b/core/src/main/java/de/erethon/dungeonsxl/dungeon/DGame.java index 42ce633c..f8a2ad22 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/dungeon/DGame.java +++ b/core/src/main/java/de/erethon/dungeonsxl/dungeon/DGame.java @@ -30,6 +30,7 @@ import de.erethon.dungeonsxl.player.DGroup; import de.erethon.dungeonsxl.sign.windup.MobSign; import de.erethon.dungeonsxl.trigger.ProgressTrigger; import de.erethon.dungeonsxl.world.DGameWorld; +import de.erethon.dungeonsxl.world.DResourceWorld; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -47,11 +48,15 @@ public class DGame implements Game { private DungeonsXL plugin; + private Dungeon dungeon; + private GameWorld world; + private List unplayedFloors = new ArrayList<>(); + private ResourceWorld nextFloor; + private int floorCount; + private List groups = new ArrayList<>(); private boolean tutorial; private boolean test; - private List groups = new ArrayList<>(); private boolean started; - private GameWorld world; private int waveCount; private Map gameKills = new HashMap<>(); private Map waveKills = new HashMap<>(); @@ -60,6 +65,10 @@ public class DGame implements Game { this.plugin = plugin; plugin.getGameCache().add(this); + dungeon = group.getDungeon(); + if (dungeon == null) { + throw new IllegalStateException("Game initialized without dungeon"); + } tutorial = false; started = false; @@ -70,9 +79,13 @@ public class DGame implements Game { this.plugin = plugin; plugin.getGameCache().add(this); + this.world = world; + dungeon = world.getDungeon(); + if (dungeon == null) { + throw new IllegalStateException("Game initialized without dungeon"); + } tutorial = false; started = false; - this.world = world; addGroup(group); } @@ -83,6 +96,10 @@ public class DGame implements Game { this.groups = groups; this.world = world; + dungeon = world.getDungeon(); + if (dungeon == null) { + throw new IllegalStateException("Game initialized without dungeon"); + } tutorial = false; started = true; @@ -135,8 +152,47 @@ public class DGame implements Game { } @Override - public GameWorld getWorld() { - return world; + public Dungeon getDungeon() { + return dungeon; + } + + /** + * Sets up all dungeon-related fields. + * + * @param dungeon the dungeon to set + */ + public void setDungeon(Dungeon dungeon) { + this.dungeon = dungeon; + if (dungeon.isMultiFloor()) { + unplayedFloors = new ArrayList<>(dungeon.getFloors()); + } + } + + /** + * Sets up all dungeon-related fields. + * + * @param name the name of the dungeon + * @return if the action was successful + */ + public boolean setDungeon(String name) { + dungeon = plugin.getDungeonRegistry().get(name); + if (dungeon != null) { + unplayedFloors = dungeon.getFloors(); + return true; + + } else { + ResourceWorld resource = plugin.getMapRegistry().get(name); + if (resource != null) { + dungeon = resource.getSingleFloorDungeon(); + return true; + } + return false; + } + } + + @Override + public DGameWorld getWorld() { + return (DGameWorld) world; } @Override @@ -144,6 +200,39 @@ public class DGame implements Game { world = gameWorld; } + @Override + public List getUnplayedFloors() { + return unplayedFloors; + } + + @Override + public boolean addUnplayedFloor(ResourceWorld unplayedFloor) { + return unplayedFloors.add(unplayedFloor); + } + + @Override + public boolean removeUnplayedFloor(ResourceWorld unplayedFloor, boolean force) { + if (getDungeon().getRemoveWhenPlayed() || force) { + return unplayedFloors.remove(unplayedFloor); + } + return false; + } + + @Override + public ResourceWorld getNextFloor() { + return nextFloor; + } + + @Override + public void setNextFloor(ResourceWorld floor) { + nextFloor = floor; + } + + @Override + public int getFloorCount() { + return floorCount; + } + @Override public boolean hasRewards() { return test; @@ -154,38 +243,6 @@ public class DGame implements Game { test = enabled; } - @Override - public List getUnplayedFloors() { - List unplayedFloors = null; - for (PlayerGroup group : groups) { - DGroup dGroup = (DGroup) group; - if (unplayedFloors == null || dGroup.getUnplayedFloors().size() < unplayedFloors.size()) { - unplayedFloors = dGroup.getUnplayedFloors(); - } - } - if (unplayedFloors == null) { - unplayedFloors = new ArrayList<>(); - } - return unplayedFloors; - } - - @Override - public int getFloorCount() { - int floorCount = 0; - for (PlayerGroup group : groups) { - DGroup dGroup = (DGroup) group; - if (dGroup.getFloorCount() > floorCount) { - floorCount = dGroup.getFloorCount(); - } - } - return floorCount; - } - - @Override - public Dungeon getDungeon() { - return groups.get(0).getDungeon(); - } - /** * @return the waveCount */ @@ -254,6 +311,32 @@ public class DGame implements Game { return groups.isEmpty(); } + @Override + public boolean start() { + getWorld().setWeather(getRules()); + + int i = 0; + for (PlayerGroup group : groups) { + if (group == null) { + continue; + } + if (!((DGroup) group).startGame(this, i++)) { + return false; // TODO: State of groups that are OK has already been changed + } + } + + if (getWorld() != null) { + if (!getWorld().isPlaying()) { + getWorld().startGame(); + } + } + + floorCount++; + nextFloor = null; + started = true; + return true; + } + @Override public void delete() { GameSign gameSign = GameSign.getByGame(plugin, this); diff --git a/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java b/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java index 8feeb925..164f21b8 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java +++ b/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java @@ -19,7 +19,9 @@ package de.erethon.dungeonsxl.player; import de.erethon.caliburn.item.VanillaItem; import de.erethon.caliburn.mob.VanillaMob; import de.erethon.dungeonsxl.DungeonsXL; +import de.erethon.dungeonsxl.api.Requirement; import de.erethon.dungeonsxl.api.Reward; +import de.erethon.dungeonsxl.api.dungeon.Dungeon; import de.erethon.dungeonsxl.api.dungeon.Game; import de.erethon.dungeonsxl.api.dungeon.GameGoal; import de.erethon.dungeonsxl.api.dungeon.GameRule; @@ -29,6 +31,7 @@ import de.erethon.dungeonsxl.api.event.group.GroupScoreEvent; import de.erethon.dungeonsxl.api.event.player.GamePlayerDeathEvent; import de.erethon.dungeonsxl.api.event.player.GamePlayerFinishEvent; import de.erethon.dungeonsxl.api.event.player.GlobalPlayerRewardPayOutEvent; +import de.erethon.dungeonsxl.api.event.requirement.RequirementDemandEvent; import de.erethon.dungeonsxl.api.mob.DungeonMob; import de.erethon.dungeonsxl.api.player.GamePlayer; import de.erethon.dungeonsxl.api.player.PlayerClass; @@ -104,6 +107,10 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer { resetClassInventoryOnRespawn = rules.getState(GameRule.RESET_CLASS_INVENTORY_ON_RESPAWN); + if (rules.getState(GameRule.GROUP_TAG_ENABLED)) { + initDGroupTag(); + } + Location teleport = world.getLobbyLocation(); if (teleport == null) { player.teleport(world.getWorld().getSpawnLocation()); @@ -512,17 +519,11 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer { ready = true; boolean start = true; - for (PlayerGroup gameGroup : game.getGroups()) { - if (!gameGroup.isPlaying()) { - if (!((DGroup) gameGroup).startGame(game)) { - start = false; - } - } else { - respawn(); - } + if (!game.start()) {// TODO: Start for every player??? + start = false; + } else { + respawn(); } - - game.setStarted(true); return start; } @@ -550,6 +551,62 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer { } } + public void startGame() { + Dungeon dungeon = getGame().getDungeon(); + GameRuleContainer rules = dungeon.getRules(); + getData().logTimeLastStarted(dungeon.getName()); + getData().setKeepInventoryAfterLogout(rules.getState(GameRule.KEEP_INVENTORY_ON_ESCAPE)); + + respawn(); + + if (plugin.getMainConfig().isSendFloorTitleEnabled()) { + String mapName = getGameWorld().getName(); + if (rules.getState(GameRule.TITLE) != null || rules.getState(GameRule.SUBTITLE) != null) { + String title = rules.getState(GameRule.TITLE) == null ? "" : rules.getState(GameRule.TITLE); + String subtitle = rules.getState(GameRule.SUBTITLE) == null ? "" : rules.getState(GameRule.SUBTITLE); + + MessageUtil.sendTitleMessage(player, title, subtitle, + rules.getState(GameRule.TITLE_FADE_IN), rules.getState(GameRule.TITLE_SHOW), rules.getState(GameRule.TITLE_FADE_OUT)); + + } else if (!dungeon.getName().equals(mapName)) { + MessageUtil.sendTitleMessage(player, "&b&l" + dungeon.getName().replaceAll("_", " "), "&4&l" + mapName.replaceAll("_", " ")); + + } else { + MessageUtil.sendTitleMessage(player, "&4&l" + mapName.replaceAll("_", " ")); + } + + if (rules.getState(GameRule.ACTION_BAR) != null) { + MessageUtil.sendActionBarMessage(player, rules.getState(GameRule.ACTION_BAR)); + } + + if (rules.getState(GameRule.CHAT) != null) { + MessageUtil.sendCenteredMessage(player, rules.getState(GameRule.CHAT)); + } + } + + for (Requirement requirement : rules.getState(GameRule.REQUIREMENTS)) { + RequirementDemandEvent requirementDemandEvent + = new RequirementDemandEvent(requirement, dungeon, player, rules.getState(GameRule.KEEP_INVENTORY_ON_ENTER)); + Bukkit.getPluginManager().callEvent(requirementDemandEvent); + if (requirementDemandEvent.isCancelled()) { + continue; + } + + if (!DPermission.hasPermission(player, DPermission.IGNORE_REQUIREMENTS)) { + requirement.demand(player); + } + } + + player.setGameMode(rules.getState(GameRule.GAME_MODE)); + + // Permission bridge + if (plugin.getPermissionProvider() != null) { + for (String permission : rules.getState(GameRule.GAME_PERMISSIONS)) { + plugin.getPermissionProvider().playerAddTransient(getGame().getWorld().getWorld().getName(), player, permission); + } + } + } + /** * The DGamePlayer finishs the current floor. * @@ -571,7 +628,7 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer { if (!dGroup.isPlaying()) { return; } - dGroup.setNextFloor(specifiedFloor); + getGame().setNextFloor(specifiedFloor); if (dGroup.isFinished()) { dGroup.finishFloor(specifiedFloor); } else { diff --git a/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java b/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java index 70f9f9ba..d951a52d 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java +++ b/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java @@ -17,7 +17,6 @@ package de.erethon.dungeonsxl.player; import de.erethon.dungeonsxl.DungeonsXL; -import de.erethon.dungeonsxl.api.Requirement; import de.erethon.dungeonsxl.api.Reward; import de.erethon.dungeonsxl.api.dungeon.Dungeon; import de.erethon.dungeonsxl.api.dungeon.Game; @@ -29,7 +28,7 @@ import de.erethon.dungeonsxl.api.event.group.GroupFinishDungeonEvent; import de.erethon.dungeonsxl.api.event.group.GroupFinishFloorEvent; import de.erethon.dungeonsxl.api.event.group.GroupPlayerJoinEvent; import de.erethon.dungeonsxl.api.event.group.GroupStartFloorEvent; -import de.erethon.dungeonsxl.api.event.requirement.RequirementDemandEvent; +import de.erethon.dungeonsxl.api.player.GamePlayer; import de.erethon.dungeonsxl.api.player.GlobalPlayer; import de.erethon.dungeonsxl.api.player.InstancePlayer; import de.erethon.dungeonsxl.api.player.PlayerCache; @@ -44,7 +43,6 @@ import de.erethon.dungeonsxl.dungeon.DungeonConfig; import de.erethon.dungeonsxl.global.GroupSign; import de.erethon.dungeonsxl.util.commons.chat.MessageUtil; import de.erethon.dungeonsxl.util.commons.player.PlayerCollection; -import de.erethon.dungeonsxl.world.DGameWorld; import de.erethon.dungeonsxl.world.DResourceWorld; import java.util.ArrayList; import java.util.Collection; @@ -75,14 +73,11 @@ public class DGroup implements PlayerGroup { private PlayerCollection players = new PlayerCollection(); private PlayerCollection invitedPlayers = new PlayerCollection(); private Dungeon dungeon; - private List unplayedFloors = new ArrayList<>(); private Game game; private GameWorld gameWorld; private boolean playing; - private int floorCount; private List rewards = new ArrayList<>(); private BukkitTask timeIsRunningTask; - private ResourceWorld nextFloor; private Color color; private int score = 0; private int initialLives = -1; @@ -115,7 +110,6 @@ public class DGroup implements PlayerGroup { } playing = false; - floorCount = 0; } public DGroup(DungeonsXL plugin, Player player, Dungeon dungeon) { @@ -151,9 +145,8 @@ public class DGroup implements PlayerGroup { return; } - setDungeon(dungeon); + this.dungeon = dungeon; playing = false; - floorCount = 0; } // Getters and setters @@ -357,75 +350,39 @@ public class DGroup implements PlayerGroup { @Override public Dungeon getDungeon() { - return dungeon; + return game != null ? game.getDungeon() : dungeon; } /** - * Sets up all dungeon-related fields. + * {@link #getDungeon()} ignores this if the group is in a game. * - * @param dungeon the dungeon to set + * @param dungeon dungeon to set */ public void setDungeon(Dungeon dungeon) { this.dungeon = dungeon; - if (dungeon.isMultiFloor()) { - unplayedFloors = new ArrayList<>(dungeon.getFloors()); - } } /** - * Sets up all dungeon-related fields. + * Sets the dungeon. * * @param name the name of the dungeon * @return if the action was successful */ public boolean setDungeon(String name) { - dungeon = plugin.getDungeonRegistry().get(name); - if (dungeon != null) { - unplayedFloors = dungeon.getFloors(); - return true; - - } else { - ResourceWorld resource = plugin.getMapRegistry().get(name); - if (resource != null) { - dungeon = resource.getSingleFloorDungeon(); - return true; - } - return false; - } + return (dungeon = plugin.getDungeonRegistry().get(name)) != null; } public String getDungeonName() { - if (dungeon == null) { + if (getDungeon() == null) { return null; } - return dungeon.getName(); + return getDungeon().getName(); } public String getMapName() { return gameWorld == null ? null : gameWorld.getName(); } - public List getUnplayedFloors() { - return unplayedFloors; - } - - /** - * @param unplayedFloor the unplayed floor to add - */ - public void addUnplayedFloor(DResourceWorld unplayedFloor) { - unplayedFloors.add(unplayedFloor); - } - - /** - * @param unplayedFloor the unplayed floor to remove - * @param force remove the floor even if removeWhenPlayed is disabled - */ - public void removeUnplayedFloor(DResourceWorld unplayedFloor, boolean force) { - if (getDungeon().getRemoveWhenPlayed() || force) { - unplayedFloors.remove(unplayedFloor); - } - } - @Override public boolean isPlaying() { return playing; @@ -435,14 +392,6 @@ public class DGroup implements PlayerGroup { this.playing = playing; } - public int getFloorCount() { - return floorCount; - } - - public void setFloorCount(int floorCount) { - this.floorCount = floorCount; - } - @Override public List getRewards() { return rewards; @@ -480,14 +429,6 @@ public class DGroup implements PlayerGroup { return !name.matches("Group#[0-9]{1,}"); } - public ResourceWorld getNextFloor() { - return nextFloor; - } - - public void setNextFloor(DResourceWorld floor) { - nextFloor = floor; - } - /** * Returns the color that represents this group. * @@ -624,15 +565,17 @@ public class DGroup implements PlayerGroup { getDGamePlayers().forEach(p -> p.leave(false)); } + // TODO: Move code to more appropriate classes /** * The group finishs the current floor. * * @param specifiedFloor the name of the next floor */ public void finishFloor(DResourceWorld specifiedFloor) { + Game game = getGame(); DungeonConfig dConfig = ((DDungeon) dungeon).getConfig(); - int floorsLeft = getDungeon().getFloors().size() - floorCount; //floorCount contains start floor, but dungeon floor list doesn't - removeUnplayedFloor((DResourceWorld) gameWorld.getResource(), false); + int floorsLeft = getDungeon().getFloors().size() - game.getFloorCount(); //floorCount contains start floor, but dungeon floor list doesn't + game.removeUnplayedFloor((DResourceWorld) gameWorld.getResource(), false); ResourceWorld newFloor = null; GameWorld.Type type = null; if (gameWorld.getType() == GameWorld.Type.END_FLOOR) { @@ -643,7 +586,7 @@ public class DGroup implements PlayerGroup { type = GameWorld.Type.DEFAULT; } else if (floorsLeft > 0) { int random = new Random().nextInt(floorsLeft); - newFloor = getUnplayedFloors().get(random); + newFloor = game.getUnplayedFloors().get(random); type = GameWorld.Type.DEFAULT; } else { newFloor = dConfig.getEndFloor(); @@ -656,7 +599,6 @@ public class DGroup implements PlayerGroup { return; } - Game game = getGame(); GameWorld gameWorld = newFloor.instantiateGameWorld(true); gameWorld.setType(type); this.gameWorld = gameWorld; @@ -670,7 +612,7 @@ public class DGroup implements PlayerGroup { } player.setFinished(false); } - startGame(game); + game.start(); } @Override @@ -699,122 +641,52 @@ public class DGroup implements PlayerGroup { plugin.getGroupAdapters().forEach(a -> a.deleteCorrespondingGroup(this)); } - public boolean startGame(Game game) { - if (game == null) { + public boolean startGame(Game game, int index) { + if (color == null) { + color = plugin.getMainConfig().getGroupColorPriority(index); + } + + boolean ready = true; + for (Player player : getMembers().getOnlinePlayers()) { + GamePlayer gamePlayer = plugin.getPlayerCache().getGamePlayer(player); + if (gamePlayer == null) { + gamePlayer = new DGamePlayer(plugin, player, getGameWorld()); + } + + if (!gamePlayer.isReady()) { + ready = false; + } + } + + if (!ready) { return false; } - GameRuleContainer rules = game.getRules(); - ((DGameWorld) gameWorld).setWeather(rules); - if (color == null) { - color = plugin.getMainConfig().getGroupColorPriority((game.getGroups().indexOf(this))); - } - - for (PlayerGroup group : game.getGroups()) { - DGroup dGroup = (DGroup) group; - if (dGroup == null) { - continue; - } - - boolean ready = true; - for (Player player : dGroup.getMembers().getOnlinePlayers()) { - DGamePlayer dPlayer = (DGamePlayer) dPlayers.getGamePlayer(player); - if (dPlayer == null) { - dPlayer = new DGamePlayer(plugin, player, gameWorld); - } - if (rules.getState(GameRule.GROUP_TAG_ENABLED)) { - dPlayer.initDGroupTag(); - } - if (!dPlayer.isReady()) { - ready = false; - } - } - - if (!ready) { - return false; - } - } - - GroupStartFloorEvent event = new GroupStartFloorEvent(this, gameWorld); + GroupStartFloorEvent event = new GroupStartFloorEvent(this, getGameWorld()); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { return false; } playing = true; - - if (gameWorld != null) { - if (!gameWorld.isPlaying()) { - ((DGameWorld) gameWorld).startGame(); - } - } - - floorCount++; - - for (Player player : players.getOnlinePlayers()) { - DGamePlayer dPlayer = (DGamePlayer) dPlayers.getGamePlayer(player); - if (dPlayer == null) { - continue; - } - dPlayer.getData().logTimeLastStarted(getDungeonName()); - dPlayer.getData().setKeepInventoryAfterLogout(rules.getState(GameRule.KEEP_INVENTORY_ON_ESCAPE)); - - dPlayer.respawn(); - - if (plugin.getMainConfig().isSendFloorTitleEnabled()) { - if (rules.getState(GameRule.TITLE) != null || rules.getState(GameRule.SUBTITLE) != null) { - String title = rules.getState(GameRule.TITLE) == null ? "" : rules.getState(GameRule.TITLE); - String subtitle = rules.getState(GameRule.SUBTITLE) == null ? "" : rules.getState(GameRule.SUBTITLE); - - MessageUtil.sendTitleMessage(player, title, subtitle, - rules.getState(GameRule.TITLE_FADE_IN), rules.getState(GameRule.TITLE_SHOW), rules.getState(GameRule.TITLE_FADE_OUT)); - - } else if (!getDungeonName().equals(getMapName())) { - MessageUtil.sendTitleMessage(player, "&b&l" + getDungeonName().replaceAll("_", " "), "&4&l" + getMapName().replaceAll("_", " ")); - - } else { - MessageUtil.sendTitleMessage(player, "&4&l" + getMapName().replaceAll("_", " ")); - } - - if (rules.getState(GameRule.ACTION_BAR) != null) { - MessageUtil.sendActionBarMessage(player, rules.getState(GameRule.ACTION_BAR)); - } - - if (rules.getState(GameRule.CHAT) != null) { - MessageUtil.sendCenteredMessage(player, rules.getState(GameRule.CHAT)); - } - } - - for (Requirement requirement : rules.getState(GameRule.REQUIREMENTS)) { - RequirementDemandEvent requirementDemandEvent - = new RequirementDemandEvent(requirement, dungeon, player, rules.getState(GameRule.KEEP_INVENTORY_ON_ENTER)); - Bukkit.getPluginManager().callEvent(event); - if (requirementDemandEvent.isCancelled()) { - continue; - } - - if (!DPermission.hasPermission(player, DPermission.IGNORE_REQUIREMENTS)) { - requirement.demand(player); - } - } - - player.setGameMode(rules.getState(GameRule.GAME_MODE)); - if (rules.getState(GameRule.TIME_TO_FINISH) != -1) { - timeIsRunningTask = new TimeIsRunningTask(plugin, this, rules.getState(GameRule.TIME_TO_FINISH)).runTaskTimer(plugin, 20, 20); - } - - // Permission bridge - if (plugin.getPermissionProvider() != null) { - for (String permission : rules.getState(GameRule.GAME_PERMISSIONS)) { - plugin.getPermissionProvider().playerRemoveTransient(gameWorld.getWorld().getName(), player, permission); - } - } - } - plugin.getGlobalProtectionCache().updateGroupSigns(this); - nextFloor = null; + + GameRuleContainer rules = getDungeon().getRules(); initialLives = rules.getState(GameRule.INITIAL_GROUP_LIVES); lives = initialLives; + if (rules.getState(GameRule.TIME_TO_FINISH) != -1) { + timeIsRunningTask = new TimeIsRunningTask(plugin, this, rules.getState(GameRule.TIME_TO_FINISH)).runTaskTimer(plugin, 20, 20); + } + + for (UUID playerId : getMembers()) { + GlobalPlayer player = plugin.getPlayerCache().get(playerId); + if (!(player instanceof DGamePlayer)) { + plugin.log("Player isn't a DGamePlayer"); + continue; + } + ((DGamePlayer) player).startGame(); + } + return true; } diff --git a/core/src/main/java/de/erethon/dungeonsxl/sign/button/ReadySign.java b/core/src/main/java/de/erethon/dungeonsxl/sign/button/ReadySign.java index 897e9c86..29feede0 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/sign/button/ReadySign.java +++ b/core/src/main/java/de/erethon/dungeonsxl/sign/button/ReadySign.java @@ -16,16 +16,21 @@ */ package de.erethon.dungeonsxl.sign.button; +import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.api.DungeonsAPI; import de.erethon.dungeonsxl.api.player.GamePlayer; +import de.erethon.dungeonsxl.api.player.PlayerGroup; import de.erethon.dungeonsxl.api.sign.Button; import de.erethon.dungeonsxl.api.world.InstanceWorld; import de.erethon.dungeonsxl.config.DMessage; +import de.erethon.dungeonsxl.player.DGamePlayer; import de.erethon.dungeonsxl.player.DPermission; import de.erethon.dungeonsxl.trigger.InteractTrigger; import de.erethon.dungeonsxl.util.commons.misc.NumberUtil; import de.erethon.dungeonsxl.util.commons.misc.ProgressBar; import de.erethon.dungeonsxl.world.DGameWorld; +import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.block.Sign; import org.bukkit.entity.Player; @@ -116,9 +121,7 @@ public class ReadySign extends Button { bar.cancel(); } - for (Player player : getGame().getPlayers()) { - ready(api.getPlayerCache().getGamePlayer(player)); - } + readyAll(); } @Override @@ -143,6 +146,23 @@ public class ReadySign extends Button { return true; } + private void readyAll() { + for (PlayerGroup group : getGame().getGroups()) { + for (UUID memberId : group.getMembers()) { + Player player = Bukkit.getPlayer(memberId); + if (player != null) { + GamePlayer gamePlayer = api.getPlayerCache().getGamePlayer(player); + if (gamePlayer == null) { + gamePlayer = new DGamePlayer((DungeonsXL) api, player, getGameWorld()); + } + ready(gamePlayer); + } else { + group.getMembers().remove(memberId); + } + } + } + } + private void ready(GamePlayer player) { if (player == null || player.isReady()) { return; diff --git a/pom.xml b/pom.xml index 2c6aadeb..72b82e61 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 1.8 - 1.16.4-R0.1-SNAPSHOT + 1.16.5-R0.1-SNAPSHOT