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(); 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. * Returns the amount of played floors in this game.
* *
@ -154,6 +186,13 @@ public interface Game {
*/ */
boolean isEmpty(); 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. * Deletes this game.
*/ */

View File

@ -93,6 +93,7 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
@ -814,4 +815,18 @@ public class DungeonsXL extends DREPlugin implements DungeonsAPI {
return true; 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.sign.windup.MobSign;
import de.erethon.dungeonsxl.trigger.ProgressTrigger; import de.erethon.dungeonsxl.trigger.ProgressTrigger;
import de.erethon.dungeonsxl.world.DGameWorld; import de.erethon.dungeonsxl.world.DGameWorld;
import de.erethon.dungeonsxl.world.DResourceWorld;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
@ -47,11 +48,15 @@ public class DGame implements Game {
private DungeonsXL plugin; 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 tutorial;
private boolean test; private boolean test;
private List<PlayerGroup> groups = new ArrayList<>();
private boolean started; private boolean started;
private GameWorld world;
private int waveCount; private int waveCount;
private Map<String, Integer> gameKills = new HashMap<>(); private Map<String, Integer> gameKills = new HashMap<>();
private Map<String, Integer> waveKills = new HashMap<>(); private Map<String, Integer> waveKills = new HashMap<>();
@ -60,6 +65,10 @@ public class DGame implements Game {
this.plugin = plugin; this.plugin = plugin;
plugin.getGameCache().add(this); plugin.getGameCache().add(this);
dungeon = group.getDungeon();
if (dungeon == null) {
throw new IllegalStateException("Game initialized without dungeon");
}
tutorial = false; tutorial = false;
started = false; started = false;
@ -70,9 +79,13 @@ public class DGame implements Game {
this.plugin = plugin; this.plugin = plugin;
plugin.getGameCache().add(this); plugin.getGameCache().add(this);
this.world = world;
dungeon = world.getDungeon();
if (dungeon == null) {
throw new IllegalStateException("Game initialized without dungeon");
}
tutorial = false; tutorial = false;
started = false; started = false;
this.world = world;
addGroup(group); addGroup(group);
} }
@ -83,6 +96,10 @@ public class DGame implements Game {
this.groups = groups; this.groups = groups;
this.world = world; this.world = world;
dungeon = world.getDungeon();
if (dungeon == null) {
throw new IllegalStateException("Game initialized without dungeon");
}
tutorial = false; tutorial = false;
started = true; started = true;
@ -135,8 +152,47 @@ public class DGame implements Game {
} }
@Override @Override
public GameWorld getWorld() { public Dungeon getDungeon() {
return world; 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 @Override
@ -144,6 +200,39 @@ public class DGame implements Game {
world = gameWorld; 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 @Override
public boolean hasRewards() { public boolean hasRewards() {
return test; return test;
@ -154,38 +243,6 @@ public class DGame implements Game {
test = enabled; 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 * @return the waveCount
*/ */
@ -254,6 +311,32 @@ public class DGame implements Game {
return groups.isEmpty(); 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 @Override
public void delete() { public void delete() {
GameSign gameSign = GameSign.getByGame(plugin, this); 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.item.VanillaItem;
import de.erethon.caliburn.mob.VanillaMob; import de.erethon.caliburn.mob.VanillaMob;
import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.Requirement;
import de.erethon.dungeonsxl.api.Reward; 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.Game;
import de.erethon.dungeonsxl.api.dungeon.GameGoal; import de.erethon.dungeonsxl.api.dungeon.GameGoal;
import de.erethon.dungeonsxl.api.dungeon.GameRule; 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.GamePlayerDeathEvent;
import de.erethon.dungeonsxl.api.event.player.GamePlayerFinishEvent; import de.erethon.dungeonsxl.api.event.player.GamePlayerFinishEvent;
import de.erethon.dungeonsxl.api.event.player.GlobalPlayerRewardPayOutEvent; 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.mob.DungeonMob;
import de.erethon.dungeonsxl.api.player.GamePlayer; import de.erethon.dungeonsxl.api.player.GamePlayer;
import de.erethon.dungeonsxl.api.player.PlayerClass; 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); resetClassInventoryOnRespawn = rules.getState(GameRule.RESET_CLASS_INVENTORY_ON_RESPAWN);
if (rules.getState(GameRule.GROUP_TAG_ENABLED)) {
initDGroupTag();
}
Location teleport = world.getLobbyLocation(); Location teleport = world.getLobbyLocation();
if (teleport == null) { if (teleport == null) {
player.teleport(world.getWorld().getSpawnLocation()); player.teleport(world.getWorld().getSpawnLocation());
@ -512,17 +519,11 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer {
ready = true; ready = true;
boolean start = true; boolean start = true;
for (PlayerGroup gameGroup : game.getGroups()) { if (!game.start()) {// TODO: Start for every player???
if (!gameGroup.isPlaying()) { start = false;
if (!((DGroup) gameGroup).startGame(game)) { } else {
start = false; respawn();
}
} else {
respawn();
}
} }
game.setStarted(true);
return start; 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. * The DGamePlayer finishs the current floor.
* *
@ -571,7 +628,7 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer {
if (!dGroup.isPlaying()) { if (!dGroup.isPlaying()) {
return; return;
} }
dGroup.setNextFloor(specifiedFloor); getGame().setNextFloor(specifiedFloor);
if (dGroup.isFinished()) { if (dGroup.isFinished()) {
dGroup.finishFloor(specifiedFloor); dGroup.finishFloor(specifiedFloor);
} else { } else {

View File

@ -17,7 +17,6 @@
package de.erethon.dungeonsxl.player; package de.erethon.dungeonsxl.player;
import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.Requirement;
import de.erethon.dungeonsxl.api.Reward; import de.erethon.dungeonsxl.api.Reward;
import de.erethon.dungeonsxl.api.dungeon.Dungeon; import de.erethon.dungeonsxl.api.dungeon.Dungeon;
import de.erethon.dungeonsxl.api.dungeon.Game; 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.GroupFinishFloorEvent;
import de.erethon.dungeonsxl.api.event.group.GroupPlayerJoinEvent; import de.erethon.dungeonsxl.api.event.group.GroupPlayerJoinEvent;
import de.erethon.dungeonsxl.api.event.group.GroupStartFloorEvent; 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.GlobalPlayer;
import de.erethon.dungeonsxl.api.player.InstancePlayer; import de.erethon.dungeonsxl.api.player.InstancePlayer;
import de.erethon.dungeonsxl.api.player.PlayerCache; 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.global.GroupSign;
import de.erethon.dungeonsxl.util.commons.chat.MessageUtil; import de.erethon.dungeonsxl.util.commons.chat.MessageUtil;
import de.erethon.dungeonsxl.util.commons.player.PlayerCollection; import de.erethon.dungeonsxl.util.commons.player.PlayerCollection;
import de.erethon.dungeonsxl.world.DGameWorld;
import de.erethon.dungeonsxl.world.DResourceWorld; import de.erethon.dungeonsxl.world.DResourceWorld;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -75,14 +73,11 @@ public class DGroup implements PlayerGroup {
private PlayerCollection players = new PlayerCollection(); private PlayerCollection players = new PlayerCollection();
private PlayerCollection invitedPlayers = new PlayerCollection(); private PlayerCollection invitedPlayers = new PlayerCollection();
private Dungeon dungeon; private Dungeon dungeon;
private List<ResourceWorld> unplayedFloors = new ArrayList<>();
private Game game; private Game game;
private GameWorld gameWorld; private GameWorld gameWorld;
private boolean playing; private boolean playing;
private int floorCount;
private List<Reward> rewards = new ArrayList<>(); private List<Reward> rewards = new ArrayList<>();
private BukkitTask timeIsRunningTask; private BukkitTask timeIsRunningTask;
private ResourceWorld nextFloor;
private Color color; private Color color;
private int score = 0; private int score = 0;
private int initialLives = -1; private int initialLives = -1;
@ -115,7 +110,6 @@ public class DGroup implements PlayerGroup {
} }
playing = false; playing = false;
floorCount = 0;
} }
public DGroup(DungeonsXL plugin, Player player, Dungeon dungeon) { public DGroup(DungeonsXL plugin, Player player, Dungeon dungeon) {
@ -151,9 +145,8 @@ public class DGroup implements PlayerGroup {
return; return;
} }
setDungeon(dungeon); this.dungeon = dungeon;
playing = false; playing = false;
floorCount = 0;
} }
// Getters and setters // Getters and setters
@ -357,75 +350,39 @@ public class DGroup implements PlayerGroup {
@Override @Override
public Dungeon getDungeon() { 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) { public void setDungeon(Dungeon dungeon) {
this.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 * @param name the name of the dungeon
* @return if the action was successful * @return if the action was successful
*/ */
public boolean setDungeon(String name) { public boolean setDungeon(String name) {
dungeon = plugin.getDungeonRegistry().get(name); return (dungeon = plugin.getDungeonRegistry().get(name)) != null;
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;
}
} }
public String getDungeonName() { public String getDungeonName() {
if (dungeon == null) { if (getDungeon() == null) {
return null; return null;
} }
return dungeon.getName(); return getDungeon().getName();
} }
public String getMapName() { public String getMapName() {
return gameWorld == null ? null : gameWorld.getName(); 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 @Override
public boolean isPlaying() { public boolean isPlaying() {
return playing; return playing;
@ -435,14 +392,6 @@ public class DGroup implements PlayerGroup {
this.playing = playing; this.playing = playing;
} }
public int getFloorCount() {
return floorCount;
}
public void setFloorCount(int floorCount) {
this.floorCount = floorCount;
}
@Override @Override
public List<Reward> getRewards() { public List<Reward> getRewards() {
return rewards; return rewards;
@ -480,14 +429,6 @@ public class DGroup implements PlayerGroup {
return !name.matches("Group#[0-9]{1,}"); 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. * Returns the color that represents this group.
* *
@ -624,15 +565,17 @@ public class DGroup implements PlayerGroup {
getDGamePlayers().forEach(p -> p.leave(false)); getDGamePlayers().forEach(p -> p.leave(false));
} }
// TODO: Move code to more appropriate classes
/** /**
* The group finishs the current floor. * The group finishs the current floor.
* *
* @param specifiedFloor the name of the next floor * @param specifiedFloor the name of the next floor
*/ */
public void finishFloor(DResourceWorld specifiedFloor) { public void finishFloor(DResourceWorld specifiedFloor) {
Game game = getGame();
DungeonConfig dConfig = ((DDungeon) dungeon).getConfig(); DungeonConfig dConfig = ((DDungeon) dungeon).getConfig();
int floorsLeft = getDungeon().getFloors().size() - floorCount; //floorCount contains start floor, but dungeon floor list doesn't int floorsLeft = getDungeon().getFloors().size() - game.getFloorCount(); //floorCount contains start floor, but dungeon floor list doesn't
removeUnplayedFloor((DResourceWorld) gameWorld.getResource(), false); game.removeUnplayedFloor((DResourceWorld) gameWorld.getResource(), false);
ResourceWorld newFloor = null; ResourceWorld newFloor = null;
GameWorld.Type type = null; GameWorld.Type type = null;
if (gameWorld.getType() == GameWorld.Type.END_FLOOR) { if (gameWorld.getType() == GameWorld.Type.END_FLOOR) {
@ -643,7 +586,7 @@ public class DGroup implements PlayerGroup {
type = GameWorld.Type.DEFAULT; type = GameWorld.Type.DEFAULT;
} else if (floorsLeft > 0) { } else if (floorsLeft > 0) {
int random = new Random().nextInt(floorsLeft); int random = new Random().nextInt(floorsLeft);
newFloor = getUnplayedFloors().get(random); newFloor = game.getUnplayedFloors().get(random);
type = GameWorld.Type.DEFAULT; type = GameWorld.Type.DEFAULT;
} else { } else {
newFloor = dConfig.getEndFloor(); newFloor = dConfig.getEndFloor();
@ -656,7 +599,6 @@ public class DGroup implements PlayerGroup {
return; return;
} }
Game game = getGame();
GameWorld gameWorld = newFloor.instantiateGameWorld(true); GameWorld gameWorld = newFloor.instantiateGameWorld(true);
gameWorld.setType(type); gameWorld.setType(type);
this.gameWorld = gameWorld; this.gameWorld = gameWorld;
@ -670,7 +612,7 @@ public class DGroup implements PlayerGroup {
} }
player.setFinished(false); player.setFinished(false);
} }
startGame(game); game.start();
} }
@Override @Override
@ -699,122 +641,52 @@ public class DGroup implements PlayerGroup {
plugin.getGroupAdapters().forEach(a -> a.deleteCorrespondingGroup(this)); plugin.getGroupAdapters().forEach(a -> a.deleteCorrespondingGroup(this));
} }
public boolean startGame(Game game) { public boolean startGame(Game game, int index) {
if (game == null) { 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; return false;
} }
GameRuleContainer rules = game.getRules();
((DGameWorld) gameWorld).setWeather(rules);
if (color == null) { GroupStartFloorEvent event = new GroupStartFloorEvent(this, getGameWorld());
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);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) { if (event.isCancelled()) {
return false; return false;
} }
playing = true; 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); plugin.getGlobalProtectionCache().updateGroupSigns(this);
nextFloor = null;
GameRuleContainer rules = getDungeon().getRules();
initialLives = rules.getState(GameRule.INITIAL_GROUP_LIVES); initialLives = rules.getState(GameRule.INITIAL_GROUP_LIVES);
lives = initialLives; 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; return true;
} }

View File

@ -16,16 +16,21 @@
*/ */
package de.erethon.dungeonsxl.sign.button; package de.erethon.dungeonsxl.sign.button;
import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.DungeonsAPI; import de.erethon.dungeonsxl.api.DungeonsAPI;
import de.erethon.dungeonsxl.api.player.GamePlayer; 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.sign.Button;
import de.erethon.dungeonsxl.api.world.InstanceWorld; import de.erethon.dungeonsxl.api.world.InstanceWorld;
import de.erethon.dungeonsxl.config.DMessage; import de.erethon.dungeonsxl.config.DMessage;
import de.erethon.dungeonsxl.player.DGamePlayer;
import de.erethon.dungeonsxl.player.DPermission; import de.erethon.dungeonsxl.player.DPermission;
import de.erethon.dungeonsxl.trigger.InteractTrigger; import de.erethon.dungeonsxl.trigger.InteractTrigger;
import de.erethon.dungeonsxl.util.commons.misc.NumberUtil; import de.erethon.dungeonsxl.util.commons.misc.NumberUtil;
import de.erethon.dungeonsxl.util.commons.misc.ProgressBar; import de.erethon.dungeonsxl.util.commons.misc.ProgressBar;
import de.erethon.dungeonsxl.world.DGameWorld; import de.erethon.dungeonsxl.world.DGameWorld;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -116,9 +121,7 @@ public class ReadySign extends Button {
bar.cancel(); bar.cancel();
} }
for (Player player : getGame().getPlayers()) { readyAll();
ready(api.getPlayerCache().getGamePlayer(player));
}
} }
@Override @Override
@ -143,6 +146,23 @@ public class ReadySign extends Button {
return true; 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) { private void ready(GamePlayer player) {
if (player == null || player.isReady()) { if (player == null || player.isReady()) {
return; return;

View File

@ -21,7 +21,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target> <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> </properties>
<dependencies> <dependencies>
<dependency> <dependency>