Direct play join signs. Resolves #451

This commit is contained in:
Daniel Saukel 2018-09-01 13:11:59 +02:00
parent 9c50677054
commit 7688d55766
5 changed files with 132 additions and 18 deletions

View File

@ -45,8 +45,8 @@ public class GameSign extends JoinSign {
private Game game; private Game game;
public GameSign(DungeonsXL plugin, int id, Block startSign, String identifier, int maxGroupsPerGame) { public GameSign(DungeonsXL plugin, int id, Block startSign, String identifier, int maxGroupsPerGame, int startIfElementsAtLeast) {
super(plugin, id, startSign, identifier, maxGroupsPerGame); super(plugin, id, startSign, identifier, maxGroupsPerGame, startIfElementsAtLeast);
} }
/** /**
@ -76,11 +76,17 @@ public class GameSign extends JoinSign {
Sign sign = (Sign) startSign.getState(); Sign sign = (Sign) startSign.getState();
if (game == null || game.getDGroups().isEmpty()) { if (game == null || game.getDGroups().isEmpty()) {
loadedWorld = false;
sign.setLine(0, DMessage.SIGN_GLOBAL_NEW_GAME.getMessage()); sign.setLine(0, DMessage.SIGN_GLOBAL_NEW_GAME.getMessage());
sign.update(); sign.update();
return; return;
} }
if (game.getDGroups().size() >= startIfElementsAtLeast && startIfElementsAtLeast != -1) {
loadedWorld = true;
game.getDGroups().forEach(g -> g.teleport());
}
if (game.getDGroups().get(0).isPlaying()) { if (game.getDGroups().get(0).isPlaying()) {
sign.setLine(0, DMessage.SIGN_GLOBAL_IS_PLAYING.getMessage()); sign.setLine(0, DMessage.SIGN_GLOBAL_IS_PLAYING.getMessage());
@ -122,6 +128,7 @@ public class GameSign extends JoinSign {
config.set(preString + ".dungeon", dungeon.getName()); config.set(preString + ".dungeon", dungeon.getName());
} }
config.set(preString + ".maxGroupsPerGame", maxElements); config.set(preString + ".maxGroupsPerGame", maxElements);
config.set(preString + ".startIfElementsAtLeast", startIfElementsAtLeast);
} }
public void onPlayerInteract(Block block, Player player) { public void onPlayerInteract(Block block, Player player) {
@ -209,12 +216,17 @@ public class GameSign extends JoinSign {
} }
String identifier = event.getLine(2); String identifier = event.getLine(2);
int maxGroupsPerGame = NumberUtil.parseInt(event.getLine(3), 1); String[] data = event.getLine(3).split(",");
int maxGroupsPerGame = NumberUtil.parseInt(data[0], 1);
int startIfElementsAtLeast = -1;
if (data.length > 1) {
startIfElementsAtLeast = NumberUtil.parseInt(data[1], -1);
}
return tryToCreate(plugin, event.getBlock(), identifier, maxGroupsPerGame); return tryToCreate(plugin, event.getBlock(), identifier, maxGroupsPerGame, startIfElementsAtLeast);
} }
public static GameSign tryToCreate(DungeonsXL plugin, Block startSign, String identifier, int maxGroupsPerGame) { public static GameSign tryToCreate(DungeonsXL plugin, Block startSign, String identifier, int maxGroupsPerGame, int startIfElementsAtLeast) {
World world = startSign.getWorld(); World world = startSign.getWorld();
BlockFace facing = ((Attachable) startSign.getState().getData()).getAttachedFace().getOppositeFace(); BlockFace facing = ((Attachable) startSign.getState().getData()).getAttachedFace().getOppositeFace();
int x = startSign.getX(), y = startSign.getY(), z = startSign.getZ(); int x = startSign.getX(), y = startSign.getY(), z = startSign.getZ();
@ -231,7 +243,7 @@ public class GameSign extends JoinSign {
verticalSigns--; verticalSigns--;
} }
GameSign sign = new GameSign(plugin, plugin.getGlobalProtectionCache().generateId(GameSign.class, world), startSign, identifier, maxGroupsPerGame); GameSign sign = new GameSign(plugin, plugin.getGlobalProtectionCache().generateId(GameSign.class, world), startSign, identifier, maxGroupsPerGame, startIfElementsAtLeast);
LWCUtil.removeProtection(startSign); LWCUtil.removeProtection(startSign);

View File

@ -185,9 +185,10 @@ public class GlobalProtectionCache {
if (data.contains(preString)) { if (data.contains(preString)) {
String mapName = data.getString(preString + ".dungeon"); String mapName = data.getString(preString + ".dungeon");
int maxGroupsPerGame = data.getInt(preString + ".maxGroupsPerGame"); int maxGroupsPerGame = data.getInt(preString + ".maxGroupsPerGame");
int startIfElementsAtLeast = data.getInt(preString + ".startIfElementsAtLeast");
Block startSign = world.getBlockAt(data.getInt(preString + ".x"), data.getInt(preString + ".y"), data.getInt(preString + ".z")); Block startSign = world.getBlockAt(data.getInt(preString + ".x"), data.getInt(preString + ".y"), data.getInt(preString + ".z"));
new GameSign(plugin, id, startSign, mapName, maxGroupsPerGame); new GameSign(plugin, id, startSign, mapName, maxGroupsPerGame, startIfElementsAtLeast);
} }
} while (data.contains(preString)); } while (data.contains(preString));
@ -205,9 +206,10 @@ public class GlobalProtectionCache {
String mapName = data.getString(preString + ".dungeon"); String mapName = data.getString(preString + ".dungeon");
String groupName = data.getString(preString + ".groupName"); String groupName = data.getString(preString + ".groupName");
int maxPlayersPerGroup = data.getInt(preString + ".maxPlayersPerGroup"); int maxPlayersPerGroup = data.getInt(preString + ".maxPlayersPerGroup");
int startIfElementsAtLeast = data.getInt(preString + ".startIfElementsAtLeast");
Block startSign = world.getBlockAt(data.getInt(preString + ".x"), data.getInt(preString + ".y"), data.getInt(preString + ".z")); Block startSign = world.getBlockAt(data.getInt(preString + ".x"), data.getInt(preString + ".y"), data.getInt(preString + ".z"));
new GroupSign(plugin, id, startSign, mapName, maxPlayersPerGroup, groupName); new GroupSign(plugin, id, startSign, mapName, maxPlayersPerGroup, startIfElementsAtLeast, groupName);
} }
} while (data.contains(preString)); } while (data.contains(preString));
} }

View File

@ -45,8 +45,8 @@ public class GroupSign extends JoinSign {
private String groupName; private String groupName;
private DGroup group; private DGroup group;
public GroupSign(DungeonsXL plugin, int id, Block startSign, String identifier, int maxPlayersPerGroup, String groupName) { public GroupSign(DungeonsXL plugin, int id, Block startSign, String identifier, int maxPlayersPerGroup, int startIfElementsAtLeast, String groupName) {
super(plugin, id, startSign, identifier, maxPlayersPerGroup); super(plugin, id, startSign, identifier, maxPlayersPerGroup, startIfElementsAtLeast);
this.groupName = groupName; this.groupName = groupName;
} }
@ -77,11 +77,17 @@ public class GroupSign extends JoinSign {
Sign sign = (Sign) startSign.getState(); Sign sign = (Sign) startSign.getState();
if (group == null) { if (group == null) {
loadedWorld = false;
sign.setLine(0, DMessage.SIGN_GLOBAL_NEW_GROUP.getMessage()); sign.setLine(0, DMessage.SIGN_GLOBAL_NEW_GROUP.getMessage());
sign.update(); sign.update();
return; return;
} }
if (group.getPlayers().size() >= startIfElementsAtLeast && startIfElementsAtLeast != -1 && !loadedWorld) {
loadedWorld = true;
group.teleport();
}
if (group.isPlaying()) { if (group.isPlaying()) {
sign.setLine(0, DMessage.SIGN_GLOBAL_IS_PLAYING.getMessage()); sign.setLine(0, DMessage.SIGN_GLOBAL_IS_PLAYING.getMessage());
@ -124,6 +130,7 @@ public class GroupSign extends JoinSign {
} }
config.set(preString + ".groupName", groupName); config.set(preString + ".groupName", groupName);
config.set(preString + ".maxPlayersPerGroup", maxElements); config.set(preString + ".maxPlayersPerGroup", maxElements);
config.set(preString + ".startIfElementsAtLeast", startIfElementsAtLeast);
} }
public void onPlayerInteract(Block block, Player player) { public void onPlayerInteract(Block block, Player player) {
@ -193,17 +200,21 @@ public class GroupSign extends JoinSign {
String[] data = event.getLine(3).split(","); String[] data = event.getLine(3).split(",");
int maxPlayersPerGroup = 1; int maxPlayersPerGroup = 1;
String groupName = null; String groupName = null;
int startIfElementsAtLeast = -1;
if (data.length >= 1) { if (data.length >= 1) {
maxPlayersPerGroup = NumberUtil.parseInt(data[0], 1); maxPlayersPerGroup = NumberUtil.parseInt(data[0], 1);
} }
if (data.length == 2) { if (data.length >= 2) {
groupName = data[1]; groupName = data[1];
} }
if (data.length == 3) {
startIfElementsAtLeast = NumberUtil.parseInt(data[2], -1);
}
return tryToCreate(plugin, event.getBlock(), identifier, maxPlayersPerGroup, groupName); return tryToCreate(plugin, event.getBlock(), identifier, maxPlayersPerGroup, startIfElementsAtLeast, groupName);
} }
public static GroupSign tryToCreate(DungeonsXL plugin, Block startSign, String identifier, int maxPlayersPerGroup, String groupName) { public static GroupSign tryToCreate(DungeonsXL plugin, Block startSign, String identifier, int maxPlayersPerGroup, int startIfElementsAtLeast, String groupName) {
World world = startSign.getWorld(); World world = startSign.getWorld();
BlockFace facing = ((Attachable) startSign.getState().getData()).getAttachedFace().getOppositeFace(); BlockFace facing = ((Attachable) startSign.getState().getData()).getAttachedFace().getOppositeFace();
int x = startSign.getX(), y = startSign.getY(), z = startSign.getZ(); int x = startSign.getX(), y = startSign.getY(), z = startSign.getZ();
@ -220,7 +231,8 @@ public class GroupSign extends JoinSign {
verticalSigns--; verticalSigns--;
} }
GroupSign sign = new GroupSign(plugin, plugin.getGlobalProtectionCache().generateId(GroupSign.class, world), startSign, identifier, maxPlayersPerGroup, groupName); GroupSign sign = new GroupSign(plugin, plugin.getGlobalProtectionCache().generateId(GroupSign.class, world), startSign, identifier, maxPlayersPerGroup,
startIfElementsAtLeast, groupName);
LWCUtil.removeProtection(startSign); LWCUtil.removeProtection(startSign);

View File

@ -33,11 +33,13 @@ public class JoinSign extends GlobalProtection {
protected Dungeon dungeon; protected Dungeon dungeon;
protected int maxElements; protected int maxElements;
protected int startIfElementsAtLeast = -1;
protected Block startSign; protected Block startSign;
protected int verticalSigns; protected int verticalSigns;
protected Set<Block> blocks; protected Set<Block> blocks;
protected boolean loadedWorld;
protected JoinSign(DungeonsXL plugin, int id, Block startSign, String identifier, int maxElements) { protected JoinSign(DungeonsXL plugin, int id, Block startSign, String identifier, int maxElements, int startIfElementsAtLeast) {
super(plugin, startSign.getWorld(), id); super(plugin, startSign.getWorld(), id);
this.startSign = startSign; this.startSign = startSign;
@ -52,6 +54,9 @@ public class JoinSign extends GlobalProtection {
verticalSigns = (int) Math.ceil((float) (1 + maxElements) / 4); verticalSigns = (int) Math.ceil((float) (1 + maxElements) / 4);
this.maxElements = maxElements; this.maxElements = maxElements;
if (startIfElementsAtLeast > 0 && startIfElementsAtLeast <= maxElements) {
this.startIfElementsAtLeast = startIfElementsAtLeast;
}
update(); update();
} }
@ -78,10 +83,33 @@ public class JoinSign extends GlobalProtection {
} }
/** /**
* @param maxElements the maximum element count per sign * @param amount the maximum element count per sign
*/ */
public void setMaxElements(int maxElements) { public void setMaxElements(int amount) {
this.maxElements = maxElements; maxElements = amount;
}
/**
* Returns the minimum amount of elements required to start the dungeon countdown
*
* @return the minimum amount of elements required to start the dungeon countdown;<br>
* -1 if the dungeon is not instantiated only through the sign.
*/
public int getStartIfElementsAtLeastAmount() {
return startIfElementsAtLeast;
}
/**
* Sets the minimum amount of elements required to start the dungeon countdown
*
* @param amount the amount to set
*/
public void setStartIfElementsAtLeastAmount(int amount) {
if ((amount > 0 || amount == -1) && amount < maxElements) {
startIfElementsAtLeast = amount;
} else {
throw new IllegalArgumentException("startIfElementsAtLeastAmount is < 0 or < maxElements");
}
} }
@Override @Override

View File

@ -44,6 +44,7 @@ import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
@ -609,6 +610,65 @@ public class DGroup {
} }
/* Actions */ /* Actions */
public boolean teleport() {
if (dungeon == null || dungeon.getMap() == null) {
sendMessage(DMessage.ERROR_DUNGEON_NOT_EXIST.getMessage());
return false;
}
DGameWorld target = dungeon.getMap().instantiateAsGameWorld(false);
Game game = Game.getByDGroup(this);
if (target == null && game != null) {
target = game.getWorld();
}
if (target == null) {
if (game != null) {
for (DGroup otherTeam : game.getDGroups()) {
if (otherTeam.getGameWorld() != null) {
target = otherTeam.getGameWorld();
break;
}
}
}
}
if (target == null && dungeon != null) {
DResourceWorld resource = dungeon.getMap();
if (resource != null) {
target = resource.instantiateAsGameWorld(false);
if (target == null) {
sendMessage(DMessage.ERROR_TOO_MANY_INSTANCES.getMessage());
return false;
}
gameWorld = target;
}
}
if (target == null) {
sendMessage(DMessage.ERROR_DUNGEON_NOT_EXIST.getMessage());
return false;
}
if (game == null) {
game = new Game(plugin, this, target);
} else {
game.setWorld(target);
gameWorld = target;
}
for (OfflinePlayer offline : players.getOfflinePlayers()) {
if (!offline.isOnline()) {
players.remove(offline);
}
Player player = offline.getPlayer();
new DGamePlayer(plugin, player, target);
}
return true;
}
/** /**
* The group finishs the dungeon. * The group finishs the dungeon.
*/ */