Merge pull request '1.7.0 - Multi Map Support' (#4) from dev into main

Reviewed-on: https://g.tylerm.dev/tylermurphy534/KenshinsHideAndSeek/pulls/4
This commit is contained in:
tylermurphy534 2023-02-05 19:02:59 +00:00
commit 8fdd3461c1
99 changed files with 3627 additions and 2244 deletions

View file

@ -1,33 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug report
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**System Info (please complete the following information):**
- OS: [e.g. Windows/Linux]
- Server Host [e.g. Apex/Custom]
- MC Version [e.g. 1.17/1.18]
- Plugin Version [e.g. 1.3.0/1.3.1 BETA]
**Additional context**
Add any other context about the problem here.

View file

@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: new plugin feature
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -1,11 +0,0 @@
**Describe the change**
A clear and concise description of what the changes are.
**Expected behavior**
A clear and concise description of what your changes are going to do.
**Screenshots**
If applicable, add screenshots to help explain your changes.
**Additional context**
Add any other context about the pull request here.

View file

@ -1,37 +0,0 @@
name: Beta
on:
push:
branches-ignore: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout branch
uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Maven
run: |
mvn -B package --file pom.xml
mkdir staging && cp target/*.jar staging
- name: Set up a cache for maven
uses: actions/cache@v2
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: artifacts-beta
path: staging

View file

@ -1,37 +0,0 @@
name: Release
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout branch
uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Maven
run: |
mvn -B package --file pom.xml
mkdir staging && cp target/*.jar staging
- name: Set up a cache for maven
uses: actions/cache@v2
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Upload artificats
uses: actions/upload-artifact@v2
with:
name: artifacts-release
path: staging

BIN
lib/ProtocolLib.jar Normal file

Binary file not shown.

32
pom.xml
View file

@ -1,13 +1,16 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<groupId>net.tylermurphy</groupId> <groupId>net.tylermurphy</groupId>
<artifactId>KenshinsHideAndSeek</artifactId> <artifactId>KenshinsHideAndSeek</artifactId>
<version>1.6.2</version> <version>1.7.0</version>
<name>Hide and Seek Plugin</name> <name>Hide and Seek Plugin</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build> <build>
<defaultGoal>clean install</defaultGoal> <defaultGoal>clean install</defaultGoal>
<sourceDirectory>src/main/java</sourceDirectory> <sourceDirectory>src/main/java</sourceDirectory>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@ -30,10 +33,6 @@
<pattern>com.zaxxer.hikari</pattern> <pattern>com.zaxxer.hikari</pattern>
<shadedPattern>net.tylermurphy.dependencies.hikari</shadedPattern> <shadedPattern>net.tylermurphy.dependencies.hikari</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>org.ibex.nestedvm</pattern>
<shadedPattern>net.tylermurphy.dependencies.nestedvm</shadedPattern>
</relocation>
</relocations> </relocations>
<artifactSet> <artifactSet>
<includes> <includes>
@ -58,7 +57,6 @@
<resource>META-INF/services/java.sql.Driver</resource> <resource>META-INF/services/java.sql.Driver</resource>
</transformer> </transformer>
</transformers> </transformers>
<minimizeJar>true</minimizeJar>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>
@ -82,10 +80,10 @@
<id>spigot-repo</id> <id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/public/</url> <url>https://hub.spigotmc.org/nexus/content/repositories/public/</url>
</repository> </repository>
<repository> <!-- <repository>-->
<id>dmulloy2-repo</id> <!-- <id>dmulloy2-repo</id>-->
<url>https://repo.dmulloy2.net/repository/public/</url> <!-- <url>https://repo.dmulloy2.net/repository/public/</url>-->
</repository> <!-- </repository>-->
<repository> <repository>
<id>placeholderapi</id> <id>placeholderapi</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url> <url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
@ -108,12 +106,14 @@
<dependency> <dependency>
<groupId>com.comphenix.protocol</groupId> <groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId> <artifactId>ProtocolLib</artifactId>
<version>4.7.0</version> <version>4.8.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ProtocolLib.jar</systemPath>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.xerial</groupId> <groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId> <artifactId>sqlite-jdbc</artifactId>
<version>3.7.2</version> <version>3.39.3.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jetbrains</groupId> <groupId>org.jetbrains</groupId>
@ -123,7 +123,7 @@
<dependency> <dependency>
<groupId>com.github.cryptomorin</groupId> <groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId> <artifactId>XSeries</artifactId>
<version>9.0.0</version> <version>9.1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>me.clip</groupId> <groupId>me.clip</groupId>
@ -134,12 +134,12 @@
<dependency> <dependency>
<groupId>com.zaxxer</groupId> <groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId> <artifactId>HikariCP</artifactId>
<version>4.0.3</version> <version>5.0.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mariadb.jdbc</groupId> <groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId> <artifactId>mariadb-java-client</artifactId>
<version>2.7.2</version> <version>3.0.6</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View file

@ -1,49 +1,34 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek; package net.tylermurphy.hideAndSeek;
import net.tylermurphy.hideAndSeek.configuration.Config; import net.tylermurphy.hideAndSeek.command.*;
import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.command.map.*;
import net.tylermurphy.hideAndSeek.configuration.Localization; import net.tylermurphy.hideAndSeek.command.map.blockhunt.Enabled;
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.database.Database; import net.tylermurphy.hideAndSeek.database.Database;
import net.tylermurphy.hideAndSeek.game.*; import net.tylermurphy.hideAndSeek.game.*;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.command.util.CommandGroup;
import net.tylermurphy.hideAndSeek.util.CommandHandler;
import net.tylermurphy.hideAndSeek.game.listener.*; import net.tylermurphy.hideAndSeek.game.listener.*;
import net.tylermurphy.hideAndSeek.util.PAPIExpansion; import net.tylermurphy.hideAndSeek.util.PAPIExpansion;
import net.tylermurphy.hideAndSeek.util.TabCompleter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.util.List; 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;
import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.exitWorld; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Main extends JavaPlugin implements Listener { public class Main extends JavaPlugin implements Listener {
@ -55,51 +40,136 @@ public class Main extends JavaPlugin implements Listener {
private Disguiser disguiser; private Disguiser disguiser;
private EntityHider entityHider; private EntityHider entityHider;
private Game game; private Game game;
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();
Config.loadConfig(); getLogger().info("Getting minecraft version...");
Localization.loadLocalization(); this.updateVersion();;
Items.loadItems();
try {
getLogger().info("Loading config.yml...");
Config.loadConfig();
getLogger().info("Loading maps.yml...");
Maps.loadMaps();
getLogger().info("Loading localization.yml...");
Localization.loadLocalization();
getLogger().info("Loading items.yml...");
Items.loadItems();
getLogger().info("Loading leaderboard.yml...");
Leaderboard.loadLeaderboard();
} catch (Exception e) {
getLogger().severe(e.getMessage());
Bukkit.getPluginManager().disablePlugin(this);
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();
CommandHandler.registerCommands(); getLogger().info("Registering commands...");
this.commandGroup = new CommandGroup("hs",
new Help(),
new Reload(),
new Join(),
new Leave(),
new Send(),
new Start(),
new Stop(),
new CommandGroup("map",
new CommandGroup("blockhunt",
new CommandGroup("blocks",
new net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks.Add(),
new net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks.Remove(),
new net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks.List()
),
new Enabled()
),
new CommandGroup("set",
new Lobby(),
new Spawn(),
new SeekerLobby(),
new Border(),
new Bounds()
),
new Add(),
new Remove(),
new List(),
new Status(),
new Save(),
new Debug(),
new GoTo()
),
new CommandGroup("world",
new Create(),
new Delete(),
new net.tylermurphy.hideAndSeek.command.world.List(),
new Tp()
),
new SetExitLocation(),
new Top(),
new Wins(),
new Confirm()
);
game = new Game(board); getLogger().info("Loading game...");
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() {
version = 0; version = 0;
board.getPlayers().forEach(player -> { if(board != null) {
board.removeBoard(player); board.getPlayers().forEach(player -> {
PlayerLoader.unloadPlayer(player); board.removeBoard(player);
player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); PlayerLoader.unloadPlayer(player);
}); exitPosition.teleport(player);
});
board.cleanup();
}
if(disguiser != null) {
disguiser.cleanUp();
}
Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(this); Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(this);
board.cleanup();
disguiser.cleanUp();
} }
private void onTick() { private void onTick() {
if(game.getStatus() == Status.ENDED) game = new Game(board); if(game.getStatus() == net.tylermurphy.hideAndSeek.game.util.Status.ENDED) game = new Game(game.getCurrentMap(), board);
game.onTick(); game.onTick();
disguiser.check(); disguiser.check();
} }
@ -115,6 +185,7 @@ public class Main extends JavaPlugin implements Listener {
getServer().getPluginManager().registerEvents(new MovementHandler(), this); getServer().getPluginManager().registerEvents(new MovementHandler(), this);
getServer().getPluginManager().registerEvents(new PlayerHandler(), this); getServer().getPluginManager().registerEvents(new PlayerHandler(), this);
getServer().getPluginManager().registerEvents(new RespawnHandler(), this); getServer().getPluginManager().registerEvents(new RespawnHandler(), this);
getServer().getPluginManager().registerEvents(new WorldInteractHandler(), this);
} }
private void updateVersion(){ private void updateVersion(){
@ -127,11 +198,20 @@ public class Main extends JavaPlugin implements Listener {
} }
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) {
return CommandHandler.handleCommand(sender, args); if (!(sender instanceof Player)) {
sender.sendMessage(errorPrefix + message("COMMAND_PLAYER_ONLY"));
return true;
}
commandGroup.handleCommand((Player)sender, args);
return true;
} }
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { public java.util.List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
return TabCompleter.handleTabComplete(sender, args); if (!(sender instanceof Player)) {
sender.sendMessage(errorPrefix + message("COMMAND_PLAYER_ONLY"));
return new ArrayList<>();
}
return commandGroup.handleTabComplete((Player)sender, args);
} }
public static Main getInstance() { public static Main getInstance() {
@ -158,8 +238,34 @@ public class Main extends JavaPlugin implements Listener {
public EntityHider getEntityHider() { return entityHider; } public EntityHider getEntityHider() { return entityHider; }
public CommandGroup getCommandGroup() { return commandGroup; }
public boolean supports(int v){ public boolean supports(int v){
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;
}
public void scheduleTask(Runnable task) {
if(!isEnabled()) return;
Bukkit.getServer().getScheduler().runTask(this, task);
}
} }

View file

@ -1,47 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
public class About implements ICommand {
public void execute(Player sender, String[] args) {
sender.sendMessage(
String.format("%s%sHide and Seek %s(%s1.6.2%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY,ChatColor.WHITE,ChatColor.GRAY) +
String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) +
String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE)
);
}
public String getLabel() {
return "about";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Get information about the plugin";
}
}

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

@ -1,110 +0,0 @@
package net.tylermurphy.hideAndSeek.command;
import com.cryptomorin.xseries.XMaterial;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.PlayerLoader;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition;
public class Debug implements ICommand {
private static final Map<Integer, Consumer<Player>> debugMenuFunctions = new HashMap<>();
private Inventory debugMenu;
public void execute(Player sender, String[] args) {
if(debugMenu == null) createMenu();
sender.openInventory(debugMenu);
}
private void createMenu(){
debugMenu = Main.getInstance().getServer().createInventory(null, 18, "Debug Menu");
debugMenu.setItem(0, createOption(0, XMaterial.LEATHER_CHESTPLATE.parseMaterial(), "&6Become a &lHider", 1, player -> {
if(mapSaveEnabled) {
if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap();
}
Main.getInstance().getBoard().addHider(player);
PlayerLoader.loadHider(player, Main.getInstance().getGame().getGameWorld());
if(Main.getInstance().getGame().getStatus() != Status.STARTING)
PlayerLoader.resetPlayer(player, Main.getInstance().getBoard());
}));
debugMenu.setItem(1, createOption(1, XMaterial.GOLDEN_CHESTPLATE.parseMaterial(), "&cBecome a &lSeeker", 1, player -> {
if(mapSaveEnabled) {
if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap();
}
Main.getInstance().getBoard().addSeeker(player);
PlayerLoader.loadSeeker(player, Main.getInstance().getGame().getGameWorld());
if(Main.getInstance().getGame().getStatus() != Status.STARTING)
PlayerLoader.resetPlayer(player, Main.getInstance().getBoard());
}));
debugMenu.setItem(2, createOption(2, XMaterial.IRON_CHESTPLATE.parseMaterial(), "&8Become a &lSpectator", 1, player -> {
if(mapSaveEnabled) {
if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap();
}
Main.getInstance().getBoard().addSpectator(player);
PlayerLoader.loadSpectator(player, Main.getInstance().getGame().getGameWorld());
}));
debugMenu.setItem(3, createOption(3, XMaterial.BARRIER.parseMaterial(), "&cUnload from Game", 1, player -> {
Main.getInstance().getBoard().remove(player);
PlayerLoader.unloadPlayer(player);
player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
}));
debugMenu.setItem(4, createOption(4, XMaterial.BARRIER.parseMaterial(), "&cDie In Game", 2, player -> {
if((Main.getInstance().getBoard().isSeeker(player) || Main.getInstance().getBoard().isHider(player)) && Main.getInstance().getGame().getStatus() == Status.PLAYING){
player.setHealth(0.1);
}
}));
debugMenu.setItem(6, createOption(6, Material.ENDER_PEARL, "&d&lTeleport: &fGame spawn", 1, player -> {
if(mapSaveEnabled) {
if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap();
}
player.teleport(new Location(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
}));
debugMenu.setItem(7, createOption(7, Material.ENDER_PEARL, "&d&lTeleport: &fLobby", 2, player -> player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(), lobbyPosition.getY(), lobbyPosition.getZ()))));
debugMenu.setItem(8, createOption(8, Material.ENDER_PEARL, "&d&lTeleport: &fExit", 3, player -> player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()))));
debugMenu.setItem(9, createOption(9, XMaterial.GLASS.parseMaterial(), "&dEnable Disguise", 1, PlayerLoader::openBlockHuntPicker));
debugMenu.setItem(10, createOption(10, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> Main.getInstance().getDisguiser().reveal(player)));
}
private ItemStack createOption(int slow, Material material, String name, int amount, Consumer<Player> callback){
ItemStack temp = new ItemStack(material, amount);
ItemMeta meta = temp.getItemMeta();
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
temp.setItemMeta(meta);
debugMenuFunctions.put(slow, callback);
return temp;
}
public static void handleOption(Player player, int slotId){
Main.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> {
Consumer<Player> callback = debugMenuFunctions.get(slotId);
if(callback != null) callback.accept(player);
}, 0);
}
public String getLabel() {
return "debug";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Run debug commands";
}
}

View file

@ -1,36 +1,70 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.md_5.bungee.api.ChatColor; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.util.CommandHandler; import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.util.Pair;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Help implements ICommand { public class Help implements ICommand {
public void execute(Player sender, String[] args) { public void execute(Player sender, String[] args) {
StringBuilder message = new StringBuilder(); final int pageSize = 4;
for(ICommand command : CommandHandler.COMMAND_REGISTER.values()) { List<Pair<String, ICommand>> commands = Main.getInstance().getCommandGroup().getCommands();
message.append(String.format("%s/hs %s%s %s%s\n %s%s%s", ChatColor.AQUA, ChatColor.WHITE, command.getLabel().toLowerCase(), ChatColor.BLUE, command.getUsage(), ChatColor.GRAY, ChatColor.ITALIC, command.getDescription() + "\n")); int pages = (commands.size() - 1) / pageSize + 1;
int page;
try {
if(args.length < 1) {
page = 1;
} else {
page = Integer.parseInt(args[0]);
if (page < 1) {
throw new IllegalArgumentException("Inavlid Input");
}
}
} catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[0]));
return;
} }
message = new StringBuilder(message.substring(0, message.length() - 1)); String spacer = ChatColor.GRAY + "?" + ChatColor.WHITE;
StringBuilder message = new StringBuilder();
message.append(String.format("%s================ %sHelp: Page (%s/%s) %s================",
ChatColor.AQUA, ChatColor.WHITE, page, pages, ChatColor.AQUA));
int lines = 0;
for(Pair<String, ICommand> pair : commands.stream().skip((long) (page - 1) * pageSize).limit(pageSize).collect(Collectors.toList())) {
ICommand command = pair.getRight();
String label = pair.getLeft();
String start = label.substring(0, label.indexOf(" "));
String invoke = label.substring(label.indexOf(" ")+1);
message.append(String.format("\n%s %s/%s %s%s %s%s\n%s %s%s%s",
spacer,
ChatColor.AQUA,
start,
ChatColor.WHITE,
invoke,
ChatColor.BLUE,
command.getUsage(),
spacer,
ChatColor.GRAY,
ChatColor.ITALIC,
command.getDescription()
));
lines += 2;
}
if(lines / 2 < pageSize) {
for(int i = 0; i < pageSize * 2 - lines; i++) {
message.append("\n").append(spacer);
}
}
message.append("\n").append(ChatColor.AQUA).append("===============================================");
sender.sendMessage(message.toString()); sender.sendMessage(message.toString());
} }
@ -39,11 +73,15 @@ public class Help implements ICommand {
} }
public String getUsage() { public String getUsage() {
return ""; return "<*page>";
} }
public String getDescription() { public String getDescription() {
return "Get the commands for the plugin"; return "Get the commands for the plugin";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return Collections.singletonList(parameter);
}
} }

View file

@ -1,34 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command;
import org.bukkit.entity.Player;
public interface ICommand {
void execute(Player sender, String[] args);
String getLabel();
String getUsage();
String getDescription();
}

View file

@ -1,27 +1,14 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
@ -29,7 +16,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Join implements ICommand { public class Join implements ICommand {
public void execute(Player sender, String[] args) { public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().isNotSetup()) { if (Main.getInstance().getGame().checkCurrentMap()) {
sender.sendMessage(errorPrefix + message("GAME_SETUP")); sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return; return;
} }
@ -42,7 +29,18 @@ public class Join implements ICommand {
sender.sendMessage(errorPrefix + message("GAME_INGAME")); sender.sendMessage(errorPrefix + message("GAME_INGAME"));
return; return;
} }
if(args.length > 0) {
if(Main.getInstance().getBoard().size() > 0) {
sender.sendMessage(errorPrefix + message("LOBBY_IN_USE"));
return;
}
net.tylermurphy.hideAndSeek.configuration.Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
Main.getInstance().getGame().setCurrentMap(map);
}
Main.getInstance().getGame().join(player); Main.getInstance().getGame().join(player);
} }
@ -51,11 +49,18 @@ public class Join implements ICommand {
} }
public String getUsage() { public String getUsage() {
return ""; return "<*map>";
} }
public String getDescription() { public String getDescription() {
return "Joins the lobby if game is set to manual join/leave"; return "Joins the lobby if game is set to manual join/leave";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("*map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
} }

View file

@ -1,27 +1,12 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; 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.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
@ -29,7 +14,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Leave implements ICommand { public class Leave implements ICommand {
public void execute(Player sender, String[] args) { public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().isNotSetup()) { if (Main.getInstance().getGame().checkCurrentMap()) {
sender.sendMessage(errorPrefix + message("GAME_SETUP")); sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return; return;
} }
@ -57,4 +42,8 @@ public class Leave implements ICommand {
return "Leaves the lobby if game is set to manual join/leave"; return "Leaves the lobby if game is set to manual join/leave";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return null;
}
} }

View file

@ -1,30 +1,13 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Config; import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.configuration.*;
import net.tylermurphy.hideAndSeek.configuration.Localization;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player; 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.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix;
@ -38,9 +21,18 @@ public class Reload implements ICommand {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return; return;
} }
Config.loadConfig();
Localization.loadLocalization(); try {
Items.loadItems(); Config.loadConfig();
Maps.loadMaps();
Localization.loadLocalization();
Items.loadItems();
Leaderboard.loadLeaderboard();
} catch (Exception e) {
sender.sendMessage(errorPrefix + message("CONFIG_ERROR"));
return;
}
sender.sendMessage(messagePrefix + message("CONFIG_RELOAD")); sender.sendMessage(messagePrefix + message("CONFIG_RELOAD"));
} }
@ -55,5 +47,9 @@ public class Reload implements ICommand {
public String getDescription() { public String getDescription() {
return "Reloads the config"; return "Reloads the config";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return null;
}
} }

View file

@ -0,0 +1,69 @@
package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Send implements ICommand {
public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
if(map.isNotSetup()){
sender.sendMessage(errorPrefix + message("MAP_NOT_SETUP"));
return;
}
if (!Main.getInstance().getBoard().contains(sender)) {
sender.sendMessage(errorPrefix + message("GAME_NOT_INGAME"));
return;
}
Main.getInstance().getGame().setCurrentMap(map);
Main.getInstance().getBoard().reloadLobbyBoards();
for(Player player : Main.getInstance().getBoard().getPlayers()) {
map.getLobby().teleport(player);
}
}
public String getLabel() {
return "send";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Set the current lobby to another map";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().filter(map -> !map.isNotSetup()).map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -1,106 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class SetBorder implements ICommand {
public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
if (spawnPosition == null) {
sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN"));
return;
}
if (args.length < 3) {
worldBorderEnabled = false;
addToConfig("worldBorder.enabled",false);
saveConfig();
sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE"));
Main.getInstance().getGame().getBorder().resetWorldBorder(spawnWorld);
return;
}
int num,delay,change;
try { num = Integer.parseInt(args[0]); } catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[0]));
return;
}
try { delay = Integer.parseInt(args[1]); } catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[1]));
return;
}
try { change = Integer.parseInt(args[2]); } catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[2]));
return;
}
if (num < 100) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_MIN_SIZE"));
return;
}
if (change < 1) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_CHANGE_SIZE"));
return;
}
Vector vec = new Vector();
vec.setX(sender.getLocation().getBlockX());
vec.setY(0);
vec.setZ(sender.getLocation().getBlockZ());
if (spawnPosition.distance(vec) > 100) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION"));
return;
}
worldBorderPosition = vec;
worldBorderSize = num;
worldBorderDelay = delay;
worldBorderChange = change;
worldBorderEnabled = true;
addToConfig("worldBorder.x", worldBorderPosition.getBlockX());
addToConfig("worldBorder.z", worldBorderPosition.getBlockZ());
addToConfig("worldBorder.delay", worldBorderDelay);
addToConfig("worldBorder.size", worldBorderSize);
addToConfig("worldBorder.enabled", true);
addToConfig("worldBorder.move", worldBorderChange);
sender.sendMessage(messagePrefix + message("WORLDBORDER_ENABLE").addAmount(num).addAmount(delay));
saveConfig();
Main.getInstance().getGame().getBorder().resetWorldBorder(spawnWorld);
}
public String getLabel() {
return "setBorder";
}
public String getUsage() {
return "<size> <delay> <move>";
}
public String getDescription() {
return "Sets worldboarder's center location, size in blocks, and delay in minutes per shrink. Add no arguments to disable.";
}
}

View file

@ -1,96 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class SetBounds implements ICommand {
public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
if (spawnPosition == null) {
sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN"));
return;
}
if (!sender.getWorld().getName().equals(spawnWorld)) {
sender.sendMessage(errorPrefix + message("BOUNDS_WRONG_WORLD"));
return;
}
if (sender.getLocation().getBlockX() == 0 || sender.getLocation().getBlockZ() == 0) {
sender.sendMessage(errorPrefix + message("NOT_AT_ZERO"));
return;
}
boolean first = true;
if (saveMinX != 0 && saveMinZ != 0 && saveMaxX != 0 && saveMaxZ != 0) {
saveMinX = 0; saveMinZ= 0; saveMaxX = 0; saveMaxZ = 0;
}
if (saveMaxX == 0) {
addToConfig("bounds.max.x", sender.getLocation().getBlockX());
saveMaxX = sender.getLocation().getBlockX();
} else if (saveMaxX < sender.getLocation().getBlockX()) {
first = false;
addToConfig("bounds.max.x", sender.getLocation().getBlockX());
addToConfig("bounds.min.x", saveMaxX);
saveMinX = saveMaxX;
saveMaxX = sender.getLocation().getBlockX();
} else {
first = false;
addToConfig("bounds.min.x", sender.getLocation().getBlockX());
saveMinX = sender.getLocation().getBlockX();
}
if (saveMaxZ == 0) {
addToConfig("bounds.max.z", sender.getLocation().getBlockZ());
saveMaxZ = sender.getLocation().getBlockZ();
} else if (saveMaxZ < sender.getLocation().getBlockZ()) {
first = false;
addToConfig("bounds.max.z", sender.getLocation().getBlockZ());
addToConfig("bounds.min.z", saveMaxZ);
saveMinZ = saveMaxZ;
saveMaxZ = sender.getLocation().getBlockZ();
} else {
first = false;
addToConfig("bounds.min.z", sender.getLocation().getBlockZ());
saveMinZ = sender.getLocation().getBlockZ();
}
sender.sendMessage(messagePrefix + message("BOUNDS").addAmount(first ? 1 : 2));
saveConfig();
}
public String getLabel() {
return "setBounds";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Sets the map bounds for the game.";
}
}

View file

@ -0,0 +1,43 @@
package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.command.location.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.Locations;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class SetExitLocation implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.EXIT, null, map -> {
addToConfig("exit.x", sender.getLocation().getBlockX());
addToConfig("exit.y", sender.getLocation().getBlockY());
addToConfig("exit.z", sender.getLocation().getBlockZ());
addToConfig("exit.world", sender.getLocation().getWorld().getName());
exitPosition = Location.from(sender);
saveConfig();
});
}
public String getLabel() {
return "setexit";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Sets the plugins exit location";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return null;
}
}

View file

@ -1,83 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main;
import org.bukkit.entity.Player;
import java.io.File;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Setup implements ICommand {
public void execute(Player sender, String[] args) {
String msg = message("SETUP").toString();
int count = 0;
if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) {
msg = msg + "\n" + message("SETUP_GAME");
count++;
}
if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0) {
msg = msg + "\n" + message("SETUP_LOBBY");
count++;
}
if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0) {
msg = msg + "\n" + message("SETUP_SEEKER_LOBBY");
count++;
}
if (exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) {
msg = msg + "\n" + message("SETUP_EXIT");
count++;
}
if (saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0) {
msg = msg + "\n" + message("SETUP_BOUNDS");
count++;
}
if (mapSaveEnabled) {
File destenation = new File(Main.getInstance().getWorldContainer() + File.separator + Main.getInstance().getGame().getGameWorld());
if (!destenation.exists()) {
msg = msg + "\n" + message("SETUP_SAVEMAP");
count++;
}
}
if (count < 1) {
sender.sendMessage(messagePrefix + message("SETUP_COMPLETE"));
} else {
sender.sendMessage(msg);
}
}
public String getLabel() {
return "setup";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Shows what needs to be setup";
}
}

View file

@ -1,31 +1,14 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Optional; import java.util.List;
import java.util.Random; import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.minPlayers; import static net.tylermurphy.hideAndSeek.configuration.Config.minPlayers;
@ -34,7 +17,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Start implements ICommand { public class Start implements ICommand {
public void execute(Player sender, String[] args) { public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().isNotSetup()) { if (Main.getInstance().getGame().checkCurrentMap()) {
sender.sendMessage(errorPrefix + message("GAME_SETUP")); sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return; return;
} }
@ -52,22 +35,13 @@ public class Start implements ICommand {
} }
String seekerName; String seekerName;
if (args.length < 1) { if (args.length < 1) {
Optional<Player> rand = Main.getInstance().getBoard().getPlayers().stream().skip(new Random().nextInt(Main.getInstance().getBoard().size())).findFirst(); Main.getInstance().getGame().start();
if (!rand.isPresent()) { return;
Main.getInstance().getLogger().warning("Failed to select random seeker.");
return;
}
seekerName = rand.get().getName();
} else { } else {
seekerName = args[0]; seekerName = args[0];
} }
Player temp = Bukkit.getPlayer(seekerName); Player seeker = Bukkit.getPlayer(seekerName);
if (temp == null) { if (seeker == null || !Main.getInstance().getBoard().contains(seeker)) {
sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName));
return;
}
Player seeker = Main.getInstance().getBoard().getPlayer(temp.getUniqueId());
if (seeker == null) {
sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName)); sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName));
return; return;
} }
@ -79,11 +53,18 @@ public class Start implements ICommand {
} }
public String getUsage() { public String getUsage() {
return "<player>"; return "<*player>";
} }
public String getDescription() { public String getDescription() {
return "Starts the game either with a random seeker or chosen one"; return "Starts the game either with a random seeker or chosen one";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("player")) {
return Main.getInstance().getBoard().getPlayers().stream().map(Player::getName).collect(Collectors.toList());
}
return null;
}
} }

View file

@ -1,27 +1,12 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import static net.tylermurphy.hideAndSeek.configuration.Config.abortPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.abortPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
@ -30,8 +15,8 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Stop implements ICommand { public class Stop implements ICommand {
public void execute(Player sender, String[] args) { public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().isNotSetup()) { if (Main.getInstance().getGame().checkCurrentMap()) {
sender.sendMessage(errorPrefix + "Game is not setup. Run /hs setup to see what you needed to do"); sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return; return;
} }
if (Main.getInstance().getGame().getStatus() == Status.STARTING || Main.getInstance().getGame().getStatus() == Status.PLAYING) { if (Main.getInstance().getGame().getStatus() == Status.STARTING || Main.getInstance().getGame().getStatus() == Status.PLAYING) {
@ -54,4 +39,8 @@ public class Stop implements ICommand {
return "Stops the game"; return "Stops the game";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return null;
}
} }

View file

@ -1,29 +1,13 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.database.util.PlayerInfo; import net.tylermurphy.hideAndSeek.database.util.PlayerInfo;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List; import java.util.List;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
@ -74,10 +58,15 @@ public class Top implements ICommand {
} }
public String getUsage() { public String getUsage() {
return "<page>"; return "<*page>";
} }
public String getDescription() { public String getDescription() {
return "Gets the top players in the server."; return "Gets the top players in the server.";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return Collections.singletonList(parameter);
}
} }

View file

@ -1,29 +1,14 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command; package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.database.util.PlayerInfo; import net.tylermurphy.hideAndSeek.database.util.PlayerInfo;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
@ -70,10 +55,14 @@ public class Wins implements ICommand {
} }
public String getUsage() { public String getUsage() {
return "<player>"; return "<*player>";
} }
public String getDescription() { public String getDescription() {
return "Get the win information for yourself or another player."; return "Get the win information for yourself or another player.";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return Collections.singletonList(parameter);
}
} }

View file

@ -0,0 +1,53 @@
package net.tylermurphy.hideAndSeek.command.location;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
/**
* @author bobby29831
*/
public class LocationUtils {
public static void setLocation(@NotNull Player player, @NotNull Locations place, String mapName, @NotNull Consumer<Map> consumer) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
player.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
if (player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0 || player.getLocation().getBlockY() == 0){
player.sendMessage(errorPrefix + message("NOT_AT_ZERO"));
return;
}
Map map = null;
if(mapName != null) {
map = Maps.getMap(mapName);
if (map == null) {
player.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
}
try {
consumer.accept(map);
} catch (Exception e) {
player.sendMessage(errorPrefix + e.getMessage());
return;
}
if(map != null)
Maps.setMap(mapName, map);
player.sendMessage(messagePrefix + message(place.message()));
}
}

View file

@ -0,0 +1,17 @@
package net.tylermurphy.hideAndSeek.command.location;
/**
* @author bobby29831
*/
public enum Locations {
GAME,
LOBBY,
EXIT,
SEEKER;
public String message() {
return this + "_SPAWN";
}
}

View file

@ -1,49 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command.location;
import net.tylermurphy.hideAndSeek.command.ICommand;
import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.util.Locations;
import org.bukkit.entity.Player;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class SetExitLocation implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.EXIT, vector -> {
exitWorld = sender.getLocation().getWorld().getName();
exitPosition = vector;
});
}
public String getLabel() {
return "setexit";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Sets hide and seeks exit location to current position and world";
}
}

View file

@ -1,50 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command.location;
import net.tylermurphy.hideAndSeek.command.ICommand;
import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.util.Locations;
import org.bukkit.entity.Player;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class SetLobbyLocation implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.LOBBY, vector -> {
lobbyWorld = sender.getLocation().getWorld().getName();
lobbyPosition = vector;
});
}
public String getLabel() {
return "setlobby";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Sets hide and seeks lobby location to current position";
}
}

View file

@ -1,31 +0,0 @@
package net.tylermurphy.hideAndSeek.command.location;
import net.tylermurphy.hideAndSeek.command.ICommand;
import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.util.Locations;
import org.bukkit.entity.Player;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class SetSeekerLobbyLocation implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.SEEKER, vector -> {
seekerLobbyWorld = sender.getLocation().getWorld().getName();
seekerLobbyPosition = vector;
});
}
public String getLabel() {
return "setseekerlobby";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Sets hide and seeks seeker lobby location to current position";
}
}

View file

@ -1,62 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command.location;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.ICommand;
import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.util.Locations;
import org.bukkit.entity.Player;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class SetSpawnLocation implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.GAME, vector -> {
if (worldBorderEnabled && vector.distance(worldBorderPosition) > 100) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION"));
throw new RuntimeException("World border not enabled or not in valid position!");
}
if (!sender.getLocation().getWorld().getName().equals(spawnWorld)) {
Main.getInstance().getGame().getWorldLoader().unloadMap();
Main.getInstance().getGame().getWorldLoader().setNewMap(sender.getLocation().getWorld().getName());
}
spawnWorld = sender.getLocation().getWorld().getName();
spawnPosition = vector;
});
}
public String getLabel() {
return "setspawn";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Sets hide and seeks spawn location to current position";
}
}

View file

@ -1,59 +0,0 @@
package net.tylermurphy.hideAndSeek.command.location.util;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
import java.util.function.Consumer;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
/**
* @author bobby29831
*/
public class LocationUtils {
/**
* Provides a vector for a player
* @param player the player to create the vector for
* @return the vector
*/
private static @Nullable Vector vector(Player player) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
player.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return null;
}
if (player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0 || player.getLocation().getBlockY() == 0){
player.sendMessage(errorPrefix + message("NOT_AT_ZERO"));
return null;
}
Location loc = player.getLocation();
return new Vector(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
}
public static void setLocation(Player player, Locations place, @Nullable Consumer<Vector> consumer) {
Vector vec = vector(player);
World world = player.getLocation().getWorld();
if(world == null) {
throw new RuntimeException("Unable to get world: " + spawnWorld);
}
consumer.accept(vec);
player.sendMessage(messagePrefix + message(place.message()));
addToConfig(place.path("x"), vec.getX());
addToConfig(place.path("y"), vec.getY());
addToConfig(place.path("z"), vec.getZ());
addToConfig(place.path("world"), player.getLocation().getWorld().getName());
saveConfig();
}
}

View file

@ -1,26 +0,0 @@
package net.tylermurphy.hideAndSeek.command.location.util;
/**
* @author bobby29831
*/
public enum Locations {
GAME("spawns.game"),
LOBBY("spawns.lobby"),
EXIT("spawns.exit"),
SEEKER("spawns.seeker");
private final String path;
Locations(String path) {
this.path = path;
}
public String message() {
return this + "_SPAWN";
}
public String path(String additive) {
return path + "." + additive;
}
}

View file

@ -0,0 +1,55 @@
package net.tylermurphy.hideAndSeek.command.map;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
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 Add implements ICommand {
public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map != null) {
sender.sendMessage(errorPrefix + message("MAP_ALREADY_EXISTS"));
} else if(!args[0].matches("[a-zA-Z0-9]*") || args[0].length() < 1) {
sender.sendMessage(errorPrefix + message("INVALID_MAP_NAME"));
} else {
Maps.setMap(args[0], new Map(args[0]));
sender.sendMessage(messagePrefix + message("MAP_CREATED").addAmount(args[0]));
}
}
public String getLabel() {
return "add";
}
public String getUsage() {
return "<name>";
}
public String getDescription() {
return "Add a map to the plugin!";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("name")) {
return Collections.singletonList("name");
}
return null;
}
}

View file

@ -0,0 +1,123 @@
package net.tylermurphy.hideAndSeek.command.map;
import com.cryptomorin.xseries.XMaterial;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.PlayerLoader;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Debug implements ICommand {
private static final Map<Player, Map<Integer, Consumer<Player>>> debugMenuFunctions = new HashMap<>();
public void execute(Player sender, String[] args) {
net.tylermurphy.hideAndSeek.configuration.Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
Inventory debugMenu = createMenu(map, sender);
sender.openInventory(debugMenu);
}
private Inventory createMenu(net.tylermurphy.hideAndSeek.configuration.Map map, Player sender){
Map<Integer, Consumer<Player>> functions = new HashMap<>();
Inventory debugMenu = Main.getInstance().getServer().createInventory(null, 9, "Debug Menu");
debugMenu.setItem(0, createOption(functions, 0, XMaterial.LEATHER_CHESTPLATE.parseMaterial(), "&6Become a &lHider", 1, player -> {
if(mapSaveEnabled) {
if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap();
}
Main.getInstance().getBoard().addHider(player);
PlayerLoader.loadHider(player, map);
if(Main.getInstance().getGame().getStatus() != Status.STARTING)
PlayerLoader.resetPlayer(player, Main.getInstance().getBoard());
}));
debugMenu.setItem(1, createOption(functions, 1, XMaterial.GOLDEN_CHESTPLATE.parseMaterial(), "&cBecome a &lSeeker", 1, player -> {
if(mapSaveEnabled) {
if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap();
}
Main.getInstance().getBoard().addSeeker(player);
PlayerLoader.loadSeeker(player, map);
if(Main.getInstance().getGame().getStatus() != Status.STARTING)
PlayerLoader.resetPlayer(player, Main.getInstance().getBoard());
}));
debugMenu.setItem(2, createOption(functions, 2, XMaterial.IRON_CHESTPLATE.parseMaterial(), "&8Become a &lSpectator", 1, player -> {
if(mapSaveEnabled) {
if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap();
}
Main.getInstance().getBoard().addSpectator(player);
PlayerLoader.loadSpectator(player, map);
}));
debugMenu.setItem(3, createOption(functions, 3, XMaterial.BARRIER.parseMaterial(), "&cUnload from Game", 1, player -> {
Main.getInstance().getBoard().remove(player);
PlayerLoader.unloadPlayer(player);
exitPosition.teleport(player);
}));
debugMenu.setItem(4, createOption(functions, 4, XMaterial.BARRIER.parseMaterial(), "&cDie In Game", 2, player -> {
if((Main.getInstance().getBoard().isSeeker(player) || Main.getInstance().getBoard().isHider(player)) && Main.getInstance().getGame().getStatus() == Status.PLAYING){
player.setHealth(0.1);
}
}));
if(map.isBlockHuntEnabled()) {
debugMenu.setItem(7, createOption(functions, 7, XMaterial.GLASS.parseMaterial(), "&dEnable Disguise", 1, player -> {
PlayerLoader.openBlockHuntPicker(player, map);
}));
debugMenu.setItem(8, createOption(functions, 8, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> Main.getInstance().getDisguiser().reveal(player)));
}
debugMenuFunctions.put(sender, functions);
return debugMenu;
}
private ItemStack createOption(Map<Integer, Consumer<Player>> functions, int slow, Material material, String name, int amount, Consumer<Player> callback){
ItemStack temp = new ItemStack(material, amount);
ItemMeta meta = temp.getItemMeta();
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
temp.setItemMeta(meta);
functions.put(slow, callback);
return temp;
}
public static void handleOption(Player player, int slotId){
Main.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> {
Consumer<Player> callback = debugMenuFunctions.get(player).get(slotId);
if(callback != null) callback.accept(player);
}, 0);
}
public String getLabel() {
return "debug";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Run debug commands";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,63 @@
package net.tylermurphy.hideAndSeek.command.map;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class GoTo implements ICommand {
public void execute(Player sender, String[] args) {
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
if (map.isNotSetup()) {
sender.sendMessage(errorPrefix + message("MAP_NOT_SETUP").addAmount(map.getName()));
return;
}
switch (args[1].toLowerCase()) {
case "spawn":
map.getSpawn().teleport(sender); break;
case "lobby":
map.getLobby().teleport(sender); break;
case "seekerlobby":
map.getSeekerLobby().teleport(sender); break;
case "exit":
exitPosition.teleport(sender); break;
default:
sender.sendMessage(errorPrefix + message("COMMAND_INVALID_ARG").addAmount(args[1].toLowerCase()));
}
}
public String getLabel() {
return "goto";
}
public String getUsage() {
return "<map> <spawn>";
}
public String getDescription() {
return "Teleport to a map spawn zone";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
} else if(parameter.equals("spawn")) {
return Arrays.asList("spawn","lobby","seekerlobby","exit");
}
return null;
}
}

View file

@ -0,0 +1,47 @@
package net.tylermurphy.hideAndSeek.command.map;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
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) {
Collection<Map> maps = Maps.getAllMaps();
if(maps.size() < 1) {
sender.sendMessage(errorPrefix + message("NO_MAPS"));
return;
}
StringBuilder response = new StringBuilder(messagePrefix + message("LIST_MAPS"));
for(Map map : maps) {
response.append("\n ").append(map.getName()).append(": ").append(map.isNotSetup() ? ChatColor.RED + "NOT SETUP" : ChatColor.GREEN + "SETUP").append(ChatColor.WHITE);
}
sender.sendMessage(response.toString());
}
public String getLabel() {
return "list";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "List all maps in the plugin";
}
public java.util.List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
return null;
}
}

View file

@ -0,0 +1,54 @@
package net.tylermurphy.hideAndSeek.command.map;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
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 Remove implements ICommand {
public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
} else if(!Maps.removeMap(args[0])){
sender.sendMessage(errorPrefix + message("MAP_FAIL_DELETE").addAmount(args[0]));
} else {
sender.sendMessage(messagePrefix + message("MAP_DELETED").addAmount(args[0]));
}
}
public String getLabel() {
return "remove";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Remove a map from the plugin!";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -1,35 +1,22 @@
/* package net.tylermurphy.hideAndSeek.command.map;
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.command;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class SaveMap implements ICommand { public class Save implements ICommand {
public static boolean runningBackup = false; public static boolean runningBackup = false;
@ -42,21 +29,31 @@ public class SaveMap implements ICommand {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return; return;
} }
if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) { Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
if (map.getSpawn().isNotSetup()) {
sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN")); sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN"));
return; return;
} }
if (map.isBoundsNotSetup()) {
sender.sendMessage(errorPrefix + message("ERROR_MAP_BOUNDS"));
return;
}
sender.sendMessage(messagePrefix + message("MAPSAVE_START")); sender.sendMessage(messagePrefix + message("MAPSAVE_START"));
sender.sendMessage(warningPrefix + message("MAPSAVE_WARNING")); sender.sendMessage(warningPrefix + message("MAPSAVE_WARNING"));
World world = Bukkit.getServer().getWorld(spawnWorld); World world = map.getSpawn().load();
if (world == null) { if (world == null) {
throw new RuntimeException("Unable to get world: " + spawnWorld); sender.sendMessage(warningPrefix + message("MAPSAVE_FAIL_WORLD"));
return;
} }
world.save(); world.save();
BukkitRunnable runnable = new BukkitRunnable() { BukkitRunnable runnable = new BukkitRunnable() {
public void run() { public void run() {
sender.sendMessage( sender.sendMessage(
Main.getInstance().getGame().getWorldLoader().save() map.getWorldLoader().save()
); );
runningBackup = false; runningBackup = false;
} }
@ -66,15 +63,22 @@ public class SaveMap implements ICommand {
} }
public String getLabel() { public String getLabel() {
return "saveMap"; return "save";
} }
public String getUsage() { public String getUsage() {
return ""; return "<map>";
} }
public String getDescription() { public String getDescription() {
return "Saves current map for the game. May lag server."; return "Saves the map to its own separate playable map";
} }
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
} }

View file

@ -0,0 +1,79 @@
package net.tylermurphy.hideAndSeek.command.map;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Status implements ICommand {
public void execute(Player sender, String[] args) {
String msg = message("SETUP").toString();
int count = 0;
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
if (map.getSpawn().getBlockX() == 0 && map.getSpawn().getBlockY() == 0 && map.getSpawn().getBlockZ() == 0 || !map.getSpawn().exists()) {
msg = msg + "\n" + message("SETUP_GAME");
count++;
}
if (map.getLobby().getBlockX() == 0 && map.getLobby().getBlockY() == 0 && map.getLobby().getBlockZ() == 0 || !map.getLobby().exists()) {
msg = msg + "\n" + message("SETUP_LOBBY");
count++;
}
if (map.getSeekerLobby().getBlockX() == 0 && map.getSeekerLobby().getBlockY() == 0 && map.getSeekerLobby().getBlockZ() == 0 || !map.getSeekerLobby().exists()) {
msg = msg + "\n" + message("SETUP_SEEKER_LOBBY");
count++;
}
if (exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0 || !exitPosition.exists()) {
msg = msg + "\n" + message("SETUP_EXIT");
count++;
}
if (map.isBoundsNotSetup()) {
msg = msg + "\n" + message("SETUP_BOUNDS");
count++;
}
if (mapSaveEnabled && !map.getGameSpawn().exists()) {
msg = msg + "\n" + message("SETUP_SAVEMAP");
count++;
}
if (map.isBlockHuntEnabled() && map.getBlockHunt().isEmpty()) {
msg = msg + "\n" + message("SETUP_BLOCKHUNT");
}
if (count < 1) {
sender.sendMessage(messagePrefix + message("SETUP_COMPLETE"));
} else {
sender.sendMessage(msg);
}
}
public String getLabel() {
return "status";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Shows what needs to be setup on a map";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,65 @@
package net.tylermurphy.hideAndSeek.command.map.blockhunt;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
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 Enabled implements ICommand {
public void execute(Player sender, String[] args) {
if (!Main.getInstance().supports(9)) {
sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED"));
return;
}
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
boolean bool = Boolean.parseBoolean(args[1]);
map.setBlockhunt(bool, map.getBlockHunt());
Maps.setMap(map.getName(), map);
sender.sendMessage(messagePrefix + message("BLOCKHUNT_SET_TO")
.addAmount(bool ? ChatColor.GREEN + "true" : ChatColor.RED + "false") + ChatColor.WHITE);
}
public String getLabel() {
return "enabled";
}
public String getUsage() {
return "<map> <bool>";
}
public String getDescription() {
return "Sets blockhunt enabled or disabled in a current map";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
if(parameter.equals("bool")) {
return Arrays.asList("true", "false");
}
return null;
}
}

View file

@ -0,0 +1,77 @@
package net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
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 Add implements ICommand {
public void execute(Player sender, String[] args) {
if (!Main.getInstance().supports(9)) {
sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED"));
return;
}
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
Material block;
try { block = Material.valueOf(args[1]); }
catch (IllegalArgumentException e) {
sender.sendMessage(errorPrefix + message("COMMAND_INVALID_ARG").addAmount(args[1]));
return;
}
List<Material> blocks = map.getBlockHunt();
if(blocks.contains(block)) {
sender.sendMessage(errorPrefix + message("BLOCKHUNT_BLOCK_EXISTS").addAmount(args[1]));
}
blocks.add(block);
map.setBlockhunt(map.isBlockHuntEnabled(), blocks);
Maps.setMap(map.getName(), map);
sender.sendMessage(messagePrefix + message("BLOCKHUNT_BLOCK_ADDED").addAmount(args[1]));
}
public String getLabel() {
return "add";
}
public String getUsage() {
return "<map> <block>";
}
public String getDescription() {
return "Add a blockhunt block to a map!";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
} else if(parameter.equals("block")) {
return Arrays.stream(Material.values())
.filter(Material::isBlock)
.map(Material::toString)
.filter(s -> s.toUpperCase().startsWith(typed.toUpperCase()))
.collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,60 @@
package net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.stream.Collectors;
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) {
if (!Main.getInstance().supports(9)) {
sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
java.util.List<Material> blocks = map.getBlockHunt();
if(blocks.isEmpty()) {
sender.sendMessage(errorPrefix + message("NO_BLOCKS"));
return;
}
StringBuilder response = new StringBuilder(messagePrefix + message("BLOCKHUNT_LIST_BLOCKS"));
for(int i = 0; i < blocks.size(); i++) {
response.append(String.format("\n%s. %s", i, blocks.get(i).toString()));
}
sender.sendMessage(response.toString());
}
public String getLabel() {
return "list";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "List all blockhunt blocks in a map";
}
public java.util.List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,77 @@
package net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
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 Remove implements ICommand {
public void execute(Player sender, String[] args) {
if (!Main.getInstance().supports(9)) {
sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED"));
return;
}
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
Material block;
try { block = Material.valueOf(args[1]); }
catch (IllegalArgumentException e) {
sender.sendMessage(errorPrefix + message("COMMAND_INVALID_ARG").addAmount(args[1]));
return;
}
java.util.List<Material> blocks = map.getBlockHunt();
if(!blocks.contains(block)) {
sender.sendMessage(errorPrefix + message("BLOCKHUNT_BLOCK_DOESNT_EXIT").addAmount(args[1]));
}
blocks.remove(block);
map.setBlockhunt(map.isBlockHuntEnabled(), blocks);
Maps.setMap(map.getName(), map);
sender.sendMessage(messagePrefix + message("BLOCKHUNT_BLOCK_REMOVED").addAmount(args[1]));
}
public String getLabel() {
return "remove";
}
public String getUsage() {
return "<map> <block>";
}
public String getDescription() {
return "Remove a blockhunt block from a map!";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
} else if(parameter.equals("block")) {
return Arrays.stream(Material.values())
.filter(Material::isBlock)
.map(Material::toString)
.filter(s -> s.toUpperCase().startsWith(typed.toUpperCase()))
.collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,94 @@
package net.tylermurphy.hideAndSeek.command.map.set;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Border implements ICommand {
public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
if (map.getSpawn().isNotSetup()) {
sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN"));
return;
}
if (args.length < 4) {
map.setWorldBorderData(0, 0, 0, 0, 0);
addToConfig("worldBorder.enabled",false);
saveConfig();
sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE"));
Main.getInstance().getGame().getCurrentMap().getWorldBorder().resetWorldBorder();
return;
}
int num,delay,change;
try { num = Integer.parseInt(args[1]); } catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[0]));
return;
}
try { delay = Integer.parseInt(args[2]); } catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[1]));
return;
}
try { change = Integer.parseInt(args[3]); } catch (Exception e) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[2]));
return;
}
if (num < 100) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_MIN_SIZE"));
return;
}
if (change < 1) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_CHANGE_SIZE"));
return;
}
map.setWorldBorderData(
sender.getLocation().getBlockX(),
sender.getLocation().getBlockZ(),
num,
delay,
change
);
Maps.setMap(map.getName(), map);
sender.sendMessage(messagePrefix + message("WORLDBORDER_ENABLE").addAmount(num).addAmount(delay).addAmount(change));
map.getWorldBorder().resetWorldBorder();
}
public String getLabel() {
return "border";
}
public String getUsage() {
return "<map> <*size> <*delay> <*move>";
}
public String getDescription() {
return "Sets a maps world border information";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return Collections.singletonList(parameter);
}
}

View file

@ -0,0 +1,113 @@
package net.tylermurphy.hideAndSeek.command.map.set;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Bounds implements ICommand {
public void execute(Player sender, String[] args) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
Map map = Maps.getMap(args[0]);
if(map == null) {
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
return;
}
if (map.getSpawn().isNotSetup()) {
sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN"));
return;
}
if (map.getSeekerLobby().isNotSetup()) {
sender.sendMessage(errorPrefix + message("ERROR_GAME_SEEKER_SPAWN"));
return;
}
if (!sender.getWorld().getName().equals(map.getSpawnName())) {
sender.sendMessage(errorPrefix + message("BOUNDS_WRONG_WORLD"));
return;
}
if (sender.getLocation().getBlockX() == 0 || sender.getLocation().getBlockZ() == 0) {
sender.sendMessage(errorPrefix + message("NOT_AT_ZERO"));
return;
}
boolean first = true;
int bxs = map.getBoundsMin().getBlockX();
int bzs = map.getBoundsMin().getBlockZ();
int bxl = map.getBoundsMax().getBlockX();
int bzl = map.getBoundsMax().getBlockZ();
if (bxs != 0 && bzs != 0 && bxl != 0 && bzl != 0) {
bxs = bzs = bxl = bzl = 0;
}
if (bxl == 0) {
bxl = sender.getLocation().getBlockX();
} else if (map.getBoundsMax().getX() < sender.getLocation().getBlockX()) {
first = false;
bxs = bxl;
bxl = sender.getLocation().getBlockX();
} else {
first = false;
bxs = sender.getLocation().getBlockX();
}
if (bzl == 0) {
bzl = sender.getLocation().getBlockZ();
} else if (map.getBoundsMax().getZ() < sender.getLocation().getBlockZ()) {
first = false;
bzs = bzl;
bzl = sender.getLocation().getBlockZ();
} else {
first = false;
bzs = sender.getLocation().getBlockZ();
}
map.setBoundMin(bxs, bzs);
map.setBoundMax(bxl, bzl);
if(!map.isBoundsNotSetup()) {
if(!map.getSpawn().isNotSetup()) {
if(map.getSpawn().isNotInBounds(bxs, bxl, bzs, bzl)) {
map.setSpawn(Location.getDefault());
sender.sendMessage(warningPrefix + message("WARN_SPAWN_RESET"));
}
}
if(!map.getSeekerLobby().isNotSetup()) {
if(map.getSeekerLobby().isNotInBounds(bxs, bxl, bzs, bzl)) {
map.setSeekerLobby(Location.getDefault());
sender.sendMessage(warningPrefix + message("WARN_SEEKER_SPAWN_RESET"));
}
}
}
Maps.setMap(map.getName(), map);
sender.sendMessage(messagePrefix + message("BOUNDS").addAmount(first ? 1 : 2));
}
public String getLabel() {
return "bounds";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Sets the map bounds for the game.";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,41 @@
package net.tylermurphy.hideAndSeek.command.map.set;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.command.location.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.Locations;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
public class Lobby implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.LOBBY, args[0], map -> {
map.setLobby(Location.from(sender));
});
}
public String getLabel() {
return "lobby";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Sets the maps lobby location";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,58 @@
package net.tylermurphy.hideAndSeek.command.map.set;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.command.location.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.Locations;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.List;;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.warningPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class SeekerLobby implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.SEEKER, args[0], map -> {
if(map.getSpawn().isNotSetup()) {
throw new RuntimeException(message("GAME_SPAWN_NEEDED").toString());
}
if(!map.getSpawnName().equals(sender.getLocation().getWorld().getName())) {
throw new RuntimeException(message("SEEKER_LOBBY_INVALID").toString());
}
map.setSeekerLobby(Location.from(sender));
if(!map.isBoundsNotSetup()) {
Vector boundsMin = map.getBoundsMin();
Vector boundsMax = map.getBoundsMax();
if(map.getSeekerLobby().isNotInBounds(boundsMin.getBlockX(), boundsMax.getBlockX(), boundsMin.getBlockZ(), boundsMax.getBlockZ())) {
sender.sendMessage(warningPrefix + message("WARN_MAP_BOUNDS"));
}
}
});
}
public String getLabel() {
return "seekerlobby";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Sets the maps seeker lobby location";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,69 @@
package net.tylermurphy.hideAndSeek.command.map.set;
import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.command.location.LocationUtils;
import net.tylermurphy.hideAndSeek.command.location.Locations;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Spawn implements ICommand {
public void execute(Player sender, String[] args) {
LocationUtils.setLocation(sender, Locations.GAME, args[0], map -> {
if (map.isWorldBorderEnabled() &&
new Vector(sender.getLocation().getX(), 0, sender.getLocation().getZ()).distance(map.getWorldBorderPos()) > 100) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION"));
throw new RuntimeException("World border not enabled or not in valid position!");
}
map.setSpawn(Location.from(sender));
if(!map.isBoundsNotSetup()) {
Vector boundsMin = map.getBoundsMin();
Vector boundsMax = map.getBoundsMax();
if(map.getSpawn().isNotInBounds(boundsMin.getBlockX(), boundsMax.getBlockX(), boundsMin.getBlockZ(), boundsMax.getBlockZ())) {
sender.sendMessage(warningPrefix + message("WARN_MAP_BOUNDS"));
}
}
if(map.getSeekerLobby().getWorld() != null && !map.getSeekerLobby().getWorld().equals(sender.getLocation().getWorld().getName())) {
sender.sendMessage(warningPrefix + message("SEEKER_LOBBY_SPAWN_RESET"));
map.setSeekerLobby(Location.getDefault());
}
if (!sender.getLocation().getWorld().getName().equals(map.getSpawnName()) && mapSaveEnabled) {
map.getWorldLoader().unloadMap();
}
});
}
public String getLabel() {
return "spawn";
}
public String getUsage() {
return "<map>";
}
public String getDescription() {
return "Sets the maps game spawn location";
}
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
if(parameter.equals("map")) {
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
}
return null;
}
}

View file

@ -0,0 +1,188 @@
package net.tylermurphy.hideAndSeek.command.util;
import net.tylermurphy.hideAndSeek.command.map.Save;
import net.tylermurphy.hideAndSeek.util.Pair;
import net.tylermurphy.hideAndSeek.util.Tuple;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.permissionsRequired;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class CommandGroup {
private final Map<String, Object> commandRegister;
private final String label;
public CommandGroup(String label, Object... data) {
this.label = label;
this.commandRegister = new LinkedHashMap<>();
for(Object o : data) {
registerCommand(o);
}
}
public String getLabel() {
return label;
}
private void registerCommand(Object object) {
if (object instanceof ICommand) {
ICommand command = (ICommand) object;
if (!commandRegister.containsKey(command.getLabel())) {
commandRegister.put(command.getLabel().toLowerCase(), command);
}
} else if(object instanceof CommandGroup) {
CommandGroup group = (CommandGroup) object;
if (!commandRegister.containsKey(group.getLabel())) {
commandRegister.put(group.getLabel().toLowerCase(), group);
}
}
}
public void handleCommand(Player player, String[] args) {
Tuple<ICommand, String, String[]> data = getCommand(args, this.getLabel());
if (data == null) {
player.sendMessage(
String.format("%s%sKenshin's Hide and Seek %s(%s1.7.0%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY, ChatColor.WHITE, ChatColor.GRAY) +
String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) +
String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE)
);
return;
}
ICommand command = data.getLeft();
String permission = data.getCenter();
String[] parameters = data.getRight();
if (Save.runningBackup) {
player.sendMessage(errorPrefix + message("MAPSAVE_INPROGRESS"));
return;
}
if (permissionsRequired && !player.hasPermission(permission)) {
player.sendMessage(errorPrefix + message("COMMAND_NOT_ALLOWED"));
return;
}
int parameterCount = (int) Arrays.stream(command.getUsage().split(" ")).filter(p -> p.startsWith("<") && !p.startsWith("<*")).count();
if(parameters.length < parameterCount) {
player.sendMessage(errorPrefix + message("ARGUMENT_COUNT"));
return;
}
try {
command.execute(player, parameters);
} catch (Exception e) {
player.sendMessage(errorPrefix + "An error has occurred.");
e.printStackTrace();
}
}
@Nullable
private Tuple<ICommand, String, String[]> getCommand(String[] args, String permission) {
if(args.length < 1) {
return null;
}
String invoke = args[0];
if(commandRegister.containsKey(invoke)) {
Object o = commandRegister.get(invoke);
if (o instanceof CommandGroup) {
CommandGroup group = (CommandGroup) o;
return group.getCommand(
Arrays.copyOfRange(args, 1, args.length),
permission + "." + group.getLabel()
);
} else if(o instanceof ICommand) {
ICommand command = (ICommand) o;
return new Tuple<>(command, permission + "." + command.getLabel(), Arrays.copyOfRange(args, 1, args.length));
}
}
return null;
}
public List<String> handleTabComplete(Player player, String[] args) {
return handleTabComplete(player, this.getLabel(), args);
}
private List<String> handleTabComplete(Player player, String permission, String[] args) {
String invoke = args[0].toLowerCase();
if (args.length == 1) {
return new ArrayList<>(commandRegister.keySet())
.stream()
.filter(handle -> handle.toLowerCase().startsWith(invoke))
.filter(handle -> {
Object object = commandRegister.get(handle);
if (object instanceof ICommand) {
ICommand command = (ICommand) object;
return !permissionsRequired || player.hasPermission(permission + "." + command.getLabel());
} else if (object instanceof CommandGroup) {
CommandGroup group = (CommandGroup) object;
return !permissionsRequired || group.hasPermission(player, permission + "." + group.getLabel());
}
return false;
})
.collect(Collectors.toList());
} else {
if (commandRegister.containsKey(invoke)) {
Object object = commandRegister.get(invoke);
if (object instanceof CommandGroup) {
CommandGroup group = (CommandGroup) object;
return group.handleTabComplete(player, permission + "." + group.getLabel(), Arrays.copyOfRange(args, 1, args.length));
} else if (object instanceof ICommand) {
ICommand command = (ICommand) object;
String[] usage = command.getUsage().split(" ");
if (args.length - 2 < usage.length) {
String parameter = usage[args.length - 2];
String name = parameter.replace("<", "").replace(">", "");
List<String> list = command.autoComplete(name, args[args.length - 1]);
if (list != null) {
return list;
}
}
}
}
return new ArrayList<>();
}
}
private boolean hasPermission(Player player, String permission) {
for(Object object : commandRegister.values()) {
if(object instanceof ICommand) {
ICommand command = (ICommand) object;
if(player.hasPermission(permission + command.getLabel())) return true;
} else if(object instanceof CommandGroup) {
CommandGroup group = (CommandGroup) object;
if (group.hasPermission(player, permission + this.label + ".")) return true;
}
}
return false;
}
public List<Pair<String, ICommand>> getCommands() {
return getCommands(this.getLabel());
}
private List<Pair<String, ICommand>> getCommands(String prefix) {
List<Pair<String, ICommand>> commands = new LinkedList<>();
for(Object object : commandRegister.values()) {
if(object instanceof ICommand) {
ICommand command = (ICommand) object;
commands.add(new Pair<>(prefix+" "+command.getLabel(), command));
} else if(object instanceof CommandGroup) {
CommandGroup group = (CommandGroup) object;
commands.addAll(group.getCommands(prefix+" "+group.getLabel()));
}
}
return commands;
}
}

View file

@ -0,0 +1,20 @@
package net.tylermurphy.hideAndSeek.command.util;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public interface ICommand {
void execute(Player sender, String[] args);
String getLabel();
String getUsage();
String getDescription();
List<String> autoComplete(@NotNull String parameter, @NotNull String typed);
}

View file

@ -0,0 +1,82 @@
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.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]));
return;
}
WorldType type;
World.Environment environment;
switch (args[1]) {
case "normal":
type = WorldType.NORMAL;
environment = World.Environment.NORMAL;
break;
case "flat":
type = WorldType.FLAT;
environment = World.Environment.NORMAL;
break;
case "nether":
type = WorldType.NORMAL;
environment = World.Environment.NETHER;
break;
case "end":
type = WorldType.NORMAL;
environment = World.Environment.THE_END;
break;
default:
sender.sendMessage(errorPrefix + message("INVALID_WORLD_TYPE").addAmount(args[1]));
return;
}
Location temp = new Location(args[0], 0, 0, 0);
if (temp.load(type, environment) == 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", "nether", "end");
}
return null;
}
}

View file

@ -0,0 +1,76 @@
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]));
return;
}
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));
return;
}
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,57 @@
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.World;
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) {
String status = ChatColor.GRAY + "NOT LOADED";
World bukkit_world = Bukkit.getWorld(world);
if(bukkit_world != null) {
if(bukkit_world.getEnvironment() == World.Environment.NETHER) {
status = ChatColor.RED + "NETHER";
} else if(bukkit_world.getEnvironment() == World.Environment.THE_END) {
status = ChatColor.YELLOW + "THE END";
} else {
status = ChatColor.GREEN + bukkit_world.getWorldType().toString();
}
}
response.append("\n ").append(world).append(": ").append(status).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

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.configuration; package net.tylermurphy.hideAndSeek.configuration;
import com.cryptomorin.xseries.XItemStack; import com.cryptomorin.xseries.XItemStack;
@ -24,16 +5,15 @@ import com.cryptomorin.xseries.XMaterial;
import com.cryptomorin.xseries.XSound; import com.cryptomorin.xseries.XSound;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.util.CountdownDisplay; import net.tylermurphy.hideAndSeek.game.util.CountdownDisplay;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -49,10 +29,6 @@ public class Config {
abortPrefix, abortPrefix,
gameOverPrefix, gameOverPrefix,
warningPrefix, warningPrefix,
spawnWorld,
seekerLobbyWorld,
exitWorld,
lobbyWorld,
locale, locale,
leaveServer, leaveServer,
placeholderError, placeholderError,
@ -64,18 +40,10 @@ public class Config {
databasePass, databasePass,
databaseName; databaseName;
public static Vector
spawnPosition,
lobbyPosition,
exitPosition,
seekerLobbyPosition,
worldBorderPosition;
public static boolean public static boolean
nameTagsVisible, nameTagsVisible,
permissionsRequired, permissionsRequired,
announceMessagesToNonPlayers, announceMessagesToNonPlayers,
worldBorderEnabled,
tauntEnabled, tauntEnabled,
tauntCountdown, tauntCountdown,
tauntLast, tauntLast,
@ -93,20 +61,11 @@ public class Config {
mapSaveEnabled, mapSaveEnabled,
allowNaturalCauses, allowNaturalCauses,
saveInventory, saveInventory,
blockhuntEnabled,
delayedRespawn; delayedRespawn;
public static int public static int
minPlayers, minPlayers,
worldBorderSize,
worldBorderDelay,
currentWorldborderSize,
worldBorderChange,
gameLength, gameLength,
saveMinX,
saveMinZ,
saveMaxX,
saveMaxZ,
tauntDelay, tauntDelay,
glowLength, glowLength,
countdown, countdown,
@ -120,7 +79,6 @@ public class Config {
lobbyItemStartPosition, lobbyItemStartPosition,
flightToggleItemPosition, flightToggleItemPosition,
teleportItemPosition, teleportItemPosition,
solidifyTime,
delayedRespawnDelay; delayedRespawnDelay;
public static float public static float
@ -132,27 +90,6 @@ public class Config {
blockedCommands, blockedCommands,
blockedInteracts; blockedInteracts;
public static List<Material>
blockhuntBlocks;
public static String
LOBBY_TITLE,
GAME_TITLE,
COUNTDOWN_WAITING,
COUNTDOWN_COUNTING,
COUNTDOWN_ADMINSTART,
TAUNT_COUNTING,
TAUNT_ACTIVE,
TAUNT_EXPIRED,
GLOW_ACTIVE,
GLOW_INACTIVE,
BORDER_COUNTING,
BORDER_DECREASING;
public static List<String>
LOBBY_CONTENTS,
GAME_CONTENTS;
public static ItemStack public static ItemStack
lobbyLeaveItem, lobbyLeaveItem,
lobbyStartItem, lobbyStartItem,
@ -166,74 +103,36 @@ public class Config {
public static CountdownDisplay public static CountdownDisplay
countdownDisplay; countdownDisplay;
public static Location
exitPosition;
public static void loadConfig() { public static void loadConfig() {
config = ConfigManager.create("config.yml"); config = ConfigManager.create("config.yml");
config.saveConfig(); config.saveConfig();
ConfigManager leaderboard = ConfigManager.create("leaderboard.yml");
//Spawn
spawnPosition = new Vector(
config.getDouble("spawns.game.x"),
Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.game.y"))),
config.getDouble("spawns.game.z")
);
spawnWorld = config.getString("spawns.game.world");
///Lobby
lobbyPosition = new Vector(
config.getDouble("spawns.lobby.x"),
Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.lobby.y"))),
config.getDouble("spawns.lobby.z")
);
lobbyWorld = config.getString("spawns.lobby.world");
///Seeker Lobby
seekerLobbyPosition = new Vector(
config.getDouble("spawns.seeker.x"),
Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.seeker.y"))),
config.getDouble("spawns.seeker.z")
);
seekerLobbyWorld = config.getString("spawns.seeker.world");
announceMessagesToNonPlayers = config.getBoolean("announceMessagesToNonPlayers"); announceMessagesToNonPlayers = config.getBoolean("announceMessagesToNonPlayers");
exitPosition = new Vector(
config.getDouble("spawns.exit.x"),
Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.exit.y"))),
config.getDouble("spawns.exit.z")
);
exitWorld = config.getString("spawns.exit.world");
//World border
worldBorderPosition = new Vector(
config.getInt("worldBorder.x"),
0,
config.getInt("worldBorder.z")
);
worldBorderSize = Math.max(100, config.getInt("worldBorder.size"));
worldBorderDelay = Math.max(1, config.getInt("worldBorder.delay"));
worldBorderEnabled = config.getBoolean("worldBorder.enabled");
worldBorderChange = config.getInt("worldBorder.moveAmount");
//Prefix //Prefix
char SYMBOLE = '\u00A7'; char SYMBOL = '\u00A7';
String SYMBOLE_STRING = String.valueOf(SYMBOLE); String SYMBOL_STRING = String.valueOf(SYMBOL);
messagePrefix = config.getString("prefix.default").replace("&", SYMBOLE_STRING); messagePrefix = config.getString("prefix.default").replace("&", SYMBOL_STRING);
errorPrefix = config.getString("prefix.error").replace("&", SYMBOLE_STRING); errorPrefix = config.getString("prefix.error").replace("&", SYMBOL_STRING);
tauntPrefix = config.getString("prefix.taunt").replace("&", SYMBOLE_STRING); tauntPrefix = config.getString("prefix.taunt").replace("&", SYMBOL_STRING);
worldBorderPrefix = config.getString("prefix.border").replace("&", SYMBOLE_STRING); worldBorderPrefix = config.getString("prefix.border").replace("&", SYMBOL_STRING);
abortPrefix = config.getString("prefix.abort").replace("&", SYMBOLE_STRING); abortPrefix = config.getString("prefix.abort").replace("&", SYMBOL_STRING);
gameOverPrefix = config.getString("prefix.gameover").replace("&", SYMBOLE_STRING); gameOverPrefix = config.getString("prefix.gameover").replace("&", SYMBOL_STRING);
warningPrefix = config.getString("prefix.warning").replace("&", SYMBOLE_STRING); warningPrefix = config.getString("prefix.warning").replace("&", SYMBOL_STRING);
//Map Bounds // Locations
saveMinX = config.getInt("bounds.min.x"); exitPosition = new Location(
saveMinZ = config.getInt("bounds.min.z"); config.getString("exit.world"),
saveMaxX = config.getInt("bounds.max.x"); config.getInt("exit.x"),
saveMaxZ = config.getInt("bounds.max.z"); config.getInt("exit.y"),
config.getInt("exit.z")
);
mapSaveEnabled = config.getBoolean("mapSaveEnabled"); mapSaveEnabled = config.getBoolean("mapSaveEnabled");
//Taunt //Taunt
@ -289,8 +188,7 @@ public class Config {
try { try {
countdownDisplay = CountdownDisplay.valueOf(config.getString("hideCountdownDisplay")); countdownDisplay = CountdownDisplay.valueOf(config.getString("hideCountdownDisplay"));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
countdownDisplay = CountdownDisplay.CHAT; throw new RuntimeException("hideCountdownDisplay: "+config.getString("hideCountdownDisplay")+", is not a valid configuration option!");
Main.getInstance().getLogger().warning("hideCountdownDisplay: "+config.getString("hideCountdownDisplay")+" is not a valid configuration option!");
} }
blockedInteracts = new ArrayList<>(); blockedInteracts = new ArrayList<>();
List<String> tempInteracts = config.getStringList("blockedInteracts"); List<String> tempInteracts = config.getStringList("blockedInteracts");
@ -305,37 +203,6 @@ public class Config {
} }
bungeeLeave = config.getString("leaveType") == null || config.getString("leaveType").equalsIgnoreCase("proxy"); bungeeLeave = config.getString("leaveType") == null || config.getString("leaveType").equalsIgnoreCase("proxy");
leaveServer = config.getString("leaveServer"); leaveServer = config.getString("leaveServer");
blockhuntEnabled = config.getBoolean("blockhunt.enabled") && Main.getInstance().supports(9);
blockhuntBlocks = new ArrayList<>();
tempInteracts = config.getStringList("blockhunt.blocks");
for(String id : tempInteracts) {
Optional<XMaterial> optional_mat = XMaterial.matchXMaterial(id);
if (optional_mat.isPresent()) {
Material mat = optional_mat.get().parseMaterial();
if (mat != null) {
blockhuntBlocks.add(mat);
}
}
}
solidifyTime = Math.max(20,config.getInt("blockhunt.solidifyTime"));
//Leaderboard
LOBBY_TITLE = leaderboard.getString("lobby.title");
GAME_TITLE = leaderboard.getString("game.title");
LOBBY_CONTENTS = leaderboard.getStringList("lobby.content");
Collections.reverse(LOBBY_CONTENTS);
GAME_CONTENTS = leaderboard.getStringList("game.content");
Collections.reverse(GAME_CONTENTS);
COUNTDOWN_WAITING = leaderboard.getString("countdown.waiting");
COUNTDOWN_COUNTING = leaderboard.getString("countdown.counting");
COUNTDOWN_ADMINSTART = leaderboard.getString("countdown.adminStart");
TAUNT_COUNTING = leaderboard.getString("taunt.counting");
TAUNT_ACTIVE = leaderboard.getString("taunt.active");
TAUNT_EXPIRED = leaderboard.getString("taunt.expired");
GLOW_ACTIVE = leaderboard.getString("glow.active");
GLOW_INACTIVE = leaderboard.getString("glow.inactive");
BORDER_COUNTING = leaderboard.getString("border.counting");
BORDER_DECREASING = leaderboard.getString("border.decreasing");
//Lobby Items //Lobby Items
if (config.getBoolean("lobbyItems.leave.enabled")) { if (config.getBoolean("lobbyItems.leave.enabled")) {
@ -364,8 +231,7 @@ public class Config {
databaseType = config.getString("databaseType").toUpperCase(); databaseType = config.getString("databaseType").toUpperCase();
if(!databaseType.equals("SQLITE") && !databaseType.equals("MYSQL")){ if(!databaseType.equals("SQLITE") && !databaseType.equals("MYSQL")){
Main.getInstance().getLogger().warning("databaseType: "+databaseType+" is not a valid configuration option!"); throw new RuntimeException("databaseType: "+databaseType+" is not a valid configuration option!");
databaseType = "SQLITE";
} }
delayedRespawn = config.getBoolean("delayedRespawn.enabled"); delayedRespawn = config.getBoolean("delayedRespawn.enabled");

View file

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.configuration; package net.tylermurphy.hideAndSeek.configuration;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
@ -25,8 +6,8 @@ import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import java.io.*; import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -93,6 +74,7 @@ public class ConfigManager {
try { try {
this.config.load(reader); this.config.load(reader);
} catch(InvalidConfigurationException e) { } catch(InvalidConfigurationException e) {
Main.getInstance().getLogger().severe(e.getMessage());
throw new RuntimeException("Invalid configuration in config file: "+file.getPath()); throw new RuntimeException("Invalid configuration in config file: "+file.getPath());
} catch(IOException e) { } catch(IOException e) {
throw new RuntimeException("Could not access file: "+file.getPath()); throw new RuntimeException("Could not access file: "+file.getPath());
@ -107,9 +89,10 @@ public class ConfigManager {
try { try {
this.defaultConfig.load(default_reader); this.defaultConfig.load(default_reader);
} catch(InvalidConfigurationException e) { } catch(InvalidConfigurationException e) {
throw new RuntimeException("Invalid configuration in config file: "+file.getPath()); Main.getInstance().getLogger().severe(e.getMessage());
throw new RuntimeException("Invalid configuration in internal config file: "+defaultFilename);
} catch(IOException e) { } catch(IOException e) {
throw new RuntimeException("Could not access file: "+file.getPath()); throw new RuntimeException("Could not access internal file: "+defaultFilename);
} }
try{ try{
@ -124,6 +107,7 @@ public class ConfigManager {
return config.contains(path); return config.contains(path);
} }
@SuppressWarnings("unused")
public double getDouble(String path) { public double getDouble(String path) {
if (!config.contains(path)) { if (!config.contains(path)) {
return defaultConfig.getDouble(path); return defaultConfig.getDouble(path);
@ -226,71 +210,122 @@ public class ConfigManager {
config.set(path, value); config.set(path, value);
} }
public void overwriteConfig() {
try {
this.config.save(file);
} catch (IOException e) {
e.printStackTrace();
}
}
public void saveConfig() { public void saveConfig() {
try { try {
// open config file
InputStream is = Main.getInstance().getResource(defaultFilename); InputStream is = Main.getInstance().getResource(defaultFilename);
// if failed error
if (is == null) { if (is == null) {
throw new RuntimeException("Could not create input stream for "+defaultFilename); throw new RuntimeException("Could not create input stream for "+defaultFilename);
} }
// manually read in each character to preserve string data
StringBuilder textBuilder = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8)); StringBuilder textBuilder = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8));
Reader reader = new BufferedReader(new InputStreamReader(is, Charset.forName(StandardCharsets.UTF_8.name()))); Reader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
int c; int c;
while((c = reader.read()) != -1) { while((c = reader.read()) != -1)
textBuilder.append((char) c); textBuilder.append((char) c);
} // store yaml file into a string
String yamlString = new String(textBuilder.toString().getBytes(), StandardCharsets.UTF_8); String yaml = new String(textBuilder.toString().getBytes(), StandardCharsets.UTF_8);
Map<String, Object> temp = config.getValues(true); // get config values
for(Map.Entry<String, Object> entry: temp.entrySet()) { Map<String, Object> data = config.getValues(true);
if (entry.getValue() instanceof Integer || entry.getValue() instanceof Double || entry.getValue() instanceof String || entry.getValue() instanceof Boolean || entry.getValue() instanceof List) { // write each stored config value into the yaml string
String[] parts = entry.getKey().split("\\."); for(Map.Entry<String, Object> entry: data.entrySet()) {
int index = 0; // if type isn't supported, skip
int i = 0; if(!isSupported(entry.getValue())) continue;
for(String part : parts) { // get index of key in yaml string
if (i == 0) { int index = getIndex(yaml, entry.getKey());
index = yamlString.indexOf(part+":", index); // if index not found, skip
} else { if (index < 10) continue;
index = yamlString.indexOf(" " + part+":", index); // get start and end of the value
index++; int start = yaml.indexOf(' ', index) + 1;
} int end = yaml.indexOf('\n', index);
i++; // if end not found, set it to the end of the file
if (index == -1) break; if (end == -1) end = yaml.length();
} // create new replace sting
if (index < 10) continue; StringBuilder replace = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8));
int start = yamlString.indexOf(' ', index); // get value
int end = yamlString.indexOf('\n', index); Object value = entry.getValue();
if (end == -1) end = yamlString.length(); // if the value is a list,
StringBuilder replace = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8)); if (value instanceof List) {
if (entry.getValue() instanceof List) { end = yaml.indexOf(']', start) + 1;
if (((List<?>) entry.getValue()).isEmpty()) { List<?> list = (List<?>) entry.getValue();
replace.append("[]"); if (list.isEmpty()) {
} else { // if list is empty, put an empty list
replace.append("["); replace.append("[]");
for (Object o : (List<?>) entry.getValue()) {
replace.append(o.toString()).append(", ");
}
replace = new StringBuilder(replace.substring(0, replace.length() - 2));
replace.append("]");
}
} else { } else {
replace.append(entry.getValue()); // if list has values, populate values into the string
// get gap before key
int gap = whitespaceBefore(yaml, index);
String space = new String(new char[gap]).replace('\0', ' ');
replace.append("[\n");
for (int i = 0; i < list.size(); i++) {
replace.append(space).append(" ").append(convert(list.get(i)));
if(i != list.size() -1) replace.append(",\n");
}
replace.append('\n').append(space).append("]");
} }
if (entry.getValue() instanceof String) { // otherwise just put the value directly
replace.append("\""); } else {
replace.reverse(); replace.append(convert(value));
replace.append("\"");
replace.reverse();
}
StringBuilder builder = new StringBuilder(yamlString);
builder.replace(start+1, end, replace.toString());
yamlString = builder.toString();
} }
// replace the new value in the yaml string
StringBuilder builder = new StringBuilder(yaml);
builder.replace(start, end, replace.toString());
yaml = builder.toString();
} }
Writer fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8));
fileWriter.write(yamlString); // write yaml string to file
Writer fileWriter = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(file.toPath()), StandardCharsets.UTF_8));
fileWriter.write(yaml);
fileWriter.close(); fileWriter.close();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
private int getIndex(String yaml, String key) {
String[] parts = key.split("\\.");
int index = 0;
for(String part : parts) {
if (index == 0) {
index = yaml.indexOf("\n" + part + ":", index) + 1;
} else {
index = yaml.indexOf(" " + part + ":", index) + 1;
}
if (index == 0) break;
}
return index;
}
public boolean isSupported(Object o) {
return o instanceof Integer ||
o instanceof Double ||
o instanceof String ||
o instanceof Boolean ||
o instanceof List;
}
public int whitespaceBefore(String yaml, int index) {
int count = 0;
for(int i = index - 1; yaml.charAt(i) == ' '; i--) count++;
return count;
}
private String convert(Object o) {
if(o instanceof String) {
return "\"" + o + "\"";
} else if (o instanceof Boolean) {
return (boolean)o ? "true" : "false";
}
return o.toString();
}
} }

View file

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.configuration; package net.tylermurphy.hideAndSeek.configuration;
import com.cryptomorin.xseries.XItemStack; import com.cryptomorin.xseries.XItemStack;

View file

@ -0,0 +1,51 @@
package net.tylermurphy.hideAndSeek.configuration;
import java.util.Collections;
import java.util.List;
public class Leaderboard {
public static String
LOBBY_TITLE,
GAME_TITLE,
COUNTDOWN_WAITING,
COUNTDOWN_COUNTING,
COUNTDOWN_ADMINSTART,
TAUNT_COUNTING,
TAUNT_ACTIVE,
TAUNT_EXPIRED,
GLOW_ACTIVE,
GLOW_INACTIVE,
BORDER_COUNTING,
BORDER_DECREASING;
public static List<String>
LOBBY_CONTENTS,
GAME_CONTENTS;
public static void loadLeaderboard() {
ConfigManager leaderboard = ConfigManager.create("leaderboard.yml");
LOBBY_TITLE = leaderboard.getString("lobby.title");
GAME_TITLE = leaderboard.getString("game.title");
LOBBY_CONTENTS = leaderboard.getStringList("lobby.content");
Collections.reverse(LOBBY_CONTENTS);
GAME_CONTENTS = leaderboard.getStringList("game.content");
Collections.reverse(GAME_CONTENTS);
COUNTDOWN_WAITING = leaderboard.getString("countdown.waiting");
COUNTDOWN_COUNTING = leaderboard.getString("countdown.counting");
COUNTDOWN_ADMINSTART = leaderboard.getString("countdown.adminStart");
TAUNT_COUNTING = leaderboard.getString("taunt.counting");
TAUNT_ACTIVE = leaderboard.getString("taunt.active");
TAUNT_EXPIRED = leaderboard.getString("taunt.expired");
GLOW_ACTIVE = leaderboard.getString("glow.active");
GLOW_INACTIVE = leaderboard.getString("glow.inactive");
BORDER_COUNTING = leaderboard.getString("border.counting");
BORDER_DECREASING = leaderboard.getString("border.decreasing");
leaderboard.saveConfig();
}
}

View file

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.configuration; package net.tylermurphy.hideAndSeek.configuration;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
@ -31,8 +12,16 @@ public class Localization {
public static final Map<String,LocalizationString> DEFAULT_LOCAL = new HashMap<>(); public static final Map<String,LocalizationString> DEFAULT_LOCAL = new HashMap<>();
private static final Map<String,String[][]> CHANGES = new HashMap<String,String[][]>() {{ private static final Map<String,String[][]> CHANGES = new HashMap<String,String[][]>() {{
put("en-US", new String[][]{{"WORLDBORDER_DECREASING"},{"START","TAUNTED"}}); put("en-US", new String[][]{
put("de-DE", new String[][]{{},{"TAUNTED"}}); {"WORLDBORDER_DECREASING"},
{"START","TAUNTED"},
{"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"}
});
put("de-DE", new String[][]{
{},
{"TAUNTED"},
{"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"}
});
}}; }};
public static void loadLocalization() { public static void loadLocalization() {

View file

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.configuration; package net.tylermurphy.hideAndSeek.configuration;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;

View file

@ -0,0 +1,238 @@
package net.tylermurphy.hideAndSeek.configuration;
import java.util.ArrayList;
import java.util.List;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.events.Border;
import net.tylermurphy.hideAndSeek.world.WorldLoader;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.*;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class Map {
private final String name;
private Location
spawnPosition = Location.getDefault(),
lobbyPosition = Location.getDefault(),
seekerLobbyPosition = Location.getDefault();
private int
xBoundMin = 0,
zBoundMin = 0,
xBoundMax = 0,
zBoundMax = 0,
xWorldBorder = 0,
zWorldBorder = 0,
worldBorderSize = 0,
worldBorderDelay = 0,
worldBorderChange = 0;
private boolean
blockhunt = false;
private List<Material>
blockhuntBlocks = new ArrayList<>();
private final Border
worldBorder;
private final WorldLoader
worldLoader;
public Map(String name) {
this.name = name;
this.worldBorder = new Border(this);
this.worldLoader = new WorldLoader(this);
}
public void setSpawn(Location pos) {
this.spawnPosition = pos;
}
public void setLobby(Location pos) {
this.lobbyPosition = pos;
}
public void setSeekerLobby(Location pos) {
this.seekerLobbyPosition = pos;
}
public void setWorldBorderData(int x, int z, int size, int delay, int move) {
if(size < 1) {
this.worldBorderSize = 0;
this.worldBorderDelay = 0;
this.worldBorderChange = 0;
this.xWorldBorder = 0;
this.zWorldBorder = 0;
} else {
this.worldBorderSize = size;
this.worldBorderDelay = delay;
this.worldBorderChange = move;
this.xWorldBorder = x;
this.zWorldBorder = z;
}
this.worldBorder.resetWorldBorder();
}
public void setBlockhunt(boolean enabled, List<Material> blocks) {
if (Main.getInstance().supports(9)) {
this.blockhunt = enabled;
} else {
this.blockhunt = false;
}
this.blockhuntBlocks = blocks;
}
public void setBoundMin(int x, int z) {
this.xBoundMin = x;
this.zBoundMin = z;
}
public void setBoundMax(int x, int z) {
this.xBoundMax = x;
this.zBoundMax = z;
}
@NotNull
public Location getGameSpawn() {
if(mapSaveEnabled) {
return spawnPosition.changeWorld("hs_"+name);
} else {
return spawnPosition;
}
}
@NotNull
public String getGameSpawnName() {
if(mapSaveEnabled)
return getGameSpawn().getWorld();
else
return getSpawn().getWorld();
}
@NotNull
public Location getSpawn() {
return spawnPosition;
}
@NotNull
public String getSpawnName() {
return getSpawn().getWorld();
}
@NotNull
public Location getLobby() {
return lobbyPosition;
}
@NotNull
public String getLobbyName() {
return getLobby().getWorld();
}
@NotNull
public Location getSeekerLobby() {
return seekerLobbyPosition;
}
@NotNull
public String getSeekerLobbyName() {
return getSeekerLobby().getWorld();
}
@NotNull
public Location getGameSeekerLobby() {
if(mapSaveEnabled) {
return seekerLobbyPosition.changeWorld("hs_"+name);
} else {
return seekerLobbyPosition;
}
}
public boolean isWorldBorderEnabled() {
return worldBorderSize > 0;
}
@NotNull
public Vector getWorldBorderPos() {
return new Vector(
xWorldBorder,
0,
zWorldBorder
);
}
@NotNull
public Vector getWorldBorderData() {
return new Vector(
worldBorderSize,
worldBorderDelay,
worldBorderChange
);
}
@NotNull
public Border getWorldBorder() {
return worldBorder;
}
public boolean isBlockHuntEnabled() {
return blockhunt;
}
@NotNull
public List<Material> getBlockHunt() {
return blockhuntBlocks;
}
@NotNull
public Vector getBoundsMin() {
return new Vector(
xBoundMin,
0,
zBoundMin
);
}
@NotNull
public Vector getBoundsMax() {
return new Vector(
xBoundMax,
0,
zBoundMax
);
}
@NotNull
public String getName() {
return name;
}
@NotNull
public WorldLoader getWorldLoader() {
return worldLoader;
}
public boolean isNotSetup() {
if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0 || !spawnPosition.exists()) return true;
if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0 || !lobbyPosition.exists()) return true;
if (exitPosition == null || exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0 || !exitPosition.exists()) return true;
if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0 || !seekerLobbyPosition.exists()) return true;
if (mapSaveEnabled && !getGameSpawn().exists()) return true;
if (blockhunt && blockhuntBlocks.isEmpty()) return true;
if(isWorldBorderEnabled() &&
new Vector(spawnPosition.getX(), 0, spawnPosition.getZ()).distance(new Vector(xWorldBorder, 0, zWorldBorder)) > 100) return true;
return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0;
}
public boolean isBoundsNotSetup() {
return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0;
}
}

View file

@ -0,0 +1,158 @@
package net.tylermurphy.hideAndSeek.configuration;
import java.util.*;
import java.util.stream.Collectors;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import com.cryptomorin.xseries.XMaterial;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class Maps {
private static final HashMap<String, Map> MAPS = new HashMap<>();
@Nullable
public static Map getMap(String name) {
return MAPS.get(name);
}
@Nullable
public static Map getRandomMap() {
Optional<Map> map;
if(MAPS.values().size() > 0) {
Collection<Map> setupMaps = MAPS.values().stream().filter(m -> !m.isNotSetup()).collect(Collectors.toList());
if(setupMaps.size() < 1) {
return null;
}
map = setupMaps.stream().skip(new Random().nextInt(setupMaps.size())).findFirst();
} else {
map = Optional.empty();
}
return map.orElse(null);
}
public static void setMap(String name, Map map) {
MAPS.put(name, map);
saveMaps();
}
public static boolean removeMap(String name) {
boolean status = MAPS.remove(name) != null;
saveMaps();
return status;
}
@NotNull
public static Collection<Map> getAllMaps() {
return MAPS.values();
}
public static void loadMaps() {
ConfigManager manager = ConfigManager.create("maps.yml");
ConfigurationSection maps = manager.getConfigurationSection("maps");
if(maps == null) return;
Set<String> keys = maps.getKeys(false);
if(keys == null) return;
MAPS.clear();
for(String key : keys) {
MAPS.put(key, parseMap(maps, key));
}
}
private static Map parseMap(ConfigurationSection maps, String name) {
ConfigurationSection data = maps.getConfigurationSection(name);
if(data == null) return null;
Map map = new Map(name);
Main.getInstance().getLogger().info("Loading map: " + name + "...");
map.setSpawn(getSpawn(data, "game"));
map.setLobby(getSpawn(data, "lobby"));
map.setSeekerLobby(getSpawn(data, "seeker"));
map.setBoundMin(data.getInt("bounds.min.x"), data.getInt("bounds.min.z"));
map.setBoundMax(data.getInt("bounds.max.x"), data.getInt("bounds.max.z"));
map.setWorldBorderData(
data.getInt("worldborder.pos.x"),
data.getInt("worldborder.pos.z"),
data.getInt("worldborder.size"),
data.getInt("worldborder.delay"),
data.getInt("worldborder.change")
);
List<String> blockhunt = data.getStringList("blockhunt.blocks");
if(blockhunt == null) blockhunt = new ArrayList<>();
map.setBlockhunt(
data.getBoolean("blockhunt.enabled"),
blockhunt
.stream()
.map(XMaterial::matchXMaterial)
.filter(Optional::isPresent)
.map(e -> e.get().parseMaterial())
.filter(Objects::nonNull)
.collect(Collectors.toList())
);
return map;
}
private static Location getSpawn(ConfigurationSection data, String spawn) {
String world = data.getString("spawns."+spawn+".world");
double x = data.getDouble("spawns."+spawn+".x");
double y = data.getDouble("spawns."+spawn+".y");
double z = data.getDouble("spawns."+spawn+".z");
return new Location(world, x, y, z);
}
private static void saveMaps() {
ConfigManager manager = ConfigManager.create("maps.yml");
ConfigurationSection maps = new YamlConfiguration();
for(Map map : MAPS.values()) {
ConfigurationSection data = new YamlConfiguration();
saveSpawn(data, map.getSpawn(), "game", map);
saveSpawn(data, map.getLobby(), "lobby", map);
saveSpawn(data, map.getSeekerLobby(), "seeker", map);
data.set("bounds.min.x", map.getBoundsMin().getX());
data.set("bounds.min.z", map.getBoundsMin().getZ());
data.set("bounds.max.x", map.getBoundsMax().getX());
data.set("bounds.max.z", map.getBoundsMax().getZ());
data.set("worldborder.pos.x", map.getWorldBorderPos().getX());
data.set("worldborder.pos.z", map.getWorldBorderPos().getZ());
data.set("worldborder.pos.size", map.getWorldBorderData().getX());
data.set("worldborder.pos.delay", map.getWorldBorderData().getY());
data.set("worldborder.pos.change", map.getWorldBorderData().getZ());
data.set("blockhunt.enabled", map.isBlockHuntEnabled());
data.set("blockhunt.blocks", map.getBlockHunt().stream().map(Material::name).collect(Collectors.toList()));
maps.set(map.getName(), data);
}
manager.set("maps", maps);
manager.overwriteConfig();
}
private static void saveSpawn(ConfigurationSection data, Location spawn, String name, Map map) {
String worldName = getWorldName(name, map);
data.set("spawns." + name + ".world", worldName);
data.set("spawns." + name + ".x", spawn.getX());
data.set("spawns." + name + ".y", spawn.getY());
data.set("spawns." + name + ".z", spawn.getZ());
}
private static String getWorldName(String name, Map map) {
switch (name) {
case "game": return map.getSpawnName();
case "lobby": return map.getLobbyName();
case "seeker": return map.getSeekerLobbyName();
default: return null;
}
}
}

View file

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.database; package net.tylermurphy.hideAndSeek.database;
import com.google.common.io.ByteStreams; import com.google.common.io.ByteStreams;
@ -45,8 +26,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

@ -175,10 +175,10 @@ public class GameDataTable {
@NotNull Board board, @NotNull Board board,
@NotNull List<UUID> uuids, @NotNull List<UUID> uuids,
@NotNull List<UUID> winners, @NotNull List<UUID> winners,
@NotNull Map<String,Integer> hider_kills, @NotNull Map<UUID,Integer> hider_kills,
@NotNull Map<String,Integer> hider_deaths, @NotNull Map<UUID,Integer> hider_deaths,
@NotNull Map<String,Integer> seeker_kills, @NotNull Map<UUID,Integer> seeker_kills,
@NotNull Map<String,Integer> seeker_deaths, @NotNull Map<UUID,Integer> seeker_deaths,
@NotNull WinType type @NotNull WinType type
) { ) {
for(UUID uuid : uuids) { for(UUID uuid : uuids) {
@ -192,10 +192,10 @@ public class GameDataTable {
info.getSeekerWins() + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0), info.getSeekerWins() + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0),
info.getHiderGames() + (board.isHider(uuid) || (board.isSeeker(uuid) && !board.getFirstSeeker().getUniqueId().equals(uuid)) ? 1 : 0), info.getHiderGames() + (board.isHider(uuid) || (board.isSeeker(uuid) && !board.getFirstSeeker().getUniqueId().equals(uuid)) ? 1 : 0),
info.getSeekerGames() + (board.getFirstSeeker().getUniqueId().equals(uuid) ? 1 : 0), info.getSeekerGames() + (board.getFirstSeeker().getUniqueId().equals(uuid) ? 1 : 0),
info.getHiderKills() + hider_kills.getOrDefault(uuid.toString(), 0), info.getHiderKills() + hider_kills.getOrDefault(uuid, 0),
info.getSeekerKills() + seeker_kills.getOrDefault(uuid.toString(), 0), info.getSeekerKills() + seeker_kills.getOrDefault(uuid, 0),
info.getHiderDeaths() + hider_deaths.getOrDefault(uuid.toString(), 0), info.getHiderDeaths() + hider_deaths.getOrDefault(uuid, 0),
info.getSeekerDeaths() + seeker_deaths.getOrDefault(uuid.toString(), 0) info.getSeekerDeaths() + seeker_deaths.getOrDefault(uuid, 0)
); );
} }
} }

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

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.game; package net.tylermurphy.hideAndSeek.game;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
@ -33,114 +14,133 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Leaderboard.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
@SuppressWarnings("deprecation")
public class Board { public class Board {
private final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>(); private enum Type {
private final Map<String, Player> playerList = new HashMap<>(); HIDER,
private final Map<String, CustomBoard> customBoards = new HashMap<>(); SEEKER,
private final Map<String, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>(); SPECTATOR,
}
private UUID initialSeeker = null;
private final Map<UUID, Type> Players = new HashMap<>();
private final Map<UUID, CustomBoard> customBoards = new HashMap<>();
private final Map<UUID, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>();
public boolean contains(Player player) { public boolean contains(Player player) {
return playerList.containsKey(player.getUniqueId().toString()); return Players.containsKey(player.getUniqueId());
} }
public boolean isHider(Player player) { public boolean isHider(Player player) {
return Hider.contains(player.getUniqueId().toString()); return isHider(player.getUniqueId());
} }
public boolean isHider(UUID uuid) { public boolean isHider(UUID uuid) {
return Hider.contains(uuid.toString()); if(!Players.containsKey(uuid)) return false;
return Players.get(uuid) == Type.HIDER;
} }
public boolean isSeeker(Player player) { public boolean isSeeker(Player player) {
return Seeker.contains(player.getUniqueId().toString()); return isSeeker(player.getUniqueId());
} }
public boolean isSeeker(UUID uuid) { public boolean isSeeker(UUID uuid) {
return Seeker.contains(uuid.toString()); if(!Players.containsKey(uuid)) return false;
return Players.get(uuid) == Type.SEEKER;
} }
public boolean isSpectator(Player player) { public boolean isSpectator(Player player) {
return Spectator.contains(player.getUniqueId().toString()); return isSpectator(player.getUniqueId());
}
public boolean isSpectator(UUID uuid) {
if(!Players.containsKey(uuid)) return false;
return Players.get(uuid) == Type.SPECTATOR;
} }
public int sizeHider() { public int sizeHider() {
return Hider.size(); return getHiders().size();
} }
public int sizeSeeker() { public int sizeSeeker() {
return Seeker.size(); return getSeekers().size();
} }
public int size() { public int size() {
return playerList.values().size(); return getPlayers().size();
} }
public List<Player> getHiders() { public List<Player> getHiders() {
return Hider.stream().filter(Objects::nonNull).map(playerList::get).collect(Collectors.toList()); return Players.keySet().stream()
.filter(s -> Players.get(s) == Type.HIDER)
.map(Bukkit::getPlayer)
.filter(Objects::nonNull)
.collect(Collectors.toList());
} }
public List<Player> getSeekers() { public List<Player> getSeekers() {
return Seeker.stream().filter(Objects::nonNull).map(playerList::get).collect(Collectors.toList()); return Players.keySet().stream()
} .filter(s -> Players.get(s) == Type.SEEKER)
.map(Bukkit::getPlayer)
public Player getFirstSeeker() { .filter(Objects::nonNull)
return playerList.get(Seeker.get(0)); .collect(Collectors.toList());
} }
public List<Player> getSpectators() { public List<Player> getSpectators() {
return Spectator.stream().filter(Objects::nonNull).map(playerList::get).collect(Collectors.toList()); return Players.keySet().stream()
.filter(s -> Players.get(s) == Type.SPECTATOR)
.map(Bukkit::getPlayer)
.filter(Objects::nonNull)
.collect(Collectors.toList());
} }
public List<Player> getPlayers() { public List<Player> getPlayers() {
return playerList.values().stream().filter(Objects::nonNull).collect(Collectors.toList()); return Players.keySet().stream()
.map(Bukkit::getPlayer)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
public Player getFirstSeeker() {
if(initialSeeker == null) return null;
return Bukkit.getPlayer(initialSeeker);
} }
public Player getPlayer(UUID uuid) { public Player getPlayer(UUID uuid) {
return playerList.get(uuid.toString()); if(!Players.containsKey(uuid)) {
return null;
}
return Bukkit.getPlayer(uuid);
} }
public void addHider(Player player) { public void addHider(Player player) {
Hider.add(player.getUniqueId().toString()); Players.put(player.getUniqueId(), Type.HIDER);
Seeker.remove(player.getUniqueId().toString());
Spectator.remove(player.getUniqueId().toString());
playerList.put(player.getUniqueId().toString(), player);
} }
public void addSeeker(Player player) { public void addSeeker(Player player) {
Hider.remove(player.getUniqueId().toString()); if(initialSeeker == null) {
Seeker.add(player.getUniqueId().toString()); initialSeeker = player.getUniqueId();
Spectator.remove(player.getUniqueId().toString()); }
playerList.put(player.getUniqueId().toString(), player); Players.put(player.getUniqueId(), Type.SEEKER);
} }
public void addSpectator(Player player) { public void addSpectator(Player player) {
Hider.remove(player.getUniqueId().toString()); Players.put(player.getUniqueId(), Type.SPECTATOR);
Seeker.remove(player.getUniqueId().toString());
Spectator.add(player.getUniqueId().toString());
playerList.put(player.getUniqueId().toString(), player);
} }
public void remove(Player player) { public void remove(Player player) {
Hider.remove(player.getUniqueId().toString()); Players.remove(player.getUniqueId());
Seeker.remove(player.getUniqueId().toString());
Spectator.remove(player.getUniqueId().toString());
playerList.remove(player.getUniqueId().toString());
} }
public boolean onSameTeam(Player player1, Player player2) { public boolean onSameTeam(Player player1, Player player2) {
if (Hider.contains(player1.getUniqueId().toString()) && Hider.contains(player2.getUniqueId().toString())) return true; return Players.get(player1.getUniqueId()) == Players.get(player2.getUniqueId());
else if (Seeker.contains(player1.getUniqueId().toString()) && Seeker.contains(player2.getUniqueId().toString())) return true;
else return Spectator.contains(player1.getUniqueId().toString()) && Spectator.contains(player2.getUniqueId().toString());
} }
public void reload() { public void reload() {
Hider.clear(); Players.replaceAll((u, v) -> Type.HIDER);
Seeker.clear();
Spectator.clear();
hider_kills.clear(); hider_kills.clear();
seeker_kills.clear(); seeker_kills.clear();
hider_deaths.clear(); hider_deaths.clear();
@ -148,47 +148,38 @@ public class Board {
} }
public void addKill(UUID uuid) { public void addKill(UUID uuid) {
if (Hider.contains(uuid.toString())) { if(Players.get(uuid) == Type.HIDER) {
if (hider_kills.containsKey(uuid.toString())) { int kills = hider_kills.getOrDefault(uuid, 0);
hider_kills.put(uuid.toString(), hider_kills.get(uuid.toString())+1); hider_kills.put(uuid, kills + 1);
} else { } else if(Players.get(uuid) == Type.SEEKER) {
hider_kills.put(uuid.toString(), 1); int kills = seeker_kills.getOrDefault(uuid, 0);
} seeker_kills.put(uuid, kills + 1);
} else if (Seeker.contains(uuid.toString())) {
if (seeker_kills.containsKey(uuid.toString())) {
seeker_kills.put(uuid.toString(), seeker_kills.get(uuid.toString())+1);
} else {
seeker_kills.put(uuid.toString(), 1);
}
} }
} }
public void addDeath(UUID uuid) { public void addDeath(UUID uuid) {
if (Hider.contains(uuid.toString())) { if(Players.get(uuid) == Type.HIDER) {
if (hider_deaths.containsKey(uuid.toString())) { int kills = hider_deaths.getOrDefault(uuid, 0);
hider_deaths.put(uuid.toString(), hider_deaths.get(uuid.toString())+1); hider_deaths.put(uuid, kills + 1);
} else { } else if(Players.get(uuid) == Type.SEEKER) {
hider_deaths.put(uuid.toString(), 1); int kills = seeker_deaths.getOrDefault(uuid, 0);
} seeker_deaths.put(uuid, kills + 1);
} else if (Seeker.contains(uuid.toString())) {
if (seeker_deaths.containsKey(uuid.toString())) {
seeker_deaths.put(uuid.toString(), seeker_deaths.get(uuid.toString())+1);
} else {
seeker_deaths.put(uuid.toString(), 1);
}
} }
} }
public Map<String, Integer> getHiderKills() { public Map<UUID, Integer> getHiderKills() {
return new HashMap<>(hider_kills); return new HashMap<>(hider_kills);
} }
public Map<String, Integer> getSeekerKills() {
public Map<UUID, Integer> getSeekerKills() {
return new HashMap<>(seeker_kills); return new HashMap<>(seeker_kills);
} }
public Map<String, Integer> getHiderDeaths() {
public Map<UUID, Integer> getHiderDeaths() {
return new HashMap<>(hider_deaths); return new HashMap<>(hider_deaths);
} }
public Map<String, Integer> getSeekerDeaths() {
public Map<UUID, Integer> getSeekerDeaths() {
return new HashMap<>(seeker_deaths); return new HashMap<>(seeker_deaths);
} }
@ -197,7 +188,7 @@ public class Board {
} }
private void createLobbyBoard(Player player, boolean recreate) { private void createLobbyBoard(Player player, boolean recreate) {
CustomBoard board = customBoards.get(player.getUniqueId().toString()); CustomBoard board = customBoards.get(player.getUniqueId());
if (recreate || board == null) { if (recreate || board == null) {
board = new CustomBoard(player, LOBBY_TITLE); board = new CustomBoard(player, LOBBY_TITLE);
board.updateTeams(); board.updateTeams();
@ -219,14 +210,22 @@ public class Board {
} else if (line.contains("{SEEKER%}")) { } else if (line.contains("{SEEKER%}")) {
board.setLine(String.valueOf(i), line.replace("{SEEKER%}", getSeekerPercent()+"")); board.setLine(String.valueOf(i), line.replace("{SEEKER%}", getSeekerPercent()+""));
} else if (line.contains("{HIDER%}")) { } else if (line.contains("{HIDER%}")) {
board.setLine(String.valueOf(i), line.replace("{HIDER%}", getHiderPercent()+"")); board.setLine(String.valueOf(i), line.replace("{HIDER%}", getHiderPercent() + ""));
} else if (line.contains("{MAP}")) {
board.setLine(String.valueOf(i), line.replace("{MAP}", getMapName() + ""));
} else { } else {
board.setLine(String.valueOf(i), line); board.setLine(String.valueOf(i), line);
} }
i++; i++;
} }
board.display(); board.display();
customBoards.put(player.getUniqueId().toString(), board); customBoards.put(player.getUniqueId(), board);
}
public String getMapName() {
net.tylermurphy.hideAndSeek.configuration.Map map = Main.getInstance().getGame().getCurrentMap();
if(map == null) return "Invalid";
else return map.getName();
} }
public void createGameBoard(Player player) { public void createGameBoard(Player player) {
@ -234,7 +233,7 @@ public class Board {
} }
private void createGameBoard(Player player, boolean recreate) { private void createGameBoard(Player player, boolean recreate) {
CustomBoard board = customBoards.get(player.getUniqueId().toString()); CustomBoard board = customBoards.get(player.getUniqueId());
if (recreate || board == null) { if (recreate || board == null) {
board = new CustomBoard(player, GAME_TITLE); board = new CustomBoard(player, GAME_TITLE);
board.updateTeams(); board.updateTeams();
@ -244,7 +243,7 @@ public class Board {
Status status = Main.getInstance().getGame().getStatus(); Status status = Main.getInstance().getGame().getStatus();
Taunt taunt = Main.getInstance().getGame().getTaunt(); Taunt taunt = Main.getInstance().getGame().getTaunt();
Border worldBorder = Main.getInstance().getGame().getBorder(); Border worldBorder = Main.getInstance().getGame().getCurrentMap().getWorldBorder();
Glow glow = Main.getInstance().getGame().getGlow(); Glow glow = Main.getInstance().getGame().getGlow();
int i = 0; int i = 0;
@ -259,8 +258,8 @@ public class Board {
String value = getTeam(player); String value = getTeam(player);
board.setLine(String.valueOf(i), line.replace("{TEAM}", value)); board.setLine(String.valueOf(i), line.replace("{TEAM}", value));
} else if (line.contains("{BORDER}")) { } else if (line.contains("{BORDER}")) {
if (!worldBorderEnabled) continue; if (!Main.getInstance().getGame().getCurrentMap().isWorldBorderEnabled()) continue;
if (worldBorder == null || status == Status.STARTING) { if (status == Status.STARTING) {
board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replace("{AMOUNT}", "0"))); board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replace("{AMOUNT}", "0")));
} else if (!worldBorder.isRunning()) { } else if (!worldBorder.isRunning()) {
board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replaceFirst("\\{AMOUNT}", worldBorder.getDelay()/60+"").replaceFirst("\\{AMOUNT}", worldBorder.getDelay()%60+""))); board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replaceFirst("\\{AMOUNT}", worldBorder.getDelay()/60+"").replaceFirst("\\{AMOUNT}", worldBorder.getDelay()%60+"")));
@ -271,7 +270,7 @@ public class Board {
if (!tauntEnabled) continue; if (!tauntEnabled) continue;
if (taunt == null || status == Status.STARTING) { if (taunt == null || status == Status.STARTING) {
board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replace("{AMOUNT}", "0"))); board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replace("{AMOUNT}", "0")));
} else if (!tauntLast && Hider.size() == 1) { } else if (!tauntLast && sizeHider() == 1) {
board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_EXPIRED)); board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_EXPIRED));
} else if (!taunt.isRunning()) { } else if (!taunt.isRunning()) {
board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replaceFirst("\\{AMOUNT}", taunt.getDelay() / 60 + "").replaceFirst("\\{AMOUNT}", taunt.getDelay() % 60 + ""))); board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replaceFirst("\\{AMOUNT}", taunt.getDelay() / 60 + "").replaceFirst("\\{AMOUNT}", taunt.getDelay() % 60 + "")));
@ -289,6 +288,8 @@ public class Board {
board.setLine(String.valueOf(i), line.replace("{#SEEKER}", getSeekers().size()+"")); board.setLine(String.valueOf(i), line.replace("{#SEEKER}", getSeekers().size()+""));
} else if (line.contains("{#HIDER}")) { } else if (line.contains("{#HIDER}")) {
board.setLine(String.valueOf(i), line.replace("{#HIDER}", getHiders().size()+"")); board.setLine(String.valueOf(i), line.replace("{#HIDER}", getHiders().size()+""));
} else if (line.contains("{MAP}")) {
board.setLine(String.valueOf(i), line.replace("{MAP}", getMapName() + ""));
} else { } else {
board.setLine(String.valueOf(i), line); board.setLine(String.valueOf(i), line);
} }
@ -296,23 +297,23 @@ public class Board {
i++; i++;
} }
board.display(); board.display();
customBoards.put(player.getUniqueId().toString(), board); customBoards.put(player.getUniqueId(), board);
} }
public void removeBoard(Player player) { public void removeBoard(Player player) {
ScoreboardManager manager = Bukkit.getScoreboardManager(); ScoreboardManager manager = Bukkit.getScoreboardManager();
assert manager != null; assert manager != null;
player.setScoreboard(manager.getMainScoreboard()); player.setScoreboard(manager.getMainScoreboard());
customBoards.remove(player.getUniqueId().toString()); customBoards.remove(player.getUniqueId());
} }
public void reloadLobbyBoards() { public void reloadLobbyBoards() {
for(Player player : playerList.values()) for(Player player : getPlayers())
createLobbyBoard(player, false); createLobbyBoard(player, false);
} }
public void reloadGameBoards() { public void reloadGameBoards() {
for(Player player : playerList.values()) for(Player player : getPlayers())
createGameBoard(player, false); createGameBoard(player, false);
} }
@ -322,17 +323,19 @@ public class Board {
} }
private String getSeekerPercent() { private String getSeekerPercent() {
if (playerList.values().size() < 2) int size = size();
if (size < 2)
return " --"; return " --";
else else
return " "+(int)(100*(1.0/playerList.size())); return " "+(int)(100*(1.0/size));
} }
private String getHiderPercent() { private String getHiderPercent() {
if (playerList.size() < 2) int size = size();
if (size < 2)
return " --"; return " --";
else else
return " "+(int)(100-100*(1.0/playerList.size())); return " "+(int)(100-100*(1.0/size));
} }
private String getTeam(Player player) { private String getTeam(Player player) {
@ -343,10 +346,8 @@ public class Board {
} }
public void cleanup() { public void cleanup() {
playerList.clear(); Players.clear();;
Hider.clear(); initialSeeker = null;
Seeker.clear();
Spectator.clear();
customBoards.clear(); customBoards.clear();
} }

View file

@ -1,21 +1,23 @@
package net.tylermurphy.hideAndSeek.game; package net.tylermurphy.hideAndSeek.game;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.game.util.Disguise; import net.tylermurphy.hideAndSeek.game.util.Disguise;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
public class Disguiser { public class Disguiser {
private final Map<Player, Disguise> disguises; private final HashMap<Player, Disguise> disguises;
public Disguiser(){ public Disguiser(){
this.disguises = new HashMap<>(); this.disguises = new HashMap<>();
} }
public Disguise getDisguise(Player player){ public Disguise getDisguise(Player player){
@ -35,7 +37,7 @@ public class Disguiser {
} }
public void check(){ public void check(){
for(Map.Entry<Player, Disguise> set : disguises.entrySet()){ for(HashMap.Entry<Player, Disguise> set : disguises.entrySet()){
Disguise disguise = set.getValue(); Disguise disguise = set.getValue();
Player player = set.getKey(); Player player = set.getKey();
if(!player.isOnline()) { if(!player.isOnline()) {
@ -47,9 +49,9 @@ public class Disguiser {
} }
} }
public void disguise(Player player, Material material){ public void disguise(Player player, Material material, Map map){
if(!blockhuntEnabled){ if(!map.isBlockHuntEnabled()){
player.sendMessage(errorPrefix + "Please enable blockhunt in config.yml to enable disguises. Blockhunt does not work on 1.8"); player.sendMessage(errorPrefix + message("BLOCKHUNT_DISABLED"));
return; return;
} }
if(disguises.containsKey(player)){ if(disguises.containsKey(player)){

View file

@ -235,11 +235,7 @@ public class EntityHider implements Listener {
destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()}); destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()});
} catch (Exception e){ return false; } } catch (Exception e){ return false; }
// Make the entity disappear // Make the entity disappear
try { manager.sendServerPacket(observer, destroyEntity);
manager.sendServerPacket(observer, destroyEntity);
} catch (InvocationTargetException e) {
throw new RuntimeException("Cannot send server packet.", e);
}
} }
return visibleBefore; return visibleBefore;
} }

View file

@ -24,18 +24,17 @@ import com.cryptomorin.xseries.messages.Titles;
import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams; import com.google.common.io.ByteStreams;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.events.Border; import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.events.Glow; import net.tylermurphy.hideAndSeek.game.events.Glow;
import net.tylermurphy.hideAndSeek.game.events.Taunt; import net.tylermurphy.hideAndSeek.game.events.Taunt;
import net.tylermurphy.hideAndSeek.game.listener.RespawnHandler; import net.tylermurphy.hideAndSeek.game.listener.RespawnHandler;
import net.tylermurphy.hideAndSeek.game.util.*; import net.tylermurphy.hideAndSeek.game.util.*;
import net.tylermurphy.hideAndSeek.world.WorldLoader;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -46,24 +45,25 @@ public class Game {
private final Taunt taunt; private final Taunt taunt;
private final Glow glow; private final Glow glow;
private final Border worldBorder;
private final WorldLoader worldLoader;
private final Board board; private final Board board;
private Status status; private Status status;
private Map currentMap;
private int gameTick; private int gameTick;
private int lobbyTimer; private int lobbyTimer;
private int startingTimer; private int startingTimer;
private int gameTimer; private int gameTimer;
private boolean hiderLeft; private boolean hiderLeft;
public Game(Board board){ public Game(Map map, Board board) {
this.currentMap = map;
this.taunt = new Taunt(); this.taunt = new Taunt();
this.glow = new Glow(); this.glow = new Glow();
this.worldBorder = new Border();
this.worldLoader = new WorldLoader(spawnWorld);
this.status = Status.STANDBY; this.status = Status.STANDBY;
@ -92,40 +92,34 @@ public class Game {
return glow; return glow;
} }
public Border getBorder(){
return worldBorder;
}
public Taunt getTaunt(){ public Taunt getTaunt(){
return taunt; return taunt;
} }
public WorldLoader getWorldLoader(){
return worldLoader;
}
public void start() { public void start() {
Player seeker;
try { try {
Optional<Player> rand = board.getPlayers().stream().skip(new Random().nextInt(board.size())).findFirst(); int rand = (int) (Math.random() * board.getPlayers().size());
Player seeker = rand.orElse(board.getPlayers().get(0)); seeker = board.getPlayers().get(rand);
start(seeker);
} catch (Exception e){ } catch (Exception e){
Main.getInstance().getLogger().warning("Failed to select random seeker."); Main.getInstance().getLogger().warning("Failed to select random seeker.");
return;
} }
start(seeker);
} }
public void start(Player seeker) { public void start(Player seeker) {
if (mapSaveEnabled) worldLoader.rollback(); if (mapSaveEnabled) currentMap.getWorldLoader().rollback();
board.reload(); board.reload();
board.addSeeker(seeker); board.addSeeker(seeker);
PlayerLoader.loadSeeker(seeker, getGameWorld()); PlayerLoader.loadSeeker(seeker, currentMap);
board.getPlayers().forEach(player -> { board.getPlayers().forEach(player -> {
if(board.isSeeker(player)) return; if(board.isSeeker(player)) return;
board.addHider(player); board.addHider(player);
PlayerLoader.loadHider(player, getGameWorld()); PlayerLoader.loadHider(player, currentMap);
}); });
board.getPlayers().forEach(board::createGameBoard); board.getPlayers().forEach(board::createGameBoard);
worldBorder.resetWorldBorder(getGameWorld()); currentMap.getWorldBorder().resetWorldBorder();
if (gameLength > 0) gameTimer = gameLength; if (gameLength > 0) gameTimer = gameLength;
status = Status.STARTING; status = Status.STARTING;
startingTimer = 30; startingTimer = 30;
@ -147,21 +141,23 @@ public class Game {
public void end() { public void end() {
board.getPlayers().forEach(PlayerLoader::unloadPlayer); board.getPlayers().forEach(PlayerLoader::unloadPlayer);
worldBorder.resetWorldBorder(getGameWorld()); currentMap.getWorldBorder().resetWorldBorder();
Map nextMap = Maps.getRandomMap();
if(nextMap != null) this.currentMap = nextMap;
board.getPlayers().forEach(player -> { board.getPlayers().forEach(player -> {
if (leaveOnEnd) { if (leaveOnEnd) {
board.removeBoard(player); board.removeBoard(player);
board.remove(player); board.remove(player);
handleBungeeLeave(player); handleBungeeLeave(player);
} else { } else {
player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); currentMap.getLobby().teleport(player);
board.createLobbyBoard(player); board.createLobbyBoard(player);
board.addHider(player); board.addHider(player);
PlayerLoader.joinPlayer(player); PlayerLoader.joinPlayer(player, currentMap);
} }
}); });
RespawnHandler.temp_loc.clear(); RespawnHandler.temp_loc.clear();
if (mapSaveEnabled) worldLoader.unloadMap(); if (mapSaveEnabled) currentMap.getWorldLoader().unloadMap();
board.reloadLobbyBoards(); board.reloadLobbyBoards();
status = Status.ENDED; status = Status.ENDED;
} }
@ -172,14 +168,14 @@ public class Game {
ItemStack[] data = player.getInventory().getContents(); ItemStack[] data = player.getInventory().getContents();
Main.getInstance().getDatabase().getInventoryData().saveInventory(player.getUniqueId(), data); Main.getInstance().getDatabase().getInventoryData().saveInventory(player.getUniqueId(), data);
} }
PlayerLoader.joinPlayer(player); PlayerLoader.joinPlayer(player, currentMap);
board.addHider(player); board.addHider(player);
board.createLobbyBoard(player); board.createLobbyBoard(player);
board.reloadLobbyBoards(); board.reloadLobbyBoards();
if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player));
else broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); else broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player));
} else { } else {
PlayerLoader.loadSpectator(player, getGameWorld()); PlayerLoader.loadSpectator(player, currentMap);
board.addSpectator(player); board.addSpectator(player);
board.createGameBoard(player); board.createGameBoard(player);
player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR")); player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR"));
@ -216,12 +212,12 @@ public class Game {
out.writeUTF(leaveServer); out.writeUTF(leaveServer);
player.sendPluginMessage(Main.getInstance(), "BungeeCord", out.toByteArray()); player.sendPluginMessage(Main.getInstance(), "BungeeCord", out.toByteArray());
} else { } else {
player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); exitPosition.teleport(player);
} }
} }
public void onTick() { public void onTick() {
if (isNotSetup()) return; if (currentMap == null || currentMap.isNotSetup()) return;
if (status == Status.STANDBY) whileWaiting(); if (status == Status.STANDBY) whileWaiting();
else if (status == Status.STARTING) whileStarting(); else if (status == Status.STARTING) whileStarting();
else if (status == Status.PLAYING) whilePlaying(); else if (status == Status.PLAYING) whilePlaying();
@ -257,7 +253,7 @@ public class Game {
board.getPlayers().forEach(player -> { board.getPlayers().forEach(player -> {
PlayerLoader.resetPlayer(player, board); PlayerLoader.resetPlayer(player, board);
if(board.isSeeker(player)){ if(board.isSeeker(player)){
player.teleport(new Location(Bukkit.getWorld(getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); currentMap.getGameSpawn().teleport(player);
} }
}); });
} else if (startingTimer == 1){ } else if (startingTimer == 1){
@ -317,7 +313,7 @@ public class Game {
board.reloadGameBoards(); board.reloadGameBoards();
gameTimer--; gameTimer--;
} }
if (worldBorderEnabled) worldBorder.update(); if (currentMap.isWorldBorderEnabled()) currentMap.getWorldBorder().update();
if (tauntEnabled) taunt.update(); if (tauntEnabled) taunt.update();
if (glowEnabled || alwaysGlow) glow.update(); if (glowEnabled || alwaysGlow) glow.update();
} }
@ -331,21 +327,22 @@ public class Game {
} }
} }
public boolean isNotSetup() { public boolean isCurrentMapValid() {
if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) return true; return currentMap != null && !currentMap.isNotSetup();
if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0) return true;
if (exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) return true;
if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0) return true;
if (mapSaveEnabled) {
File destination = new File(Main.getInstance().getWorldContainer() + File.separator + getGameWorld());
if (!destination.exists()) return true;
}
return saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0;
} }
public String getGameWorld() { public boolean checkCurrentMap() {
if (mapSaveEnabled) return "hideandseek_"+spawnWorld; if(currentMap != null && !currentMap.isNotSetup()) return false;
else return spawnWorld; this.currentMap = Maps.getRandomMap();
return this.currentMap == null;
}
public void setCurrentMap(Map map) {
this.currentMap = map;
}
public Map getCurrentMap() {
return currentMap;
} }
private void checkWinConditions() { private void checkWinConditions() {

View file

@ -23,9 +23,8 @@ import com.cryptomorin.xseries.messages.Titles;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.configuration.Items;
import org.bukkit.Bukkit; import net.tylermurphy.hideAndSeek.configuration.Map;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance; import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -35,30 +34,29 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.lobbyPosition;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class PlayerLoader { public class PlayerLoader {
public static void loadHider(Player player, String gameWorld){ public static void loadHider(Player player, Map map){
player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); map.getGameSpawn().teleport(player);
loadPlayer(player); loadPlayer(player);
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,1000000,5,false,false)); player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,1000000,5,false,false));
Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("HIDER_TEAM_NAME"), ChatColor.WHITE + message("HIDERS_SUBTITLE").toString()); Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("HIDER_TEAM_NAME"), ChatColor.WHITE + message("HIDERS_SUBTITLE").toString());
if(blockhuntEnabled){ if(map.isBlockHuntEnabled()){
openBlockHuntPicker(player); openBlockHuntPicker(player, map);
} }
} }
public static void loadSeeker(Player player, String gameWorld){ public static void loadSeeker(Player player, Map map){
player.teleport(new Location(Bukkit.getWorld(gameWorld), seekerLobbyPosition.getX(),seekerLobbyPosition.getY(),seekerLobbyPosition.getZ())); map.getGameSeekerLobby().teleport(player);
loadPlayer(player); loadPlayer(player);
Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("SEEKER_TEAM_NAME"), ChatColor.WHITE + message("SEEKERS_SUBTITLE").toString()); Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("SEEKER_TEAM_NAME"), ChatColor.WHITE + message("SEEKERS_SUBTITLE").toString());
} }
public static void loadSpectator(Player player, String gameWorld){ public static void loadSpectator(Player player, Map map){
player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); map.getGameSpawn().teleport(player);
loadPlayer(player); loadPlayer(player);
player.setAllowFlight(true); player.setAllowFlight(true);
player.setFlying(true); player.setFlying(true);
@ -115,8 +113,8 @@ public class PlayerLoader {
player.setFallDistance(0.0F); player.setFallDistance(0.0F);
} }
public static void joinPlayer(Player player){ public static void joinPlayer(Player player, Map map){
player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); map.getLobby().teleport(player);
loadPlayer(player); loadPlayer(player);
if (lobbyStartItem != null && (!lobbyItemStartAdmin || player.hasPermission("hideandseek.start"))) if (lobbyStartItem != null && (!lobbyItemStartAdmin || player.hasPermission("hideandseek.start")))
player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem); player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem);
@ -143,11 +141,11 @@ public class PlayerLoader {
} }
} }
public static void openBlockHuntPicker(Player player){ public static void openBlockHuntPicker(Player player, Map map){
int slots = ((blockhuntBlocks.size()-1)/9)*9+9; int slots = ((map.getBlockHunt().size()-1)/9)*9+9;
Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block"); Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block: " + map.getName());
for(int i=0;i<blockhuntBlocks.size();i++){ for(int i=0;i<map.getBlockHunt().size();i++){
inventory.setItem(i, new ItemStack(blockhuntBlocks.get(i))); inventory.setItem(i, new ItemStack(map.getBlockHunt().get(i)));
} }
player.openInventory(inventory); player.openInventory(inventory);
} }

View file

@ -1,8 +1,7 @@
package net.tylermurphy.hideAndSeek.game.events; package net.tylermurphy.hideAndSeek.game.events;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import org.bukkit.Bukkit; import net.tylermurphy.hideAndSeek.configuration.Map;
import org.bukkit.World;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
@ -11,9 +10,13 @@ public class Border {
private int delay; private int delay;
private boolean running; private boolean running;
private final Map map;
private int currentSize;
public Border() { public Border(Map map) {
delay = 60 * worldBorderDelay; this.map = map;
this.delay = (int) (60 * map.getWorldBorderData().getY());
this.currentSize = (int) map.getWorldBorderData().getX();
} }
public void update() { public void update() {
@ -21,7 +24,7 @@ public class Border {
Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_WARN")); Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_WARN"));
} else if (delay == 0) { } else if (delay == 0) {
if (running) { if (running) {
delay = 60 * worldBorderDelay; delay = (int) (60 * map.getWorldBorderData().getY());
running = false; running = false;
} }
else decreaseWorldBorder(); else decreaseWorldBorder();
@ -30,34 +33,32 @@ public class Border {
} }
private void decreaseWorldBorder() { private void decreaseWorldBorder() {
if (currentWorldborderSize == 100) return; if (currentSize == 100) return;
int change = worldBorderChange; if(map.getGameSpawn().load() == null) return;
if (currentWorldborderSize-worldBorderChange < 100) { int change = (int) map.getWorldBorderData().getZ();
change = currentWorldborderSize-100; if (currentSize-change < 100) {
change = currentSize-100;
} }
running = true; running = true;
Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_DECREASING").addAmount(change)); Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_DECREASING").addAmount(change));
currentWorldborderSize -= worldBorderChange; currentSize -= map.getWorldBorderData().getZ();
World world = Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()); org.bukkit.WorldBorder border = map.getGameSpawn().load().getWorldBorder();
assert world != null;
org.bukkit.WorldBorder border = world.getWorldBorder();
border.setSize(border.getSize()-change,30); border.setSize(border.getSize()-change,30);
delay = 30; delay = 30;
} }
public void resetWorldBorder(String worldName) { public void resetWorldBorder() {
World world = Bukkit.getWorld(worldName); if(map.getGameSpawn().load() == null) return;
assert world != null; org.bukkit.WorldBorder border = map.getGameSpawn().load().getWorldBorder();
org.bukkit.WorldBorder border = world.getWorldBorder(); if (map.isWorldBorderEnabled()) {
if (worldBorderEnabled) { border.setSize(map.getWorldBorderData().getX());
border.setSize(worldBorderSize); border.setCenter(map.getWorldBorderPos().getX(), map.getWorldBorderPos().getY());
border.setCenter(worldBorderPosition.getX(), worldBorderPosition.getZ()); currentSize = (int) map.getWorldBorderData().getX();
currentWorldborderSize = worldBorderSize;
} else { } else {
border.setSize(30000000); border.setSize(30000000);
border.setCenter(0, 0); border.setCenter(0, 0);
} }
delay = 60 * worldBorderDelay; delay = (int) (60 * map.getWorldBorderData().getY());
} }
public int getDelay() { public int getDelay() {

View file

@ -6,6 +6,7 @@ import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.util.packet.EntityMetadataPacket;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@ -64,22 +65,13 @@ public class Glow {
} }
public void setGlow(Player player, Player target, boolean glowing) { public void setGlow(Player player, Player target, boolean glowing) {
PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_METADATA);
packet.getIntegers().write(0, target.getEntityId()); EntityMetadataPacket packet = new EntityMetadataPacket();
WrappedDataWatcher watcher = new WrappedDataWatcher(); packet.setEntity(target);
WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class); packet.setGlow(glowing);
watcher.setEntity(target); packet.writeMetadata();
if (glowing) { packet.send(player);
watcher.setObject(0, serializer, (byte) (0x40));
} else {
watcher.setObject(0, serializer, (byte) (0x0));
}
packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects());
try {
protocolManager.sendServerPacket(player, packet);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} }
} }

View file

@ -11,7 +11,7 @@ public class ChatHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onChat(AsyncPlayerChatEvent event) { public void onChat(AsyncPlayerChatEvent event) {
if (Main.getInstance().getBoard().isSeeker(event.getPlayer())) { if (Main.getInstance().getBoard().isSpectator(event.getPlayer())) {
event.setCancelled(true); event.setCancelled(true);
Main.getInstance().getBoard().getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage())); Main.getInstance().getBoard().getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage()));
} }

View file

@ -7,7 +7,6 @@ import net.tylermurphy.hideAndSeek.game.Game;
import net.tylermurphy.hideAndSeek.game.PlayerLoader; import net.tylermurphy.hideAndSeek.game.PlayerLoader;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile; import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -18,7 +17,6 @@ import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.spawnPosition;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class DamageHandler implements Listener { public class DamageHandler implements Listener {
@ -32,8 +30,8 @@ public class DamageHandler implements Listener {
// Define variables // Define variables
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
Player attacker = null; Player attacker = null;
// If no spawn position, we won't be able to manage their death :o // If map is not setup we won't be able to process on it :o
if (spawnPosition == null) { return; } if (!game.isCurrentMapValid()) { return; }
// If there is an attacker, find them // If there is an attacker, find them
if (event instanceof EntityDamageByEntityEvent) { if (event instanceof EntityDamageByEntityEvent) {
if (((EntityDamageByEntityEvent) event).getDamager() instanceof Player) if (((EntityDamageByEntityEvent) event).getDamager() instanceof Player)
@ -44,7 +42,6 @@ public class DamageHandler implements Listener {
} }
// Makes sure that if there was an attacking player, that the event is allowed for the game // Makes sure that if there was an attacking player, that the event is allowed for the game
if (attacker != null) { if (attacker != null) {
System.out.println(event.getFinalDamage() + " " + player.getDisplayName() + " " + attacker.getDisplayName());
// Cancel if one player is in the game but other isn't // Cancel if one player is in the game but other isn't
if ((board.contains(player) && !board.contains(attacker)) || (!board.contains(player) && board.contains(attacker))) { if ((board.contains(player) && !board.contains(attacker)) || (!board.contains(player) && board.contains(attacker))) {
event.setCancelled(true); event.setCancelled(true);
@ -73,9 +70,9 @@ public class DamageHandler implements Listener {
if (board.isSpectator(player)) { if (board.isSpectator(player)) {
event.setCancelled(true); event.setCancelled(true);
if (Main.getInstance().supports(18) && player.getLocation().getBlockY() < -64) { if (Main.getInstance().supports(18) && player.getLocation().getBlockY() < -64) {
player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); game.getCurrentMap().getGameSpawn().teleport(player);
} else if (!Main.getInstance().supports(18) && player.getLocation().getY() < 0) { } else if (!Main.getInstance().supports(18) && player.getLocation().getY() < 0) {
player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); game.getCurrentMap().getGameSpawn().teleport(player);
} }
return; return;
} }
@ -98,15 +95,15 @@ public class DamageHandler implements Listener {
Main.getInstance().getDisguiser().reveal(player); Main.getInstance().getDisguiser().reveal(player);
// Teleport player to seeker spawn // Teleport player to seeker spawn
if(delayedRespawn){ if(delayedRespawn){
player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), seekerLobbyPosition.getX(), seekerLobbyPosition.getY(), seekerLobbyPosition.getZ())); game.getCurrentMap().getGameSeekerLobby().teleport(player);
player.sendMessage(messagePrefix + message("RESPAWN_NOTICE").addAmount(delayedRespawnDelay)); player.sendMessage(messagePrefix + message("RESPAWN_NOTICE").addAmount(delayedRespawnDelay));
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> {
if(game.getStatus() == Status.PLAYING){ if(game.getStatus() == Status.PLAYING){
player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); game.getCurrentMap().getGameSpawn().teleport(player);
} }
}, delayedRespawnDelay * 20L); }, delayedRespawnDelay * 20L);
} else { } else {
player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); game.getCurrentMap().getGameSpawn().teleport(player);
} }
// Add leaderboard stats // Add leaderboard stats
board.addDeath(player.getUniqueId()); board.addDeath(player.getUniqueId());

View file

@ -1,7 +1,6 @@
package net.tylermurphy.hideAndSeek.game.listener; package net.tylermurphy.hideAndSeek.game.listener;
import static com.comphenix.protocol.PacketType.Play.Client.*; import static com.comphenix.protocol.PacketType.Play.Client.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.solidifyTime;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.ProtocolManager;
@ -42,7 +41,7 @@ public class DisguiseHandler implements Listener {
if(lastLocation.getWorld() != currentLocation.getWorld()) return; if(lastLocation.getWorld() != currentLocation.getWorld()) return;
double distance = lastLocation.distance(currentLocation); double distance = lastLocation.distance(currentLocation);
disguise.setSolidify(distance < .1); disguise.setSolidify(distance < .1);
}, solidifyTime); }, 20 * 3);
if(event.getFrom().distance(event.getTo()) > .1) if(event.getFrom().distance(event.getTo()) > .1)
disguise.setSolidify(false); disguise.setSolidify(false);
} }

View file

@ -50,7 +50,7 @@ public class InteractHandler implements Listener {
if (temp.isSimilar(lobbyStartItem) && event.getPlayer().hasPermission("hideandseek.start")) { if (temp.isSimilar(lobbyStartItem) && event.getPlayer().hasPermission("hideandseek.start")) {
event.setCancelled(true); event.setCancelled(true);
if (Main.getInstance().getGame().isNotSetup()) { if (Main.getInstance().getGame().checkCurrentMap()) {
event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP")); event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP"));
return; return;
} }

View file

@ -19,11 +19,11 @@
package net.tylermurphy.hideAndSeek.game.listener; package net.tylermurphy.hideAndSeek.game.listener;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import com.cryptomorin.xseries.XMaterial; import com.cryptomorin.xseries.XMaterial;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.Debug; import net.tylermurphy.hideAndSeek.command.map.Debug;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.configuration.Maps;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -79,17 +79,23 @@ public class InventoryHandler implements Listener {
private void checkForBlockHuntMenu(InventoryClickEvent event){ private void checkForBlockHuntMenu(InventoryClickEvent event){
boolean test; boolean test;
String mapName;
if(Main.getInstance().supports(14)){ if(Main.getInstance().supports(14)){
test = event.getView().getTitle().equals("Select a Block"); test = event.getView().getTitle().startsWith("Select a Block: ");
if(!test) return;
mapName = event.getView().getTitle().substring("Select a Block: ".length());
} else { } else {
test = event.getInventory().getName().equals("Select a Block"); test = event.getInventory().getName().startsWith("Select a Block: ");
if(!test) return;
mapName = event.getInventory().getName().substring("Select a Block: ".length());
} }
if(!test) return;
event.setCancelled(true); event.setCancelled(true);
Material mat = blockhuntBlocks.get(event.getRawSlot()); Map map = Maps.getMap(mapName);
if(map == null) return;
Material mat = map.getBlockHunt().get(event.getRawSlot());
if(mat == null) return; if(mat == null) return;
Player player = (Player) event.getWhoClicked(); Player player = (Player) event.getWhoClicked();
Main.getInstance().getDisguiser().disguise(player, mat); Main.getInstance().getDisguiser().disguise(player, mat, map);
player.closeInventory(); player.closeInventory();
} }
@ -97,17 +103,23 @@ public class InventoryHandler implements Listener {
public void onInventoryClose(InventoryCloseEvent event){ public void onInventoryClose(InventoryCloseEvent event){
if (!(event.getPlayer() instanceof Player)) return; if (!(event.getPlayer() instanceof Player)) return;
boolean test; boolean test;
String mapName;
if(Main.getInstance().supports(14)){ if(Main.getInstance().supports(14)){
test = event.getView().getTitle().equals("Select a Block"); test = event.getView().getTitle().startsWith("Select a Block: ");
if(!test) return;
mapName = event.getView().getTitle().substring("Select a Block: ".length());
} else { } else {
test = event.getInventory().getName().equals("Select a Block"); test = event.getInventory().getName().startsWith("Select a Block: ");
if(!test) return;
mapName = event.getInventory().getName().substring("Select a Block: ".length());
} }
if(!test) return; Map map = Maps.getMap(mapName);
Material mat = blockhuntBlocks.get(0); if(map == null) return;
Material mat = map.getBlockHunt().get(0);
if(mat == null) return; if(mat == null) return;
Player player = (Player) event.getPlayer(); Player player = (Player) event.getPlayer();
if(Main.getInstance().getDisguiser().disguised(player)) return; if(Main.getInstance().getDisguiser().disguised(player)) return;
Main.getInstance().getDisguiser().disguise(player, mat); Main.getInstance().getDisguiser().disguise(player, mat, map);
player.closeInventory(); player.closeInventory();
} }

View file

@ -4,9 +4,7 @@ import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.configuration.Items;
import net.tylermurphy.hideAndSeek.game.PlayerLoader; import net.tylermurphy.hideAndSeek.game.PlayerLoader;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -17,7 +15,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class JoinLeaveHandler implements Listener { public class JoinLeaveHandler implements Listener {
@ -28,20 +26,27 @@ public class JoinLeaveHandler implements Listener {
} }
Main.getInstance().getBoard().remove(event.getPlayer()); Main.getInstance().getBoard().remove(event.getPlayer());
removeItems(event.getPlayer()); removeItems(event.getPlayer());
if (Main.getInstance().getGame().isNotSetup()) return; if (Main.getInstance().getGame().checkCurrentMap()) return;
if (autoJoin) { if (autoJoin) {
if (Main.getInstance().getGame().checkCurrentMap()) {
event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP"));
return;
}
Main.getInstance().getGame().join(event.getPlayer()); Main.getInstance().getGame().join(event.getPlayer());
} else if (teleportToExit) { } else if (teleportToExit) {
if (event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld()) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) { if (
event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getLobbyName()) ||
event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())
) {
exitPosition.teleport(event.getPlayer());
event.getPlayer().setGameMode(GameMode.ADVENTURE); event.getPlayer().setGameMode(GameMode.ADVENTURE);
} }
} else { } else {
if (mapSaveEnabled && event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) { if (mapSaveEnabled && event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) {
if (Main.getInstance().getGame().getStatus() != Status.STANDBY && Main.getInstance().getGame().getStatus() != Status.ENDING) { if (Main.getInstance().getGame().getStatus() != Status.STANDBY && Main.getInstance().getGame().getStatus() != Status.ENDING) {
Main.getInstance().getGame().join(event.getPlayer()); Main.getInstance().getGame().join(event.getPlayer());
} else { } else {
event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); exitPosition.teleport(event.getPlayer());
event.getPlayer().setGameMode(GameMode.ADVENTURE); event.getPlayer().setGameMode(GameMode.ADVENTURE);
} }
} }

View file

@ -2,6 +2,7 @@ package net.tylermurphy.hideAndSeek.game.listener;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.game.listener.events.PlayerJumpEvent; import net.tylermurphy.hideAndSeek.game.listener.events.PlayerJumpEvent;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -12,9 +13,6 @@ import org.bukkit.event.player.PlayerMoveEvent;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.saveMaxZ;
public class MovementHandler implements Listener { public class MovementHandler implements Listener {
private final Set<UUID> prevPlayersOnGround = Sets.newHashSet(); private final Set<UUID> prevPlayersOnGround = Sets.newHashSet();
@ -51,10 +49,11 @@ public class MovementHandler implements Listener {
private void checkBounds(PlayerMoveEvent event){ private void checkBounds(PlayerMoveEvent event){
if (!Main.getInstance().getBoard().contains(event.getPlayer())) return; if (!Main.getInstance().getBoard().contains(event.getPlayer())) return;
if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) return; if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) return;
if (!event.getTo().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) return; if (!event.getTo().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) return;
if (event.getPlayer().hasPermission("hideandseek.leavebounds")) return; if (event.getPlayer().hasPermission("hideandseek.leavebounds")) return;
if (event.getTo().getBlockX() < saveMinX || event.getTo().getBlockX() > saveMaxX || event.getTo().getBlockZ() < saveMinZ || event.getTo().getBlockZ() > saveMaxZ) { Map map = Main.getInstance().getGame().getCurrentMap();
if (event.getTo().getBlockX() < map.getBoundsMin().getBlockX() || event.getTo().getBlockX() > map.getBoundsMax().getBlockX() || event.getTo().getBlockZ() < map.getBoundsMin().getZ() || event.getTo().getBlockZ() > map.getBoundsMax().getZ()) {
event.setCancelled(true); event.setCancelled(true);
} }
} }

View file

@ -2,7 +2,6 @@ package net.tylermurphy.hideAndSeek.game.listener;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.configuration.Items;
import net.tylermurphy.hideAndSeek.game.Game;
import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;

View file

@ -0,0 +1,48 @@
package net.tylermurphy.hideAndSeek.game.listener;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.Board;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityBreakDoorEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
public class WorldInteractHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
Board board = Main.getInstance().getBoard();
if(board.contains(player)) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onHangingEntityBreakByEntity(HangingBreakByEntityEvent event) {
if (!(event.getRemover() instanceof Player)) {
return;
}
Player player = (Player) event.getRemover();
Board board = Main.getInstance().getBoard();
if(board.contains(player)) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBreakDoor(EntityBreakDoorEvent event) {
if (!(event.getEntity() instanceof Player)) {
return;
}
Player player = (Player) event.getEntity();
Board board = Main.getInstance().getBoard();
if(board.contains(player)) {
event.setCancelled(true);
}
}
}

View file

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.game.util; package net.tylermurphy.hideAndSeek.game.util;
public enum Status { public enum Status {

View file

@ -1,22 +1,3 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.game.util; package net.tylermurphy.hideAndSeek.game.util;
public enum WinType { public enum WinType {

View file

@ -1,99 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.util;
import net.tylermurphy.hideAndSeek.command.*;
import net.tylermurphy.hideAndSeek.command.location.SetExitLocation;
import net.tylermurphy.hideAndSeek.command.location.SetLobbyLocation;
import net.tylermurphy.hideAndSeek.command.location.SetSeekerLobbyLocation;
import net.tylermurphy.hideAndSeek.command.location.SetSpawnLocation;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
import static net.tylermurphy.hideAndSeek.configuration.Config.permissionsRequired;
import static net.tylermurphy.hideAndSeek.configuration.Localization.LOCAL;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class CommandHandler {
public static final Map<String,ICommand> COMMAND_REGISTER = new LinkedHashMap<>();
private static void registerCommand(ICommand command) {
if (!COMMAND_REGISTER.containsKey(command.getLabel())) {
COMMAND_REGISTER.put(command.getLabel().toLowerCase(), command);
}
}
public static void registerCommands() {
registerCommand(new About());
registerCommand(new Help());
registerCommand(new Setup());
registerCommand(new Start());
registerCommand(new Stop());
registerCommand(new SetSpawnLocation());
registerCommand(new SetLobbyLocation());
registerCommand(new SetSeekerLobbyLocation());
registerCommand(new SetExitLocation());
registerCommand(new SetBorder());
registerCommand(new Reload());
registerCommand(new SaveMap());
registerCommand(new SetBounds());
registerCommand(new Join());
registerCommand(new Leave());
registerCommand(new Top());
registerCommand(new Wins());
registerCommand(new Debug());
}
public static boolean handleCommand(CommandSender sender, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage(errorPrefix + message("COMMAND_PLAYER_ONLY"));
return true;
}
Player player = (Player) sender;
if (args.length < 1 || !COMMAND_REGISTER.containsKey(args[0].toLowerCase()) ) {
if (permissionsRequired && !sender.hasPermission("hideandseek.about")) {
sender.sendMessage(errorPrefix + LOCAL.get(""));
} else {
COMMAND_REGISTER.get("about").execute(player, null);
}
} else {
if (!args[0].equalsIgnoreCase("about") && !args[0].equalsIgnoreCase("help") && SaveMap.runningBackup) {
sender.sendMessage(errorPrefix + message("MAPSAVE_INPROGRESS"));
} else if (permissionsRequired && !sender.hasPermission("hideandseek."+args[0].toLowerCase())) {
sender.sendMessage(errorPrefix + message("COMMAND_NOT_ALLOWED"));
} else {
try {
COMMAND_REGISTER.get(args[0].toLowerCase()).execute(player,Arrays.copyOfRange(args, 1, args.length));
} catch (Exception e) {
sender.sendMessage(errorPrefix + "An error has occurred.");
e.printStackTrace();
}
}
}
return true;
}
}

View file

@ -0,0 +1,145 @@
package net.tylermurphy.hideAndSeek.util;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.world.VoidGenerator;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.WorldType;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.io.File;
public class Location {
private final String world;
private final double x;
private final double y;
private final double z;
public static Location getDefault() {
return new Location(
"",
0.0,
0.0,
0.0
);
}
public static Location from(Player player) {
org.bukkit.Location location = player.getLocation();
return new Location(
player.getWorld().getName(),
location.getX(),
location.getY(),
location.getZ()
);
}
public Location(@NotNull String world, double x, double y, double z) {
this.world = world;
this.x = x;
this.y = y;
this.z = z;
}
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.Environment environment) {
boolean mapSave = world.startsWith("hs_");
World bukkitWorld = Bukkit.getWorld(world);
if(bukkitWorld != null) return bukkitWorld;
WorldCreator creator = new WorldCreator(world);
if(type != null) {
creator.type(type);
}
if(environment != null) {
creator.environment(environment);
}
if(mapSave) {
creator.generator(new VoidGenerator());
}
Bukkit.getServer().createWorld(creator).setAutoSave(!mapSave);
return Bukkit.getWorld(world);
}
public World load() {
if(!exists()) return null;
if(!Main.getInstance().isLoaded()) return null;
return load(null, null);
}
private org.bukkit.Location toBukkit() {
return new org.bukkit.Location(
Bukkit.getWorld(world),
x,
y,
z
);
}
public void teleport(Player player) {
if(!exists()) return;
if(load() == null) return;
player.teleport(toBukkit());
}
public Location changeWorld(String world) {
return new Location(
world,
x,
y,
z
);
}
public String getWorld() {
return world;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getZ() {
return z;
}
public int getBlockX() {
return (int)x;
}
public int getBlockY() {
return (int)y;
}
public int getBlockZ() {
return (int)z;
}
public boolean exists() {
if(world.equals("")) return false;
String path = Main.getInstance().getWorldContainer()+File.separator+world;
File destination = new File(path);
return destination.isDirectory();
}
public boolean isNotSetup() {
return getBlockX() == 0 && getBlockY() == 0 && getBlockZ() == 0;
}
public boolean isNotInBounds(int xmin, int xmax, int zmin, int zmax) {
return getBlockX() < xmin || getBlockX() > xmax || getBlockZ() < zmin || getBlockZ() > zmax;
}
}

View file

@ -0,0 +1,21 @@
package net.tylermurphy.hideAndSeek.util;
public class Pair<L, R> {
private final L left;
private final R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public L getLeft() {
return left;
}
public R getRight() {
return right;
}
}

View file

@ -1,59 +0,0 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.util;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
public class TabCompleter {
public static List<String> handleTabComplete(CommandSender sender, String[] args) {
if (args.length == 1) {
return new ArrayList<>(CommandHandler.COMMAND_REGISTER.keySet())
.stream()
.filter(handle -> sender.hasPermission("hideandseek."+handle.toLowerCase()) && handle.toLowerCase().startsWith(args[0].toLowerCase(Locale.ROOT)))
.collect(Collectors.toList());
} else if (args.length > 1) {
if (!CommandHandler.COMMAND_REGISTER.containsKey(args[0].toLowerCase())) {
return null;
} else {
String[] usage = CommandHandler.COMMAND_REGISTER.get(args[0].toLowerCase()).getUsage().split(" ");
if (args.length - 2 < usage.length) {
String parameter = usage[args.length-2];
if (parameter.equals("<player>")) {
return null;
} else {
List<String> temp = new ArrayList<>();
temp.add(parameter.replace("<", "").replace(">", ""));
return temp;
}
} else {
return null;
}
}
}
return null;
}
}

View file

@ -0,0 +1,27 @@
package net.tylermurphy.hideAndSeek.util;
public class Tuple<L, C, R> {
private final L left;
private final C center;
private final R right;
public Tuple(L left, C center, R right) {
this.left = left;
this.center = center;
this.right = right;
}
public L getLeft() {
return left;
}
public C getCenter() {
return center;
}
public R getRight() {
return right;
}
}

View file

@ -23,9 +23,7 @@ public class AbstractPacket {
} }
public void send(Player player){ public void send(Player player){
try { protocolManager.sendServerPacket(player, packet);
protocolManager.sendServerPacket(player, packet);
} catch (InvocationTargetException ignored) {}
} }
} }

View file

@ -0,0 +1,70 @@
package net.tylermurphy.hideAndSeek.util.packet;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.wrappers.WrappedDataValue;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class EntityMetadataPacket extends AbstractPacket {
private final WrappedDataWatcher watcher;
private final WrappedDataWatcher.Serializer serializer;
public EntityMetadataPacket(){
super(PacketType.Play.Server.ENTITY_METADATA);
watcher = new WrappedDataWatcher();
serializer = WrappedDataWatcher.Registry.get(Byte.class);
}
public void setEntity(@NotNull Entity target){
super.packet.getIntegers().write(0, target.getEntityId());
watcher.setEntity(target);
}
public void setGlow(boolean glowing){
if (glowing) {
watcher.setObject(0, serializer, (byte) (0x40));
} else {
watcher.setObject(0, serializer, (byte) (0x0));
}
}
public void writeMetadata() {
// thank you to
// https://www.spigotmc.org/threads/unable-to-modify-entity-metadata-packet-using-protocollib-1-19-3.582442/
try {
// 1.19.3 And Up
Class.forName("com.comphenix.protocol.wrappers.WrappedDataValue");
final List<WrappedDataValue> wrappedDataValueList = new ArrayList<>();
for(final WrappedWatchableObject entry : watcher.getWatchableObjects()) {
if(entry == null) continue;
final WrappedDataWatcher.WrappedDataWatcherObject watcherObject = entry.getWatcherObject();
wrappedDataValueList.add(
new WrappedDataValue(
watcherObject.getIndex(),
watcherObject.getSerializer(),
entry.getRawValue()
)
);
}
packet.getDataValueCollectionModifier().write(0, wrappedDataValueList);
} catch (ClassCastException | ClassNotFoundException ignored) {
// 1.9 to 1.19.2 And Up
packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects());
}
}
}

View file

@ -1,25 +1,8 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.world; package net.tylermurphy.hideAndSeek.world;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -36,41 +19,27 @@ public class VoidGenerator extends ChunkGenerator {
return Collections.emptyList(); return Collections.emptyList();
} }
public boolean shouldGenerateNoise() { @Override
return false; public boolean canSpawn(World world, int x, int z) {
}
public boolean shouldGenerateSurface() {
return false;
}
public boolean shouldGenerateBedrock() {
return false;
}
public boolean shouldGenerateCaves() {
return false;
}
public boolean shouldGenerateDecorations() {
return false;
}
public boolean shouldGenerateMobs() {
return false;
}
public boolean shouldGenerateStructures() {
return false;
}
public boolean canSpawn(@NotNull World world, int x, int z) {
return true; return true;
} }
@Override
public Location getFixedSpawnLocation(World world, Random random) {
return new Location(world, 0, 100, 0);
}
// 1.13 And Prev // 1.13 And Prev
public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
return createChunkData(world); ChunkData chunkData = super.createChunkData(world);
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
biome.setBiome(x, z, Biome.PLAINS);
}
}
return chunkData;
} }
// 1.8 // 1.8

View file

@ -1,27 +1,8 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.world; package net.tylermurphy.hideAndSeek.world;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Map;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
@ -32,46 +13,43 @@ import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message; import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class WorldLoader { public class WorldLoader {
private String mapName;
private String saveName;
public WorldLoader(String mapName) {
this.mapName = mapName;
this.saveName = "hideandseek_"+ mapName;
}
public void setNewMap(String mapName){ private final Map map;
this.mapName = mapName;
this.saveName = "hideandseek_"+ mapName; public WorldLoader(Map map) {
this.map = map;
} }
public World getWorld() { public World getWorld() {
return Bukkit.getServer().getWorld(saveName); return Bukkit.getServer().getWorld(map.getGameSpawnName());
} }
public void unloadMap() { public void unloadMap() {
World world = Bukkit.getServer().getWorld(saveName); World world = Bukkit.getServer().getWorld(map.getGameSpawnName());
if (world == null) { if (world == null) {
Main.getInstance().getLogger().warning(saveName + " already unloaded."); Main.getInstance().getLogger().warning(map.getGameSpawnName() + " already unloaded.");
return; return;
} }
world.getPlayers().forEach(player -> player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()))); world.getPlayers().forEach(player -> exitPosition.teleport(player));
if (Bukkit.getServer().unloadWorld(world, false)) { Main.getInstance().scheduleTask(() -> {
Main.getInstance().getLogger().info("Successfully unloaded " + saveName); if (Bukkit.getServer().unloadWorld(world, false)) {
}else{ Main.getInstance().getLogger().info("Successfully unloaded " + map.getGameSpawnName());
Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + saveName); } else {
} Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + map.getGameSpawnName());
}
});
} }
public void loadMap() { public void loadMap() {
Bukkit.getServer().createWorld(new WorldCreator(saveName).generator(new VoidGenerator())); Main.getInstance().scheduleTask(() -> {
World world = Bukkit.getServer().getWorld(saveName); Bukkit.getServer().createWorld(new WorldCreator(map.getGameSpawnName()).generator(new VoidGenerator()));
if (world == null) { World world = Bukkit.getServer().getWorld(map.getGameSpawnName());
Main.getInstance().getLogger().severe("COULD NOT LOAD " + saveName); if (world == null) {
return; Main.getInstance().getLogger().severe("COULD NOT LOAD " + map.getGameSpawnName());
} return;
world.setAutoSave(false); }
world.setAutoSave(false);
});
} }
public void rollback() { public void rollback() {
@ -80,15 +58,15 @@ public class WorldLoader {
} }
public String save() { public String save() {
World world = Bukkit.getServer().getWorld(mapName); World world = Bukkit.getServer().getWorld(map.getSpawnName());
if(world == null){ if(world == null){
throw new RuntimeException("Invalid world to save: " + mapName); return errorPrefix + message("MAPSAVE_INVALID").addAmount(map.getSpawnName());
} }
File current = new File(Main.getInstance().getWorldContainer()+File.separator+ mapName); File current = new File(Main.getInstance().getWorldContainer()+File.separator+ map.getSpawnName());
if (current.exists()) { if (current.exists()) {
try { try {
File destination = new File(Main.getInstance().getWorldContainer()+File.separator+ saveName); File destination = new File(Main.getInstance().getWorldContainer()+File.separator+ map.getGameSpawnName());
File temp_destination = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ saveName); File temp_destination = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ map.getGameSpawnName());
copyFileFolder("region",true); copyFileFolder("region",true);
copyFileFolder("entities",true); copyFileFolder("entities",true);
copyFileFolder("datapacks",false); copyFileFolder("datapacks",false);
@ -101,7 +79,7 @@ public class WorldLoader {
} }
if (!temp_destination.renameTo(destination)) { if (!temp_destination.renameTo(destination)) {
throw new RuntimeException("Failed to rename directory: "+temp_destination.getPath()); return errorPrefix + message("MAPSAVE_FAIL_DIR").addAmount(temp_destination.getPath());
} }
} catch(IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
@ -114,8 +92,8 @@ public class WorldLoader {
} }
private void copyFileFolder(String name, Boolean isMca) throws IOException { private void copyFileFolder(String name, Boolean isMca) throws IOException {
File region = new File(Main.getInstance().getWorldContainer()+File.separator+ mapName +File.separator+name); File region = new File(Main.getInstance().getWorldContainer()+File.separator+ map.getSpawnName() +File.separator+name);
File temp = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ saveName +File.separator+name); File temp = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ map.getGameSpawnName() +File.separator+name);
if (region.exists() && region.isDirectory()) { if (region.exists() && region.isDirectory()) {
if (!temp.exists()) if (!temp.exists())
if (!temp.mkdirs()) if (!temp.mkdirs())
@ -127,10 +105,10 @@ public class WorldLoader {
} }
for (String file : files) { for (String file : files) {
if (isMca) { if (isMca) {
int minX = (int)Math.floor(saveMinX / 512.0); int minX = (int)Math.floor(map.getBoundsMin().getX() / 512.0);
int minZ = (int)Math.floor(saveMinZ / 512.0); int minZ = (int)Math.floor(map.getBoundsMin().getZ() / 512.0);
int maxX = (int)Math.floor(saveMaxX / 512.0); int maxX = (int)Math.floor(map.getBoundsMax().getX() / 512.0);
int maxZ = (int)Math.floor(saveMaxZ / 512.0); int maxZ = (int)Math.floor(map.getBoundsMax().getZ() / 512.0);
String[] parts = file.split("\\."); String[] parts = file.split("\\.");
if (parts.length > 1) { if (parts.length > 1) {
@ -162,7 +140,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

@ -15,23 +15,23 @@ gameLength: 1200
announceMessagesToNonPlayers: true announceMessagesToNonPlayers: true
# When the game is starting, the plugin will state there is x seconds left to hide. # When the game is starting, the plugin will state there is x seconds left to hide.
# You change where countdown messages to be displayed: in the chat, action bar, or a title. # You change where countdown messages are to be displayed: in the chat, action bar, or a title.
# Below you can set CHAT, ACTIONBAR, or TITLE. Any invalid option will revert to CHAT. # Below you can set CHAT, ACTIONBAR, or TITLE. Any invalid option will revert to CHAT.
# #
# CHAT - Messages will be displayed in the chat # CHAT - Staring messages will be displayed in the chat
# #
# ACTIONBAR - Messages will be displayed in the action bar (area above the hotbar) # ACTIONBAR - Staring messages will be displayed in the action bar (area above the hotbar)
# #
# TITLE - Messages will be displayed as a title # TITLE - Staring messages will be displayed as a title
# #
# default: CHAT # default: CHAT
hideCountdownDisplay: CHAT hideCountdownDisplay: "CHAT"
# Allow Hiders to see their own teams nametags as well as seekers. Seekers can never see nametags regardless. # Allow Hiders to see their own teams nametags as well as seekers. Seekers can never see nametags regardless.
# default: false # default: false
nametagsVisible: false nametagsVisible: false
# Require bukkit permissions though a plugin to run commands, recommended on large servers # Require bukkit permissions though a permissions plugin to run commands, or require op, recommended on most servers
# default: true # default: true
permissionsRequired: true permissionsRequired: true
@ -80,11 +80,11 @@ leaveOnEnd: false
# PROXY - Send the player to a specified server in a bungee-cord / velocity setup. # PROXY - Send the player to a specified server in a bungee-cord / velocity setup.
# #
# default: EXIT # default: EXIT
leaveType: EXIT leaveType: "EXIT"
# Ignore this setting if you aren't using the PROXY leave type method above. If you are, set this to the server you want to send # Ignore this setting if you aren't using the PROXY leave type method above. If you are, set this to the server you want to send
# players too. # players too.
leaveServer: hub leaveServer: "hub"
# By default, the plugin forces you to use a map save to protect from changes to a map thought a game play though. It copies your # By default, the plugin forces you to use a map save to protect from changes to a map thought a game play though. It copies your
# hide-and-seek world to a separate world, and loads the game there to contain the game in an isolated and backed up map This allows you to # hide-and-seek world to a separate world, and loads the game there to contain the game in an isolated and backed up map This allows you to
@ -117,40 +117,16 @@ delayedRespawn:
# MYSQL - Uses a mysql server to store data, good for multi-server setups or large servers. # MYSQL - Uses a mysql server to store data, good for multi-server setups or large servers.
# #
# default: SQLITE # default: SQLITE
databaseType: SQLITE databaseType: "SQLITE"
# The following settings are used for MYSQL databases ONLY. If you are running SQLITE, these # The following settings are used for MYSQL databases ONLY. If you are running SQLITE, these
# will be ignored. If you are running MYSQL, you need to provide the database host url, database # will be ignored. If you are running MYSQL, you need to provide the database host url, database
# host port (usually 3306), database username, and database password. # host port (usually 3306), database username, and database password.
databaseHost: localhost databaseHost: "localhost"
databasePort: 3306 databasePort: 3306
databaseUser: root databaseUser: "root"
databasePass: databasePass: "pass"
databaseName: hideandseek databaseName: "hideandseek"
# The world border closes every interval, which is evey [delay] in minutes.
# Thw world border starts at [size], and decreases 100 blocks every interval.
# x & z are the center location. [enabled] is whenever the border is enabled.
# You can choose if Hiders are warned 30 seconds before the border moves.
# You want block hunt? We have block hunt! Just enable it below, and set the
# available blocks to pick from, and you're all set! It's that easy!
# Items are displayed in the order that they are listed below.
# The solidifyTime is the time in server ticks that it takes players to solidify.
# Every 20 ticks is a second. Minimum solidifyTime is 20 ticks.
blockhunt:
enabled: false
solidifyTime: 60
blocks: [CRAFTING_TABLE, GRASS_BLOCK, DIRT, BEACON, BOOKSHELF]
worldBorder:
x: 0
z: 0
delay: 10
size: 500
moveAmount: 100
warn: true
enabled: false
# The taunt will activate every delay set in seconds. It will spawn a firework # The taunt will activate every delay set in seconds. It will spawn a firework
# on a random Hider to alert a Seeker where someone may be. You can choose # on a random Hider to alert a Seeker where someone may be. You can choose
@ -173,8 +149,12 @@ glow:
stackable: true stackable: true
enabled: true enabled: true
name: "Glow Powerup" name: "Glow Powerup"
lore: [ "Throw to make all seekers glow", "Last 30s, all hiders can see it", "Time stacks on multi use" ] lore: [
material: SNOWBALL "Throw to make all seekers glow",
"Last 30s, all hiders can see it",
"Time stacks on multi use"
]
material: "SNOWBALL"
model-data: 0 model-data: 0
# This has the same glow effect as the glow powerup in that all seekers positions get # This has the same glow effect as the glow powerup in that all seekers positions get
@ -221,14 +201,16 @@ lobby:
# If you set adminOnly to false, only the item will become non admin only, not the command. # If you set adminOnly to false, only the item will become non admin only, not the command.
lobbyItems: lobbyItems:
leave: leave:
material: BED material: "BED"
name: "&cLeave Lobby" name: "&cLeave Lobby"
lore: ["Go back to server hub"] lore: [
"Go back to server hub"
]
position: 8 position: 8
model-data: 0 model-data: 0
enabled: true enabled: true
start: start:
material: CLOCK material: "CLOCK"
name: "&bStart Game" name: "&bStart Game"
lore: [] lore: []
position: 0 position: 0
@ -241,15 +223,19 @@ lobbyItems:
# and position of the item. You can also change the model data if your server is running 1.14 or above. # and position of the item. You can also change the model data if your server is running 1.14 or above.
spectatorItems: spectatorItems:
flight: flight:
material: FEATHER material: "FEATHER"
name: "&bToggle Flight" name: "&bToggle Flight"
lore: [ "Turns flying on and off" ] lore: [
"Turns flying on and off"
]
position: 3 position: 3
model-data: 0 model-data: 0
teleport: teleport:
material: COMPASS material: "COMPASS"
name: "&bTeleport to Others" name: "&bTeleport to Others"
lore: [ "Allows you to teleport to all other players in game" ] lore: [
"Allows you to teleport to all other players in game"
]
position: 5 position: 5
model-data: 0 model-data: 0
@ -265,8 +251,8 @@ seekerPing:
leadingVolume: 0.5 leadingVolume: 0.5
volume: 0.3 volume: 0.3
pitch: 1 pitch: 1
heartbeatNoise: BLOCK_NOTE_BLOCK_BASEDRUM heartbeatNoise: "BLOCK_NOTE_BLOCK_BASEDRUM"
ringingNoise: BLOCK_NOTE_BLOCK_PLING ringingNoise: "BLOCK_NOTE_BLOCK_PLING"
enabled: true enabled: true
# Changes the default plugin language. Currently, Supported localizations are: # Changes the default plugin language. Currently, Supported localizations are:
@ -275,58 +261,34 @@ seekerPing:
locale: "en-US" locale: "en-US"
# Stop commands being run by any user while playing the game. # Stop commands being run by any user while playing the game.
# Can be usefull If you aren't using a permission plugin and want # Can be usefull If you aren't using a permission plugin and don't want
# to op people, but still want to block certain commands. # to op people, but still want to block certain commands.
# Not really usefully if using permission plugins. # Not really usefully if using permission plugins.
# You can add /kill for any use, but it's already blocked on those # You can add /kill for any use, but it's already blocked on those
# playing the game. # playing the game.
blockedCommands: [msg, tp, gamemode, kill, give, effect] blockedCommands: [
"msg",
"reply",
"me"
]
# Stop interactions with any block by any user while playing the game. # Stop interactions with any block by any user while playing the game.
# If your map has things such as chests for aesthetic only, you can # If your map has things such as chests for aesthetic only, you can
# block the use of clicking them. It shouldn't matter what version of # block the use of clicking them. It shouldn't matter what version of
# the block ID you enter, as the plugin will automatically switch to the # the block ID you enter, as the plugin will automatically switch to the
# block ID of your current Minecraft server version. # block ID of your current Minecraft server version.
blockedInteracts: [FURNACE, CRAFTING_TABLE, ANVIL, CHEST, BARREL] blockedInteracts: [
# ---------------------------------------------------------- # "FURNACE",
# ONLY EDIT BEYOND THIS POINT IF YOU KNOW WHAT YOU ARE DOING # "CRAFTING_TABLE",
# ---------------------------------------------------------- # "ANVIL",
"CHEST",
"BARREL"
]
# The 2 coordinate bounds that will contain your hideAndSeek map. Its recommended # Location where players are teleported when they exit (/hs leave)
# that you use /hs setbounds for this, and not edit this directly, as breaking # Auto filled by /hs setexit, so you don't need to touch this here
# this section will completely break the entire plugin when you run /hs savemap. exit:
bounds: x: 0
min: y: 0
x: 0 z: 0
z: 0 world: "world"
max:
x: 0
z: 0
# Spawn locations where players are teleported
spawns:
# Location where players are teleported into the game (/hs start)
game:
x: 0
y: 0
z: 0
world: world
# Location where players are teleported into the lobby (/hs join)
lobby:
x: 0
y: 0
z: 0
world: world
# Location where seekers wait during the hiding grace period
seeker:
x: 0
y: 0
z: 0
# Currently is not used, seekers are teleported to spawns.game.world
world: world
# Location where players are teleported when they exit (/hs leave)
exit:
x: 0
y: 0
z: 0
world: world

View file

@ -10,6 +10,7 @@ Localization:
COMMAND_PLAYER_ONLY: "Dieser Befehl kann nur als Spieler ausgeführt werden." COMMAND_PLAYER_ONLY: "Dieser Befehl kann nur als Spieler ausgeführt werden."
COMMAND_NOT_ALLOWED: "Es ist dir nicht gestattet diesen Befehl auszuführen." COMMAND_NOT_ALLOWED: "Es ist dir nicht gestattet diesen Befehl auszuführen."
COMMAND_ERROR: "Ein unbekannter Fehler ist aufgetreten." COMMAND_ERROR: "Ein unbekannter Fehler ist aufgetreten."
COMMAND_INVALID_ARG: "Ungültiges Argument: {AMOUNT}"
GAME_PLAYER_DEATH: "&c{PLAYER}&f ist gestorben." GAME_PLAYER_DEATH: "&c{PLAYER}&f ist gestorben."
GAME_PLAYER_FOUND: "&e{PLAYER}&f wurde gefunden und ist nun ein Seeker." GAME_PLAYER_FOUND: "&e{PLAYER}&f wurde gefunden und ist nun ein Seeker."
GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f wurde von &c{PLAYER}&f gefunden und ist nun ein Seeker." GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f wurde von &c{PLAYER}&f gefunden und ist nun ein Seeker."
@ -17,7 +18,7 @@ Localization:
GAME_GAMEOVER_SEEKERS_QUIT: "All Seeker haben das Spiel verlassen." GAME_GAMEOVER_SEEKERS_QUIT: "All Seeker haben das Spiel verlassen."
GAME_GAMEOVER_HIDERS_QUIT: "All Hider haben das Spiel verlassen." GAME_GAMEOVER_HIDERS_QUIT: "All Hider haben das Spiel verlassen."
GAME_GAMEOVER_TIME: "Seekers haben keine Spielzeit mehr. Die Hiders haben gewonnen!" GAME_GAMEOVER_TIME: "Seekers haben keine Spielzeit mehr. Die Hiders haben gewonnen!"
GAME_SETUP: "Spiel wurde noch nicht eingerichtet. Führe &c/hs setup&f aus, um die Einrichtungsschritte zu sehen." GAME_SETUP: "Es gibt keine Setup-Karten! Führen Sie /hs map status auf einer Karte aus, um zu sehen, was Sie tun müssen."
GAME_INGAME: "Du bist bereits in der Lobby oder im Spiel." GAME_INGAME: "Du bist bereits in der Lobby oder im Spiel."
GAME_NOT_INGAME: "Du bist weder in einer Lobby noch in einem Spiel." GAME_NOT_INGAME: "Du bist weder in einer Lobby noch in einem Spiel."
GAME_INPROGRESS: "Es läuft bereits ein Spiel." GAME_INPROGRESS: "Es läuft bereits ein Spiel."
@ -25,6 +26,7 @@ Localization:
GAME_JOIN: "{PLAYER} hat die Hide and Seek Lobby betreten." GAME_JOIN: "{PLAYER} hat die Hide and Seek Lobby betreten."
GAME_JOIN_SPECTATOR: "Du bist als Beobachter einem laufenden Spiel beigetreten." GAME_JOIN_SPECTATOR: "Du bist als Beobachter einem laufenden Spiel beigetreten."
GAME_LEAVE: "{PLAYER} hat die Hide and Seek Lobby verlassen." GAME_LEAVE: "{PLAYER} hat die Hide and Seek Lobby verlassen."
LOBBY_IN_USE: "Die Lobby kann nicht verändert werden, solange die Lobby nicht leer ist."
CONFIG_RELOAD: "Konfiguration neu geladen." CONFIG_RELOAD: "Konfiguration neu geladen."
MAPSAVE_INPROGRESS: "Weltkarte wird aktuell gespeichert. Versuche es später nochmal." MAPSAVE_INPROGRESS: "Weltkarte wird aktuell gespeichert. Versuche es später nochmal."
MAPSAVE_START: "Starte Speichervorgang der Weltkarte" MAPSAVE_START: "Starte Speichervorgang der Weltkarte"
@ -32,6 +34,9 @@ Localization:
MAPSAVE_END: "Speichervorgang abgeschlossen." MAPSAVE_END: "Speichervorgang abgeschlossen."
MAPSAVE_ERROR: "Aktuelle Weltkarte konnte nicht gefunden werden." MAPSAVE_ERROR: "Aktuelle Weltkarte konnte nicht gefunden werden."
MAPSAVE_DISABLED: "Mapsave ist in config.yml deaktiviert." MAPSAVE_DISABLED: "Mapsave ist in config.yml deaktiviert."
MAPSAVE_FAIL_WORLD: "Mapsave fehlgeschlagen. Die aktuelle Welt konnte nicht geladen werden."
MAPSAVE_INVALID: "Ungültige Welt zum Speichern: {AMOUNT}"
MAPSAVE_FAIL_DIR: "Verzeichnis konnte nicht umbenannt werden: {AMOUNT}"
WORLDBORDER_DISABLE: "World Border ausgeschaltet." WORLDBORDER_DISABLE: "World Border ausgeschaltet."
WORLDBORDER_INVALID_INPUT: "Ungültiger Wert: {AMOUNT}" WORLDBORDER_INVALID_INPUT: "Ungültiger Wert: {AMOUNT}"
WORLDBORDER_MIN_SIZE: "World Border darf nicht geringer als 100 Blöcke sein." WORLDBORDER_MIN_SIZE: "World Border darf nicht geringer als 100 Blöcke sein."
@ -39,24 +44,32 @@ Localization:
WORLDBORDER_ENABLE: "Setze World Border zentriert von dieser Position aus. Größe: {AMOUNT}. Verzögerung: {AMOUNT}." WORLDBORDER_ENABLE: "Setze World Border zentriert von dieser Position aus. Größe: {AMOUNT}. Verzögerung: {AMOUNT}."
WORLDBORDER_DECREASING: "World Norder schrumpoft 100 Blöcke über die nächsten 30 Sekunden!" WORLDBORDER_DECREASING: "World Norder schrumpoft 100 Blöcke über die nächsten 30 Sekunden!"
WORLDBORDER_WARN: "Die Weltgrenze wird in den nächsten 30er Jahren schrumpfen!" WORLDBORDER_WARN: "Die Weltgrenze wird in den nächsten 30er Jahren schrumpfen!"
WORLDBORDER_CHANGE_SIZE: "Die Änderung der Weltgrenze kann nicht 0 oder weniger sein."
TAUNTED: "&c&oOh nein! Du wurdest geärgert!" TAUNTED: "&c&oOh nein! Du wurdest geärgert!"
TAUNT: "Ein zufälliger Hider wird in den nächsten 30 Sekunden geärgert." TAUNT: "Ein zufälliger Hider wird in den nächsten 30 Sekunden geärgert."
TAUNT_ACTIVATE: "Ärgern wurde aktiviert" TAUNT_ACTIVATE: "Ärgern wurde aktiviert"
ERROR_GAME_SPAWN: "Bitte erst die Spawn-Position für das Spiel festlegen." ERROR_GAME_SPAWN: "Bitte erst die Spawn-Position für das Spiel festlegen."
ERROR_GAME_SEEKER_SPAWN: "Bitte setze zuerst den Sucher-Spawn-Ort"
ERROR_MAP_BOUNDS: "Bitte setzen Sie die Grenzen der Karte vor dem Speichern"
WARN_MAP_BOUNDS: "Dieser Ort liegt nicht innerhalb der Kartengrenzen, dies könnte Probleme verursachen"
WARN_SPAWN_RESET: "Spiel-Spawn wurde zurückgesetzt, da er nicht innerhalb der Kartengrenzen liegt"
WARN_SEEKER_SPAWN_RESET: "Seeker-Spawn zurückgesetzt, da er nicht innerhalb der Kartengrenzen liegt"
SETUP: "&f&lFühre die folgenden Schritte zur Einrichtung aus:" SETUP: "&f&lFühre die folgenden Schritte zur Einrichtung aus:"
SETUP_GAME: "&c&l- &fTeleport-Position für den Spielbeginn festlegen mit /hs setspawn" SETUP_GAME: "&c&l- &fSpielspawn ist nicht gesetzt, /hs map set spawn <map>"
SETUP_LOBBY: "&c&l- &fTeleport-Position für die Lobby festlegen mit /hs setlobby" SETUP_LOBBY: "&c&l- &fLobby-Spawn ist nicht gesetzt, /hs map set lobby <map>"
SETUP_SEEKER_LOBBY: "&c&l- &fTeleport-Position für die Lobby Seekern festlegen mit /hs setseekerlobby" SETUP_SEEKER_LOBBY: "&c&l- &fSucherlobby-Spawn ist nicht gesetzt, /hs map set seekerlobby <map>"
SETUP_EXIT: "&c&l- &fTeleport-Position für das Spielende festlegen mit /hs setexit" SETUP_EXIT: "&c&l- &fBeenden/Verlassen der Teleportposition ist nicht festgelegt, /hs setexit"
SETUP_SAVEMAP: "&c&l- &fHide and Seek Weltkarte speichern mit /hs savemap (nach /hs setspawn)" SETUP_SAVEMAP: "&c&l- &fVerstecken und Suchen Karte wird nicht gespeichert, /hs map save <map>"
SETUP_COMPLETE: "Alles eingerichtet! Hide and Seek ist spielbereit." SETUP_COMPLETE: "Alles eingerichtet! Hide and Seek ist spielbereit."
SETUP_BOUNDS: "&c&l- &fSpielgrenze in 2 gegenüberliegenden Ecken der Welt festlegen mit /hs setbounds" SETUP_BLOCKHUNT: "&c&l - &fWenn Blockhunt aktiviert ist, muss mindestens 1 Block gesetzt sein, /hs map blockhunt block add block <map> <block>"
SETUP_BOUNDS: "&c&l- &fBitte setzen Sie Spielgrenzen in 2 gegenüberliegenden Ecken der Spielkarte, /hs map set bounds <map>"
GAME_SPAWN: "Teleport-Position für Spielbeginn festgelegt" GAME_SPAWN: "Teleport-Position für Spielbeginn festgelegt"
LOBBY_SPAWN: "Teleport-Position für Lobby festgelegt" LOBBY_SPAWN: "Teleport-Position für Lobby festgelegt"
EXIT_SPAWN: "Teleport-Position für Spielende festgelegt" EXIT_SPAWN: "Teleport-Position für Spielende festgelegt"
SEEKER_SPAWN: "Teleport-Position für Seeker Lobby festgelegt" SEEKER_SPAWN: "Teleport-Position für Seeker Lobby festgelegt"
START_MIN_PLAYERS: "Um das Spiel zu starten benötigst du mindestens {AMOUNT} Spieler." START_MIN_PLAYERS: "Um das Spiel zu starten benötigst du mindestens {AMOUNT} Spieler."
START_INVALID_NAME: "Ungültiger Spieler: {PLAYER}." START_INVALID_NAME: "Ungültiger Spieler: {PLAYER}."
START_FAILED_SEEKER: "Zufälliger Sucher konnte nicht ausgewählt werden."
START_COUNTDOWN: "Die Hider haben {AMOUNT} Sekunden Zeit sich zu verstecken!" START_COUNTDOWN: "Die Hider haben {AMOUNT} Sekunden Zeit sich zu verstecken!"
START_COUNTDOWN_LAST: "Die Hider haben {AMOUNT} Sekunde Zeit sich zu verstecken!" START_COUNTDOWN_LAST: "Die Hider haben {AMOUNT} Sekunde Zeit sich zu verstecken!"
START: "Los, Seeker! Es ist Zeit, die Hider zu finden." START: "Los, Seeker! Es ist Zeit, die Hider zu finden."
@ -76,7 +89,44 @@ Localization:
FLYING_ENABLED: "Fliegen aktiviert" FLYING_ENABLED: "Fliegen aktiviert"
FLYING_DISABLED: "Fliegen deaktiviert" FLYING_DISABLED: "Fliegen deaktiviert"
RESPAWN_NOTICE: "Du wirst in {AMOUNT} Sekunden respawnen." RESPAWN_NOTICE: "Du wirst in {AMOUNT} Sekunden respawnen."
INVALID_MAP: "Das ist ein ungültiger Kartenname!"
MAP_ALREADY_EXISTS: "Diese Karte existiert bereits!"
INVALID_MAP_NAME: "Der Name darf nur Zahlen oder Buchstaben enthalten."
MAP_CREATED: "Neue Karte erstellt: {AMOUNT}"
MAP_FAIL_DELETE: "Karte konnte nicht gelöscht werden: {AMOUNT}"
MAP_DELETED: "Gelöschte Landkarte: {AMOUNT}"
NO_MAPS: "Es gibt keine Karten im Plugin (/hs map add <name>)"
MAP_NOT_SETUP: "Die Karte {AMOUNT} ist nicht eingerichtet (/hs map status <map>)"
LIST_MAPS: "Die aktuellen Karten sind:"
ARGUMENT_COUNT: "Dieser Befehl erfordert mehr Argumente zur Ausführung."
GAME_SPAWN_NEEDED: "Der Hauptspawn muss vor dem Sucherspawn gesetzt werden."
SEEKER_LOBBY_SPAWN_RESET: "Der Spawn der Seeker-Lobby wurde zurückgesetzt, da der Spiel-Spawn in eine neue Welt verschoben wurde."
SEEKER_LOBBY_INVALID: "Die Lobby des Suchers muss sich in der gleichen Welt befinden, in der das Spiel startet."
CONFIG_ERROR: "Fehler beim Neuladen der Konfiguration. Prüfen Sie die Serverprotokolle."
BLOCKHUNT_DISABLED: "Bitte aktivieren Sie Blockhunt in dieser Karte in der maps.yml, um Verkleidungen zu ermöglichen. Blockhunt funktioniert nicht auf 1.8"
BLOCKHUNT_UNSUPPORTED: "Blockhunt funktioniert nicht unter 1.8"
BLOCKHUNT_SET_TO: "Blockjagd eingestellt auf {AMOUNT}."
BLOCKHUNT_BLOCK_EXISTS: "{AMOUNT} ist bereits in der Blockhunt-Konfiguration eingestellt."
BLOCKHUNT_BLOCK_DOESNT_EXIT: "{AMOUNT} ist bereits nicht in der blochunt-Konfiguration eingestellt."
BLOCKHUNT_BLOCK_ADDED: "{AMOUNT} zur Blockhunt-Konfiguration hinzugefügt."
BLOCKHUNT_BLOCK_REMOVED: "Entfernt {AMOUNT} aus der Blockhunt-Konfiguration."
BLOCKHUNT_LIST_BLOCKS: "Die folgenden Blockhunt-Blöcke sind:"
NO_BLOCKS: "Auf dieser Karte gibt es keine Blockhunt-Blöcke."
WORLD_EXISTS: "Eine Welt namens {AMOUNT} existiert bereits."
WORLD_DOESNT_EXIST: "Es gibt keine Welt namens {AMOUNT}, die existiert."
WORLD_ADDED: "Eine Welt mit dem Namen {AMOUNT} erstellt."
WORLD_ADDED_FAILED: "Fehlgeschlagen, eine neue Welt zu erschaffen."
WORLD_REMOVED: "Eine Welt namens {AMOUNT} wurde gelöscht."
WORLD_REMOVED_FAILED: "Welt konnte nicht gelöscht werden."
WORLD_NOT_EMPTY: "In einer zu löschenden Welt darf es keine Spieler geben."
LIST_WORLDS: "Die folgenden Welten sind:"
NO_WORLDS: "Failed to fetch any worlds."
WORLD_LOAD_FAILED: "Es konnten keine Welten geholt werden."
INVALID_WORLD_TYPE: "Ungültiger Welttyp: {AMOUNT}."
NO_CONFIRMATION: "Sie haben nichts zu bestätigen."
CONFIRMATION_TIMED_OUT: "Die Zeit für die Bestätigung ist abgelaufen."
CONFIRMATION: "Führen Sie /hs confirm innerhalb von 10s aus, um zu bestätigen."
# DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE # DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE
version: 3 version: 4
type: "de-DE" type: "de-DE"

View file

@ -10,6 +10,7 @@ Localization:
COMMAND_PLAYER_ONLY: "This command can only be run as a player." COMMAND_PLAYER_ONLY: "This command can only be run as a player."
COMMAND_NOT_ALLOWED: "You are not allowed to run this command." COMMAND_NOT_ALLOWED: "You are not allowed to run this command."
COMMAND_ERROR: "An internal error has occurred." COMMAND_ERROR: "An internal error has occurred."
COMMAND_INVALID_ARG: "Invalid argument: {AMOUNT}"
GAME_PLAYER_DEATH: "&c{PLAYER}&f was killed." GAME_PLAYER_DEATH: "&c{PLAYER}&f was killed."
GAME_PLAYER_FOUND: "&e{PLAYER}&f was found and became a seeker." GAME_PLAYER_FOUND: "&e{PLAYER}&f was found and became a seeker."
GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f was found by &c{PLAYER}&f and became a seeker." GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f was found by &c{PLAYER}&f and became a seeker."
@ -17,7 +18,7 @@ Localization:
GAME_GAMEOVER_SEEKERS_QUIT: "All seekers have quit." GAME_GAMEOVER_SEEKERS_QUIT: "All seekers have quit."
GAME_GAMEOVER_HIDERS_QUIT: "All hiders have quit." GAME_GAMEOVER_HIDERS_QUIT: "All hiders have quit."
GAME_GAMEOVER_TIME: "Seekers ran out of time. Hiders win!" GAME_GAMEOVER_TIME: "Seekers ran out of time. Hiders win!"
GAME_SETUP: "Game is not setup. Run /hs setup to see what you need to do." GAME_SETUP: "There are no setup maps! Run /hs map status on a map to see what you need to do."
GAME_INGAME: "You are already in the lobby/game." GAME_INGAME: "You are already in the lobby/game."
GAME_NOT_INGAME: "You are not in a lobby/game." GAME_NOT_INGAME: "You are not in a lobby/game."
GAME_INPROGRESS: "There is currently a game in progress." GAME_INPROGRESS: "There is currently a game in progress."
@ -25,6 +26,7 @@ Localization:
GAME_JOIN: "{PLAYER} has joined the HideAndSeek lobby." GAME_JOIN: "{PLAYER} has joined the HideAndSeek lobby."
GAME_JOIN_SPECTATOR: "You have joined mid game and are now a spectator." GAME_JOIN_SPECTATOR: "You have joined mid game and are now a spectator."
GAME_LEAVE: "{PLAYER} has left the HideAndSeek lobby." GAME_LEAVE: "{PLAYER} has left the HideAndSeek lobby."
LOBBY_IN_USE: "Cant modify the lobby while the lobby isn't empty."
CONFIG_RELOAD: "Reloaded the config." CONFIG_RELOAD: "Reloaded the config."
MAPSAVE_INPROGRESS: "Map save is currently in progress. Try again later." MAPSAVE_INPROGRESS: "Map save is currently in progress. Try again later."
MAPSAVE_START: "Starting map save." MAPSAVE_START: "Starting map save."
@ -32,6 +34,9 @@ Localization:
MAPSAVE_END: "Map save complete." MAPSAVE_END: "Map save complete."
MAPSAVE_ERROR: "Couldn't find current map." MAPSAVE_ERROR: "Couldn't find current map."
MAPSAVE_DISABLED: "Mapsave is disabled in config.yml." MAPSAVE_DISABLED: "Mapsave is disabled in config.yml."
MAPSAVE_FAIL_WORLD: "Mapsave failed. Failed to load current world."
MAPSAVE_INVALID: "Invalid world to save: {AMOUNT}"
MAPSAVE_FAIL_DIR: "Failed to rename directory: {AMOUNT}"
WORLDBORDER_DISABLE: "Disabled world border." WORLDBORDER_DISABLE: "Disabled world border."
WORLDBORDER_INVALID_INPUT: "Invalid integer {AMOUNT}." WORLDBORDER_INVALID_INPUT: "Invalid integer {AMOUNT}."
WORLDBORDER_MIN_SIZE: "World border cannot be smaller than 100 blocks." WORLDBORDER_MIN_SIZE: "World border cannot be smaller than 100 blocks."
@ -44,13 +49,19 @@ Localization:
TAUNT: "A random hider will be taunted in the next 30s." TAUNT: "A random hider will be taunted in the next 30s."
TAUNT_ACTIVATE: "Taunt has been activated." TAUNT_ACTIVATE: "Taunt has been activated."
ERROR_GAME_SPAWN: "Please set game spawn location first" ERROR_GAME_SPAWN: "Please set game spawn location first"
ERROR_GAME_SEEKER_SPAWN: "Please set seeker spawn location first"
ERROR_MAP_BOUNDS: "Please set map bounds before saving"
WARN_MAP_BOUNDS: "This location is not inside map bounds, this could cause issues"
WARN_SPAWN_RESET: "Game spawn reset due to not being inside map bounds"
WARN_SEEKER_SPAWN_RESET: "Seeker spawn reset due to not being inside map bounds"
SETUP: "&f&lThe following is needed for setup..." SETUP: "&f&lThe following is needed for setup..."
SETUP_GAME: "&c&l- &fGame spawn isn't set, /hs setspawn" SETUP_GAME: "&c&l- &fGame spawn isn't set, /hs map set spawn <map>"
SETUP_LOBBY: "&c&l- &fLobby spawn isn't set, /hs setlobby" SETUP_LOBBY: "&c&l- &fLobby spawn isn't set, /hs map set lobby <map>"
SETUP_SEEKER_LOBBY: "&c&l- &fSeeker Lobby spawn isn't set, /hs setseekerlobby" SETUP_SEEKER_LOBBY: "&c&l- &fSeeker Lobby spawn isn't set, /hs map set seekerlobby <map>"
SETUP_EXIT: "&c&l- &fQuit/exit teleport location isn't set, /hs setexit" SETUP_EXIT: "&c&l- &fQuit/exit teleport location isn't set, /hs setexit"
SETUP_SAVEMAP: "&c&l- &fHide and seek map isn't saved, /hs savemap (after /hs setspawn)" SETUP_SAVEMAP: "&c&l- &fHide and seek map isn't saved, /hs map save <map>"
SETUP_BOUNDS: "&c&l- &fPlease set game bounds in 2 opposite corners of the game map, /hs setbounds" SETUP_BOUNDS: "&c&l- &fPlease set game bounds in 2 opposite corners of the game map, /hs map set bounds <map>"
SETUP_BLOCKHUNT: "&c&l - &fIf blockhunt is enabled, there needs to be at least 1 block set, /hs map blockhunt block add block <map> <block>"
SETUP_COMPLETE: "Everything is setup and ready to go!" SETUP_COMPLETE: "Everything is setup and ready to go!"
GAME_SPAWN: "Set game spawn position to current location" GAME_SPAWN: "Set game spawn position to current location"
LOBBY_SPAWN: "Set lobby position to current location" LOBBY_SPAWN: "Set lobby position to current location"
@ -58,6 +69,7 @@ Localization:
SEEKER_SPAWN: "Set seeker lobby position to current location" SEEKER_SPAWN: "Set seeker lobby position to current location"
START_MIN_PLAYERS: "You must have at least {AMOUNT} players to start." START_MIN_PLAYERS: "You must have at least {AMOUNT} players to start."
START_INVALID_NAME: "Invalid player: {PLAYER}." START_INVALID_NAME: "Invalid player: {PLAYER}."
START_FAILED_SEEKER: "Failed to select random seeker."
START_COUNTDOWN: "Hiders have {AMOUNT} seconds to hide!" START_COUNTDOWN: "Hiders have {AMOUNT} seconds to hide!"
START_COUNTDOWN_LAST: "Hiders have {AMOUNT} second to hide!" START_COUNTDOWN_LAST: "Hiders have {AMOUNT} second to hide!"
START: "Attention SEEKERS, its time to find the hiders!" START: "Attention SEEKERS, its time to find the hiders!"
@ -77,7 +89,44 @@ Localization:
FLYING_ENABLED: "&l&bFlying Enabled" FLYING_ENABLED: "&l&bFlying Enabled"
FLYING_DISABLED: "&l&bFlying Disabled" FLYING_DISABLED: "&l&bFlying Disabled"
RESPAWN_NOTICE: "You will respawn in {AMOUNT} seconds." RESPAWN_NOTICE: "You will respawn in {AMOUNT} seconds."
INVALID_MAP: "That is an invalid map name!"
MAP_ALREADY_EXISTS: "This map already exists!"
INVALID_MAP_NAME: "A map name can only contain numbers or letters."
MAP_CREATED: "Created new map: {AMOUNT}"
MAP_FAIL_DELETE: "Failed to delete map: {AMOUNT}"
MAP_DELETED: "Deleted map: {AMOUNT}"
NO_MAPS: "There are no maps in the plugin rn (/hs map add <name>)"
MAP_NOT_SETUP: "Map {AMOUNT} is not setup (/hs map status <map>)"
LIST_MAPS: "The current maps are:"
ARGUMENT_COUNT: "This command requires more arguments to run."
GAME_SPAWN_NEEDED: "Game spawn must be set before seeker spawn."
SEEKER_LOBBY_SPAWN_RESET: "Seeker lobby spawn reset since the game spawn was moved to a new world."
SEEKER_LOBBY_INVALID: "Seeker lobby must be in the same world as game spawn."
CONFIG_ERROR: "Error reloading config. Check server logs."
BLOCKHUNT_DISABLED: "Please enable blockhunt in this map inside maps.yml to enable disguises. Blockhunt does not work on 1.8"
BLOCKHUNT_UNSUPPORTED: "Blockhunt does not work on 1.8"
BLOCKHUNT_SET_TO: "Blockhunt set to {AMOUNT}."
BLOCKHUNT_BLOCK_EXISTS: "{AMOUNT} is already set in the blockhunt config."
BLOCKHUNT_BLOCK_DOESNT_EXIT: "{AMOUNT} is already not set in the blochunt config."
BLOCKHUNT_BLOCK_ADDED: "Added {AMOUNT} to blockhunt config."
BLOCKHUNT_BLOCK_REMOVED: "Removed {AMOUNT} from blockhunt config."
BLOCKHUNT_LIST_BLOCKS: "The following blockhunt blocks are:"
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: 3 version: 4
type: "en-US" type: "en-US"

View file

@ -16,6 +16,7 @@
# {COUNT} - The amount of player currently in the lobby. # {COUNT} - The amount of player currently in the lobby.
# {SEEKER%} - The chance that a player will be selected to be a seeker. # {SEEKER%} - The chance that a player will be selected to be a seeker.
# {HIDER%} - The chance that a player will be selected to be a hider. # {HIDER%} - The chance that a player will be selected to be a hider.
# {MAP} - The current map the player is on
# #
# GAME BOARD PLACEHOLDERS # GAME BOARD PLACEHOLDERS
# #
@ -38,6 +39,7 @@
# only Hiders will be able to see its effects though. # only Hiders will be able to see its effects though.
# {#SEEKER} - Number of current seekers. # {#SEEKER} - Number of current seekers.
# {#HIDER} - Number of current hiders. # {#HIDER} - Number of current hiders.
# {MAP} - The current map the player is on
# #
# YOU CANNOT USE TWO PLACEHOLDERS ON THE SAME LINE. ONLY THE FIRST ONE WILL # YOU CANNOT USE TWO PLACEHOLDERS ON THE SAME LINE. ONLY THE FIRST ONE WILL
# BE CHANGED, AND THE SECOND ONE WILL SAY A PLACEHOLDER MARKER! # BE CHANGED, AND THE SECOND ONE WILL SAY A PLACEHOLDER MARKER!
@ -50,12 +52,15 @@ lobby:
"Players: {COUNT}", "Players: {COUNT}",
"", "",
"&cSEEKER % &f{SEEKER%}", "&cSEEKER % &f{SEEKER%}",
"&6HIDER % &f{HIDER%}" "&6HIDER % &f{HIDER%}",
"",
"Map: {MAP}",
] ]
game: game:
title: "&eHIDE AND SEEK" title: "&eHIDE AND SEEK"
content: [ content: [
"Map: {MAP}",
"Team: {TEAM}", "Team: {TEAM}",
"", "",
"Time Left: &a{TIME}", "Time Left: &a{TIME}",

View file

@ -0,0 +1 @@
maps:

View file

@ -1,6 +1,6 @@
name: KenshinsHideAndSeek name: KenshinsHideAndSeek
main: net.tylermurphy.hideAndSeek.Main main: net.tylermurphy.hideAndSeek.Main
version: 1.6.2 version: 1.7.0
author: KenshinEto author: KenshinEto
load: STARTUP load: STARTUP
api-version: 1.13 api-version: 1.13
@ -12,82 +12,64 @@ commands:
usage: /hideandseek [command] usage: /hideandseek [command]
aliases: hs aliases: hs
permissions: permissions:
hideandseek.*: hs.help:
description: Gives access to all hideandseek commands
children:
hideandseek.about: true
hideandseek.help: true
hideandseek.reload: true
hideandseek.setborder: true
hideandseek.setspawn: true
hideandseek.setlobby: true
hideandseek.setseekerlobby: true
hideandseek.setexit: true
hideadnseek.setbounds: true
hideandseek.setup: true
hideandseek.start: true
hideandseek.stop: true
hideandseek.savemap: true
hideandseek.join: true
hideandseek.leave: true
hideandseek.leavebounds: true
hideandseek.wins: true
hideandseek.top: true
hideandseek.debug: true
hideandseek.about:
description: Allows you to run the about command
default: true default: true
hideandseek.help: hs.join:
description: Allows you to run the help command
default: true default: true
hideandseek.reload: hs.leave:
description: Allows you to reload the config
default: op
hideandseek.setborder:
description: Allows you to set the game world border
default: op
hideandseek.setspawn:
description: Allows you to set the game spawn point
default: op
hideandseek.setlobby:
description: Allows you to set the game lobby point
default: op
hideandseek.setseekerlobby:
description: Allows you to set the game seeker lobby point
default: op
hideandseek.setexit:
description: Allows you to set the game exit point
default: op
hideandseek.setbounds:
description: Allows you to set bounds for the game map
default: op
hideandseek.setup:
description: Allows you to see what needs to be setup for the plugin to function
default: op
hideandseek.start:
description: Allows you to start the game
default: op
hideandseek.stop:
description: Allows you to stop the game
default: op
hideandseek.savemap:
description: Allows you to set the current game map
default: op
hideandseek.join:
description: Allows you to join the game manual lobby
default: true default: true
hideandseek.leave: hs.top:
description: Allows you to leave the game manual lobby
default: true default: true
hideandseek.leavebounds: hs.wins:
description: Allows players to leave specified game bounderies default: true
hs.reload:
default: op default: op
hideandseek.wins: hs.send:
description: Allows players to see a players amount of wins
default: true
hideandseek.top:
description: Allows players to see the global wins leaderboard
default: true
hideandseek.debug:
description: Opens the debug menu
default: op default: op
hs.setexit:
default: op
hs.start:
default: op
hs.stop:
default: op
hs.map.add:
default: op
hs.map.remove:
default: op
hs.map.list:
default: op
hs.map.status:
default: op
hs.map.save:
default: op
hs.map.debug:
default: op
hs.map.goto:
default: op
hs.map.set.lobby:
default: op
hs.map.set.spawn:
default: op
hs.map.set.seekerlobby:
default: op
hs.map.set.border:
default: op
hs.map.set.bounds:
default: op
hs.map.blockhunt.add:
default: op
hs.map.blockhunt.remove:
default: op
hs.map.blockhunt.list:
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