Cleans and moves a lot of code
This commit is contained in:
150
src/main/java/net/knarcraft/blockhunt/util/SignsHelper.java
Normal file
150
src/main/java/net/knarcraft/blockhunt/util/SignsHelper.java
Normal file
@@ -0,0 +1,150 @@
|
||||
package net.knarcraft.blockhunt.util;
|
||||
|
||||
import net.knarcraft.blockhunt.MemoryStorage;
|
||||
import net.knarcraft.blockhunt.arena.Arena;
|
||||
import net.knarcraft.blockhunt.arena.ArenaState;
|
||||
import net.knarcraft.blockhunt.config.ConfigKey;
|
||||
import net.knarcraft.blockhunt.config.MessageKey;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.block.sign.Side;
|
||||
import org.bukkit.event.block.SignChangeEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public final class SignsHelper {
|
||||
|
||||
private SignsHelper() {
|
||||
|
||||
}
|
||||
|
||||
public static void createSign(SignChangeEvent event, String[] lines, Location location) {
|
||||
if (lines[1] != null) {
|
||||
if (lines[1].equalsIgnoreCase("leave")) {
|
||||
saveSign("leave", location);
|
||||
} else if (lines[1].equalsIgnoreCase("shop")) {
|
||||
saveSign("shop", location);
|
||||
} else {
|
||||
boolean saved = false;
|
||||
Arena arena = MemoryStorage.arenaMap.get(lines[1].toLowerCase());
|
||||
if (arena != null) {
|
||||
saveSign(arena.arenaName, location);
|
||||
saved = true;
|
||||
}
|
||||
|
||||
if (!saved) {
|
||||
MessageHelper.sendMessage(event.getPlayer(), MessageKey.ERROR_NO_ARENA, "name-" + lines[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void saveSign(String key, Location location) {
|
||||
boolean saved = false;
|
||||
int number = 1;
|
||||
while (!saved) {
|
||||
if (MemoryStorage.signs.getFileConfiguration().get(key + "_" + number) == null) {
|
||||
MemoryStorage.signs.getFileConfiguration().set(key + "_" + number + ".arenaName", key);
|
||||
MemoryStorage.signs.getFileConfiguration().set(key + "_" + number + ".location", location);
|
||||
MemoryStorage.signs.save();
|
||||
|
||||
saved = true;
|
||||
} else {
|
||||
number = number + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void removeSign(Location location) {
|
||||
//TODO: This seems really inefficient
|
||||
for (String sign : MemoryStorage.signs.getFileConfiguration().getKeys(false)) {
|
||||
Location signLocation = (Location) MemoryStorage.signs.getFileConfiguration().get(sign + ".location");
|
||||
if (signLocation != null && signLocation.equals(location)) {
|
||||
MemoryStorage.signs.getFileConfiguration().set(sign, null);
|
||||
MemoryStorage.signs.save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isSign(Location location) {
|
||||
//TODO: This seems really inefficient
|
||||
for (String sign : MemoryStorage.signs.getFileConfiguration().getKeys(false)) {
|
||||
Location loc = (Location) MemoryStorage.signs.getFileConfiguration().get(sign + ".location");
|
||||
if (loc == null) {
|
||||
throw new IllegalArgumentException("Sign location could not be loaded.");
|
||||
}
|
||||
if (loc.equals(location)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void updateSigns() {
|
||||
//TODO: Instead of this awful method of signs updating every second for no reason, it would be preferable for
|
||||
// sign changes to be directly triggered when its contents changes
|
||||
MemoryStorage.signs.load(); //TODO: This loads from disk once every second which seems unnecessary
|
||||
for (String sign : MemoryStorage.signs.getFileConfiguration().getKeys(false)) {
|
||||
Location location = (Location) MemoryStorage.signs.getFileConfiguration().get(sign + ".location");
|
||||
if (location == null) {
|
||||
throw new IllegalArgumentException("Sign location could not be loaded.");
|
||||
}
|
||||
if (location.getWorld() == null) {
|
||||
throw new IllegalArgumentException("Sign world is null!");
|
||||
}
|
||||
|
||||
// check if that area is actually loaded. If not move on.
|
||||
if (!location.getWorld().isChunkLoaded(location.getBlockX() >> 4, location.getBlockZ() >> 4)) {
|
||||
continue;
|
||||
}
|
||||
if (location.getBlock().getState() instanceof Sign signBlock) {
|
||||
String[] lines = signBlock.getSide(Side.FRONT).getLines();
|
||||
if (sign.contains("leave")) {
|
||||
drawSign(MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SIGN_LEAVE.getPath()), signBlock);
|
||||
} else if (sign.contains("shop")) {
|
||||
drawSign(MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SIGN_SHOP.getPath()), signBlock);
|
||||
} else {
|
||||
drawArenaSign(lines[1], signBlock);
|
||||
}
|
||||
} else {
|
||||
removeSign(location);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void drawArenaSign(String arenaName, Sign signBlock) {
|
||||
//TODO: Store the relationships between signs and arenas directly
|
||||
for (Arena arena : MemoryStorage.arenaMap.values()) {
|
||||
//Find the correct arena
|
||||
if (!arenaName.endsWith(arena.arenaName)) {
|
||||
continue;
|
||||
}
|
||||
if (arena.gameState.equals(ArenaState.WAITING)) {
|
||||
drawSign(MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SIGN_WAITING.getPath()), signBlock, arena);
|
||||
} else if (arena.gameState.equals(ArenaState.STARTING)) {
|
||||
drawSign(MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SIGN_STARTING.getPath()), signBlock, arena);
|
||||
} else if (arena.gameState.equals(ArenaState.IN_GAME)) {
|
||||
drawSign(MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SIGN_IN_GAME.getPath()), signBlock, arena);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void drawSign(List<String> signLines, Sign signBlock, Arena arena) {
|
||||
drawSign(signLines, signBlock, "arenaName-" + arena.arenaName, "players-" + arena.playersInArena.size(),
|
||||
"maxplayers-" + arena.maxPlayers, "timeleft-" + arena.timer);
|
||||
}
|
||||
|
||||
private static void drawSign(List<String> signLines, Sign signBlock, String... variables) {
|
||||
int lineCount = 0;
|
||||
for (String line : signLines) {
|
||||
if (lineCount <= 3) {
|
||||
signBlock.getSide(Side.FRONT).setLine(lineCount, MessageHelper.replaceAll(line, variables));
|
||||
}
|
||||
|
||||
lineCount = lineCount + 1;
|
||||
}
|
||||
signBlock.update();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user