1.7.0 beta 6

This commit is contained in:
Tyler Murphy 2022-11-21 13:33:55 -05:00
parent 5615fa7f32
commit 1815b63bc9
14 changed files with 416 additions and 7 deletions

View file

@ -23,6 +23,9 @@ import net.tylermurphy.hideAndSeek.command.*;
import net.tylermurphy.hideAndSeek.command.map.*; import net.tylermurphy.hideAndSeek.command.map.*;
import net.tylermurphy.hideAndSeek.command.map.blockhunt.Enabled; import net.tylermurphy.hideAndSeek.command.map.blockhunt.Enabled;
import net.tylermurphy.hideAndSeek.command.map.set.*; import net.tylermurphy.hideAndSeek.command.map.set.*;
import net.tylermurphy.hideAndSeek.command.world.Create;
import net.tylermurphy.hideAndSeek.command.world.Delete;
import net.tylermurphy.hideAndSeek.command.world.Tp;
import net.tylermurphy.hideAndSeek.configuration.*; import net.tylermurphy.hideAndSeek.configuration.*;
import net.tylermurphy.hideAndSeek.database.Database; import net.tylermurphy.hideAndSeek.database.Database;
import net.tylermurphy.hideAndSeek.game.*; import net.tylermurphy.hideAndSeek.game.*;
@ -39,6 +42,7 @@ import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -56,16 +60,28 @@ public class Main extends JavaPlugin implements Listener {
private EntityHider entityHider; private EntityHider entityHider;
private Game game; private Game game;
private CommandGroup commandGroup; private CommandGroup commandGroup;
private boolean loaded;
public void onEnable() { public void onEnable() {
long start = System.currentTimeMillis();
getLogger().info("Loading Kenshin's Hide and Seek");
Main.instance = this; Main.instance = this;
this.updateVersion();
getLogger().info("Getting minecraft version...");
this.updateVersion();;
try { try {
getLogger().info("Loading config.yml...");
Config.loadConfig(); Config.loadConfig();
getLogger().info("Loading maps.yml...");
Maps.loadMaps(); Maps.loadMaps();
getLogger().info("Loading localization.yml...");
Localization.loadLocalization(); Localization.loadLocalization();
getLogger().info("Loading items.yml...");
Items.loadItems(); Items.loadItems();
getLogger().info("Loading leaderboard.yml...");
Leaderboard.loadLeaderboard(); Leaderboard.loadLeaderboard();
} catch (Exception e) { } catch (Exception e) {
getLogger().severe(e.getMessage()); getLogger().severe(e.getMessage());
@ -73,12 +89,18 @@ public class Main extends JavaPlugin implements Listener {
return; return;
} }
getLogger().info("Creating internal scoreboard...");
this.board = new Board(); this.board = new Board();
getLogger().info("Connecting to database...");
this.database = new Database(); this.database = new Database();
getLogger().info("Loading disguises...");
this.disguiser = new Disguiser(); this.disguiser = new Disguiser();
getLogger().info("Loading entity hider...");
this.entityHider = new EntityHider(this, EntityHider.Policy.BLACKLIST); this.entityHider = new EntityHider(this, EntityHider.Policy.BLACKLIST);
getLogger().info("Registering listeners...");
this.registerListeners(); this.registerListeners();
getLogger().info("Registering commands...");
this.commandGroup = new CommandGroup("hs", this.commandGroup = new CommandGroup("hs",
new Help(), new Help(),
new Reload(), new Reload(),
@ -111,21 +133,38 @@ public class Main extends JavaPlugin implements Listener {
new Debug(), new Debug(),
new GoTo() new GoTo()
), ),
new CommandGroup("world",
new Create(),
new Delete(),
new net.tylermurphy.hideAndSeek.command.world.List(),
new Tp()
),
new SetExitLocation(), new SetExitLocation(),
new Top(), new Top(),
new Wins() new Wins(),
new Confirm()
); );
getLogger().info("Loading game...");
game = new Game(null, board); game = new Game(null, board);
getLogger().info("Scheduling tick tasks...");
getServer().getScheduler().runTaskTimer(this, this::onTick,0,1).getTaskId(); getServer().getScheduler().runTaskTimer(this, this::onTick,0,1).getTaskId();
getLogger().info("Registering outgoing bungeecord plugin channel...");
Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
getLogger().info("Checking for PlaceholderAPI...");
if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) { if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) {
getLogger().info("PlaceholderAPI found...");
getLogger().info("Registering PlaceholderAPI expansion...");
new PAPIExpansion().register(); new PAPIExpansion().register();
} }
long end = System.currentTimeMillis();
getLogger().info("Finished loading plugin ("+(end-start)+"ms)");
loaded = true;
} }
public void onDisable() { public void onDisable() {
@ -223,4 +262,23 @@ public class Main extends JavaPlugin implements Listener {
return version >= v; return version >= v;
} }
public java.util.List<String> getWorlds() {
java.util.List<String> worlds = new ArrayList<>();
File[] containers = getWorldContainer().listFiles();
if(containers != null) {
Arrays.stream(containers).forEach(file -> {
if (!file.isDirectory()) return;
String[] files = file.list();
if (files == null) return;
if (!Arrays.asList(files).contains("session.lock") && !Arrays.asList(files).contains("level.dat")) return;
worlds.add(file.getName());
});
}
return worlds;
}
public boolean isLoaded() {
return loaded;
}
} }

View file

@ -0,0 +1,62 @@
package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.function.Consumer;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Confirm implements ICommand {
public static final Map<UUID, Confirmation> confirmations = new HashMap<>();
public void execute(Player sender, String[] args) {
Confirmation confirmation = confirmations.get(sender.getUniqueId());
confirmations.remove(sender.getUniqueId());
if(confirmation == null) {
sender.sendMessage(errorPrefix + message("NO_CONFIRMATION"));
} else {
long now = System.currentTimeMillis();
float secs = (now - confirmation.start) / 1000F;
if(secs > 10) {
sender.sendMessage(errorPrefix + message("CONFIRMATION_TIMED_OUT"));
return;
}
confirmation.callback.accept(confirmation.data);
}
}
public String getLabel() {
return "confirm";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Confirm another command if required";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return null;
}
public static class Confirmation {
public final Consumer<String> callback;
public final String data;
public final long start;
public Confirmation(String data, Consumer<String> callback) {
this.callback = callback;
this.data = data;
this.start = System.currentTimeMillis();
}
}
}

View file

@ -0,0 +1,66 @@
package net.tylermurphy.hideAndSeek.command.world;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.WorldType;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Create implements ICommand {
public void execute(Player sender, String[] args) {
List<String> worlds = Main.getInstance().getWorlds();
if(worlds.contains(args[0])) {
sender.sendMessage(errorPrefix + message("WORLD_EXISTS").addAmount(args[0]));
}
WorldType type;
if(args[1].equals("normal")) {
type = WorldType.NORMAL;
} else if(args[1].equals("flat")) {
type = WorldType.FLAT;
} else {
sender.sendMessage(errorPrefix + message("INVALID_WORLD_TYPE").addAmount(args[1]));
return;
}
Location temp = new Location(args[0], 0, 0, 0);
if (temp.load(type) == null) {
sender.sendMessage(errorPrefix + message("WORLD_ADDED_FAILED"));
} else {
sender.sendMessage(messagePrefix + message("WORLD_ADDED").addAmount(args[0]));
}
}
public String getLabel() {
return "create";
}
public String getUsage() {
return "<name> <type>";
}
public String getDescription() {
return "Create a new world";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("name")) {
return Collections.singletonList("name");
}
if(parameter.equals("type")) {
return Arrays.asList("normal", "flat");
}
return null;
}
}

View file

@ -0,0 +1,74 @@
package net.tylermurphy.hideAndSeek.command.world;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.Confirm;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.world.WorldLoader;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.List;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Delete implements ICommand {
public void execute(Player sender, String[] args) {
java.util.List<String> worlds = Main.getInstance().getWorlds();
if(!worlds.contains(args[0])) {
sender.sendMessage(errorPrefix + message("WORLD_DOESNT_EXIST").addAmount(args[0]));
}
Confirm.Confirmation confirmation = new Confirm.Confirmation(args[0], world -> {
java.util.List<String> worlds_now = Main.getInstance().getWorlds();
if(!worlds_now.contains(world)) {
sender.sendMessage(errorPrefix + message("WORLD_DOESNT_EXIST").addAmount(world));
}
World bukkit_world = Bukkit.getWorld(world);
if(bukkit_world != null && bukkit_world.getPlayers().size() > 0) {
sender.sendMessage(errorPrefix + message("WORLD_NOT_EMPTY"));
return;
}
String path = Main.getInstance().getWorldContainer().getPath() + File.separator + world;
if (!Bukkit.getServer().unloadWorld(world, false)) {
sender.sendMessage(errorPrefix + message("WORLD_REMOVED_FAILED"));
return;
}
try {
WorldLoader.deleteDirectory(new File(path));
} catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLD_REMOVED_FAILED"));
return;
}
sender.sendMessage(messagePrefix + message("WORLD_REMOVED").addAmount(world));
});
Confirm.confirmations.put(sender.getUniqueId(), confirmation);
sender.sendMessage(messagePrefix + message("CONFIRMATION"));
}
public String getLabel() {
return "delete";
}
public String getUsage() {
return "<name>";
}
public String getDescription() {
return "Delete a world";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("name")) {
return Main.getInstance().getWorlds();
}
return null;
}
}

View file

@ -0,0 +1,46 @@
package net.tylermurphy.hideAndSeek.command.world;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class List implements ICommand {
public void execute(Player sender, String[] args) {
java.util.List<String> worlds = Main.getInstance().getWorlds();
if(worlds.isEmpty()) {
sender.sendMessage(errorPrefix + message("NO_WORLDS"));
} else {
StringBuilder response = new StringBuilder(messagePrefix + message("LIST_WORLDS"));
for (String world : worlds) {
boolean loaded = Bukkit.getWorld(world) != null;
response.append("\n ").append(world).append(": ").append(loaded ? ChatColor.GREEN + "LOADED" : ChatColor.YELLOW + "NOT LOADED").append(ChatColor.WHITE);
}
sender.sendMessage(response.toString());
}
}
public String getLabel() {
return "list";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "List all worlds in the server";
}
public java.util.List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return null;
}
}

View file

@ -0,0 +1,49 @@
package net.tylermurphy.hideAndSeek.command.world;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Tp implements ICommand {
public void execute(Player sender, String[] args) {
Location test = new Location(args[0], 0, 0,0);
if(!test.exists()) {
sender.sendMessage(errorPrefix + message("WORLD_DOESNT_EXIT"));
return;
}
World world = test.load();
if(world == null) {
sender.sendMessage(errorPrefix + message("WORLD_LOAD_FAILED"));
return;
}
Location loc = new Location(world.getName(), world.getSpawnLocation());
loc.teleport(sender);
}
public String getLabel() {
return "tp";
}
public String getUsage() {
return "<world>";
}
public String getDescription() {
return "Teleport to another world";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("world")) {
return Main.getInstance().getWorlds();
}
return null;
}
}

View file

@ -318,11 +318,11 @@ public class ConfigManager {
int index = 0; int index = 0;
for(String part : parts) { for(String part : parts) {
if (index == 0) { if (index == 0) {
index = yaml.indexOf(part + ":", index); index = yaml.indexOf("\n" + part + ":", index) + 1;
} else { } else {
index = yaml.indexOf(" " + part + ":", index) + 1; index = yaml.indexOf(" " + part + ":", index) + 1;
} }
if (index == -1) break; if (index == 0) break;
} }
return index; return index;
} }

View file

@ -3,6 +3,7 @@ package net.tylermurphy.hideAndSeek.configuration;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.util.Location; import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@ -72,6 +73,7 @@ public class Maps {
ConfigurationSection data = maps.getConfigurationSection(name); ConfigurationSection data = maps.getConfigurationSection(name);
if(data == null) return null; if(data == null) return null;
Map map = new Map(name); Map map = new Map(name);
Main.getInstance().getLogger().info("Loading map: " + name + "...");
map.setSpawn(getSpawn(data, "game")); map.setSpawn(getSpawn(data, "game"));
map.setLobby(getSpawn(data, "lobby")); map.setLobby(getSpawn(data, "lobby"));
map.setSeekerLobby(getSpawn(data, "seeker")); map.setSeekerLobby(getSpawn(data, "seeker"));

View file

@ -45,8 +45,10 @@ public class Database {
public Database(){ public Database(){
if(databaseType.equals("SQLITE")) { if(databaseType.equals("SQLITE")) {
Main.getInstance().getLogger().info("SQLITE database chosen");
connection = new SQLiteConnection(); connection = new SQLiteConnection();
} else { } else {
Main.getInstance().getLogger().info("MYSQL database chosen");
connection = new MySQLConnection(); connection = new MySQLConnection();
} }

View file

@ -21,6 +21,7 @@ package net.tylermurphy.hideAndSeek.database.connections;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import net.tylermurphy.hideAndSeek.Main;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
@ -35,6 +36,13 @@ public class MySQLConnection implements DatabaseConnection {
HikariConfig config = new HikariConfig(); HikariConfig config = new HikariConfig();
Main.getInstance().getLogger().info("Database host: " + databaseHost);
Main.getInstance().getLogger().info("Database port: " + databasePort);
Main.getInstance().getLogger().info("Database user: " + databaseUser);
Main.getInstance().getLogger().info("Database pass: xxxxxxxxxxx");
Main.getInstance().getLogger().info("Database name: " + databaseName);
config.setJdbcUrl("jdbc:mariadb://"+databaseHost+":"+databasePort+"/"+databaseName); config.setJdbcUrl("jdbc:mariadb://"+databaseHost+":"+databasePort+"/"+databaseName);
config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSize", "250");

View file

@ -4,6 +4,7 @@ import net.tylermurphy.hideAndSeek.Main;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
import org.bukkit.WorldType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -42,13 +43,30 @@ public class Location {
this.z = z; this.z = z;
} }
public World load() { public Location(@NotNull String world, @NotNull org.bukkit.Location location) {
this.world = world;
this.x = location.getX();
this.y = location.getY();
this.z = location.getZ();
}
public World load(WorldType type) {
World bukkitWorld = Bukkit.getWorld(world); World bukkitWorld = Bukkit.getWorld(world);
if(bukkitWorld != null) return bukkitWorld; if(bukkitWorld != null) return bukkitWorld;
if (type == null) {
Bukkit.getServer().createWorld(new WorldCreator(world)); Bukkit.getServer().createWorld(new WorldCreator(world));
} else {
Bukkit.getServer().createWorld(new WorldCreator(world).type(type));
}
return Bukkit.getWorld(world); return Bukkit.getWorld(world);
} }
public World load() {
if(!exists()) return null;
if(!Main.getInstance().isLoaded()) return null;
return load(null);
}
private org.bukkit.Location toBukkit() { private org.bukkit.Location toBukkit() {
return new org.bukkit.Location( return new org.bukkit.Location(
Bukkit.getWorld(world), Bukkit.getWorld(world),

View file

@ -155,7 +155,7 @@ public class WorldLoader {
out.close(); out.close();
} }
private void deleteDirectory(File directoryToBeDeleted) { public static void deleteDirectory(File directoryToBeDeleted) {
File[] allContents = directoryToBeDeleted.listFiles(); File[] allContents = directoryToBeDeleted.listFiles();
if (allContents != null) { if (allContents != null) {
for (File file : allContents) { for (File file : allContents) {

View file

@ -107,6 +107,20 @@ Localization:
BLOCKHUNT_BLOCK_REMOVED: "Removed {AMOUNT} from blockhunt config." BLOCKHUNT_BLOCK_REMOVED: "Removed {AMOUNT} from blockhunt config."
BLOCKHUNT_LIST_BLOCKS: "The following blockhunt blocks are:" BLOCKHUNT_LIST_BLOCKS: "The following blockhunt blocks are:"
NO_BLOCKS: "There are no blockhunt blocks in this map." NO_BLOCKS: "There are no blockhunt blocks in this map."
WORLD_EXISTS: "A world named {AMOUNT} already exists."
WORLD_DOESNT_EXIST: "There is no world named {AMOUNT} that exists."
WORLD_ADDED: "Created a world named {AMOUNT}."
WORLD_ADDED_FAILED: "Failed to create new world."
WORLD_REMOVED: "Deleted a world named {AMOUNT}."
WORLD_REMOVED_FAILED: "Failed to delete world."
WORLD_NOT_EMPTY: "World must be empty to be deleted."
LIST_WORLDS: "The following worlds are:"
NO_WORLDS: "Failed to fetch any worlds."
WORLD_LOAD_FAILED: "Failed to load world."
INVALID_WORLD_TYPE: "Invalid world type: {AMOUNT}."
NO_CONFIRMATION: "You have nothing to confirm."
CONFIRMATION_TIMED_OUT: "The confirmation has timed out."
CONFIRMATION: "Run /hs confirm within 10s to confirm."
# DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE # DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE
version: 4 version: 4

View file

@ -62,4 +62,14 @@ permissions:
default: op default: op
hs.map.blockhunt.list: hs.map.blockhunt.list:
default: op default: op
hs.world.create:
default: op
hs.world.delete:
default: op
hs.world.list:
default: op
hs.world.tp:
default: op
hs.confirm:
default: op