Rewrite game start code

This commit is contained in:
Daniel Saukel 2021-02-23 18:53:05 +01:00
parent fbb7fc2348
commit cdf3906dc9
7 changed files with 315 additions and 229 deletions

View File

@ -126,6 +126,38 @@ public interface Game {
*/
List<ResourceWorld> 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.
*/

View File

@ -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 <T> void log(String message, T t, Predicate<T> predicate) {
if (xlDevMode && !predicate.test(t)) {
throw new AssertionError(message);
}
}
}

View File

@ -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<ResourceWorld> unplayedFloors = new ArrayList<>();
private ResourceWorld nextFloor;
private int floorCount;
private List<PlayerGroup> groups = new ArrayList<>();
private boolean tutorial;
private boolean test;
private List<PlayerGroup> groups = new ArrayList<>();
private boolean started;
private GameWorld world;
private int waveCount;
private Map<String, Integer> gameKills = new HashMap<>();
private Map<String, Integer> 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<ResourceWorld> 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<ResourceWorld> getUnplayedFloors() {
List<ResourceWorld> 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);

View File

@ -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 {

View File

@ -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<ResourceWorld> unplayedFloors = new ArrayList<>();
private Game game;
private GameWorld gameWorld;
private boolean playing;
private int floorCount;
private List<Reward> 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<ResourceWorld> 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<Reward> 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;
}

View File

@ -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;

View File

@ -21,7 +21,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spigotVersion.latest>1.16.4-R0.1-SNAPSHOT</spigotVersion.latest>
<spigotVersion.latest>1.16.5-R0.1-SNAPSHOT</spigotVersion.latest>
</properties>
<dependencies>
<dependency>