mirror of
https://github.com/DRE2N/DungeonsXL.git
synced 2024-09-27 15:22:40 +02:00
Rewrite game start code
This commit is contained in:
parent
fbb7fc2348
commit
cdf3906dc9
@ -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.
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
2
pom.xml
2
pom.xml
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user