summaryrefslogtreewikicommitdiff
diff options
context:
space:
mode:
authortylermurphy534 <tylermurphy534@gmail.com>2023-02-05 19:02:59 +0000
committertylermurphy534 <tylermurphy534@gmail.com>2023-02-05 19:02:59 +0000
commit8fdd3461c14a70dd69b34ba7bb44130e3f3a8ef0 (patch)
treeb82610c3a320bdcb8dd45197f7db309d7a3a7aa3
parentUpdate 'README.md' (diff)
parent1.7.0 rc3 (diff)
downloadkenshinshideandseek-8fdd3461c14a70dd69b34ba7bb44130e3f3a8ef0.tar.gz
kenshinshideandseek-8fdd3461c14a70dd69b34ba7bb44130e3f3a8ef0.tar.bz2
kenshinshideandseek-8fdd3461c14a70dd69b34ba7bb44130e3f3a8ef0.zip
Merge pull request '1.7.0 - Multi Map Support' (#4) from dev into main
Reviewed-on: https://g.tylerm.dev/tylermurphy534/KenshinsHideAndSeek/pulls/4
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md33
-rw-r--r--.github/ISSUE_TEMPLATE/feature_request.md20
-rw-r--r--.github/PULL_REQUEST_TEMPLATE.md11
-rw-r--r--.github/workflows/beta.yml37
-rw-r--r--.github/workflows/release.yml37
-rw-r--r--lib/ProtocolLib.jarbin0 -> 4875977 bytes
-rw-r--r--pom.xml32
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/Main.java198
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/About.java47
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Confirm.java62
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java110
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Help.java88
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/ICommand.java34
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Join.java49
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java29
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java48
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Send.java69
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java106
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java96
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/SetExitLocation.java43
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java83
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Start.java53
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java31
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Top.java29
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java29
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/LocationUtils.java53
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/Locations.java17
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/SetExitLocation.java49
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/SetLobbyLocation.java50
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSeekerLobbyLocation.java31
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java62
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/util/LocationUtils.java59
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/location/util/Locations.java26
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/Add.java55
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java123
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/GoTo.java63
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/List.java47
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/Remove.java54
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/Save.java (renamed from src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java)64
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/Status.java79
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/Enabled.java65
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Add.java77
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/List.java60
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Remove.java77
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java94
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Bounds.java113
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Lobby.java41
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/set/SeekerLobby.java58
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Spawn.java69
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java188
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/util/ICommand.java20
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/world/Create.java82
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/world/Delete.java76
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/world/List.java57
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/command/world/Tp.java49
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java178
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java175
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java19
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Leaderboard.java51
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java31
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java19
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java238
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/configuration/Maps.java158
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/Database.java21
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java16
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java8
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Board.java225
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java14
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java6
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Game.java89
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java34
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java45
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java24
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java2
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java17
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java3
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java2
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java38
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java21
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java11
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java1
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/WorldInteractHandler.java48
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java19
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java19
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java99
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/Location.java145
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java21
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/TabCompleter.java59
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java27
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java4
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java70
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java65
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java98
-rw-r--r--src/main/resources/config.yml146
-rw-r--r--src/main/resources/lang/localization_de-DE.yml66
-rw-r--r--src/main/resources/lang/localization_en-US.yml63
-rw-r--r--src/main/resources/leaderboard.yml7
-rw-r--r--src/main/resources/maps.yml1
-rw-r--r--src/main/resources/plugin.yml112
99 files changed, 3615 insertions, 2232 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index bf64440..0000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -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.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 4aea407..0000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -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.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 977e3be..0000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -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.
diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml
deleted file mode 100644
index 7adde3f..0000000
--- a/.github/workflows/beta.yml
+++ /dev/null
@@ -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
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 722d1c6..0000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -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
diff --git a/lib/ProtocolLib.jar b/lib/ProtocolLib.jar
new file mode 100644
index 0000000..47b952f
--- /dev/null
+++ b/lib/ProtocolLib.jar
Binary files differ
diff --git a/pom.xml b/pom.xml
index dfd99ff..df2ab1b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -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>
<groupId>net.tylermurphy</groupId>
<artifactId>KenshinsHideAndSeek</artifactId>
- <version>1.6.2</version>
+ <version>1.7.0</version>
<name>Hide and Seek Plugin</name>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
<build>
<defaultGoal>clean install</defaultGoal>
<sourceDirectory>src/main/java</sourceDirectory>
-
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@@ -30,10 +33,6 @@
<pattern>com.zaxxer.hikari</pattern>
<shadedPattern>net.tylermurphy.dependencies.hikari</shadedPattern>
</relocation>
- <relocation>
- <pattern>org.ibex.nestedvm</pattern>
- <shadedPattern>net.tylermurphy.dependencies.nestedvm</shadedPattern>
- </relocation>
</relocations>
<artifactSet>
<includes>
@@ -58,7 +57,6 @@
<resource>META-INF/services/java.sql.Driver</resource>
</transformer>
</transformers>
- <minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
@@ -82,10 +80,10 @@
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/public/</url>
</repository>
- <repository>
- <id>dmulloy2-repo</id>
- <url>https://repo.dmulloy2.net/repository/public/</url>
- </repository>
+<!-- <repository>-->
+<!-- <id>dmulloy2-repo</id>-->
+<!-- <url>https://repo.dmulloy2.net/repository/public/</url>-->
+<!-- </repository>-->
<repository>
<id>placeholderapi</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
@@ -108,12 +106,14 @@
<dependency>
<groupId>com.comphenix.protocol</groupId>
<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>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
- <version>3.7.2</version>
+ <version>3.39.3.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
@@ -123,7 +123,7 @@
<dependency>
<groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId>
- <version>9.0.0</version>
+ <version>9.1.0</version>
</dependency>
<dependency>
<groupId>me.clip</groupId>
@@ -134,12 +134,12 @@
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
- <version>4.0.3</version>
+ <version>5.0.1</version>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
- <version>2.7.2</version>
+ <version>3.0.6</version>
</dependency>
</dependencies>
</project> \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java
index 4d8581f..36d92ee 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java
@@ -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;
-import net.tylermurphy.hideAndSeek.configuration.Config;
-import net.tylermurphy.hideAndSeek.configuration.Items;
-import net.tylermurphy.hideAndSeek.configuration.Localization;
+import net.tylermurphy.hideAndSeek.command.*;
+import net.tylermurphy.hideAndSeek.command.map.*;
+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.game.*;
-import net.tylermurphy.hideAndSeek.game.util.Status;
-import net.tylermurphy.hideAndSeek.util.CommandHandler;
+import net.tylermurphy.hideAndSeek.command.util.CommandGroup;
import net.tylermurphy.hideAndSeek.game.listener.*;
import net.tylermurphy.hideAndSeek.util.PAPIExpansion;
-import net.tylermurphy.hideAndSeek.util.TabCompleter;
import org.bukkit.Bukkit;
-import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
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.Pattern;
-import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition;
-import static net.tylermurphy.hideAndSeek.configuration.Config.exitWorld;
+import static net.tylermurphy.hideAndSeek.configuration.Config.*;
+import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Main extends JavaPlugin implements Listener {
@@ -55,51 +40,136 @@ public class Main extends JavaPlugin implements Listener {
private Disguiser disguiser;
private EntityHider entityHider;
private Game game;
+ private CommandGroup commandGroup;
+ private boolean loaded;
public void onEnable() {
+
+ long start = System.currentTimeMillis();
+
+ getLogger().info("Loading Kenshin's Hide and Seek");
Main.instance = this;
- this.updateVersion();
- Config.loadConfig();
- Localization.loadLocalization();
- Items.loadItems();
+ getLogger().info("Getting minecraft version...");
+ this.updateVersion();;
+
+ 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();
+ getLogger().info("Connecting to database...");
this.database = new Database();
+ getLogger().info("Loading disguises...");
this.disguiser = new Disguiser();
+ getLogger().info("Loading entity hider...");
this.entityHider = new EntityHider(this, EntityHider.Policy.BLACKLIST);
+ getLogger().info("Registering listeners...");
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();
+ getLogger().info("Registering outgoing bungeecord plugin channel...");
Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
+ getLogger().info("Checking for PlaceholderAPI...");
if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) {
+ getLogger().info("PlaceholderAPI found...");
+ getLogger().info("Registering PlaceholderAPI expansion...");
new PAPIExpansion().register();
}
+
+ long end = System.currentTimeMillis();
+ getLogger().info("Finished loading plugin ("+(end-start)+"ms)");
+ loaded = true;
+
}
public void onDisable() {
version = 0;
- board.getPlayers().forEach(player -> {
- board.removeBoard(player);
- PlayerLoader.unloadPlayer(player);
- player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
- });
+ if(board != null) {
+ board.getPlayers().forEach(player -> {
+ board.removeBoard(player);
+ PlayerLoader.unloadPlayer(player);
+ exitPosition.teleport(player);
+ });
+ board.cleanup();
+ }
+
+ if(disguiser != null) {
+ disguiser.cleanUp();
+ }
Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(this);
- board.cleanup();
- disguiser.cleanUp();
}
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();
disguiser.check();
}
@@ -115,6 +185,7 @@ public class Main extends JavaPlugin implements Listener {
getServer().getPluginManager().registerEvents(new MovementHandler(), this);
getServer().getPluginManager().registerEvents(new PlayerHandler(), this);
getServer().getPluginManager().registerEvents(new RespawnHandler(), this);
+ getServer().getPluginManager().registerEvents(new WorldInteractHandler(), this);
}
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) {
- 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) {
- return TabCompleter.handleTabComplete(sender, args);
+ public java.util.List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] 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() {
@@ -158,8 +238,34 @@ public class Main extends JavaPlugin implements Listener {
public EntityHider getEntityHider() { return entityHider; }
+ public CommandGroup getCommandGroup() { return commandGroup; }
+
public boolean supports(int 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);
+ }
} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/About.java b/src/main/java/net/tylermurphy/hideAndSeek/command/About.java
deleted file mode 100644
index 54af32b..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/About.java
+++ /dev/null
@@ -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";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Confirm.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Confirm.java
new file mode 100644
index 0000000..a25185d
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Confirm.java
@@ -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();
+ }
+
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java
deleted file mode 100644
index 61d0c46..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java
+++ /dev/null
@@ -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";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java
index 97224d7..41db5a9 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java
@@ -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;
-import net.md_5.bungee.api.ChatColor;
-import net.tylermurphy.hideAndSeek.util.CommandHandler;
+import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.command.util.ICommand;
+import net.tylermurphy.hideAndSeek.util.Pair;
+import org.bukkit.ChatColor;
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 void execute(Player sender, String[] args) {
+ final int pageSize = 4;
+ List<Pair<String, ICommand>> commands = Main.getInstance().getCommandGroup().getCommands();
+ 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;
+ }
+ String spacer = ChatColor.GRAY + "?" + ChatColor.WHITE;
StringBuilder message = new StringBuilder();
- for(ICommand command : CommandHandler.COMMAND_REGISTER.values()) {
- 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"));
+ 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;
}
- message = new StringBuilder(message.substring(0, message.length() - 1));
+ 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());
}
@@ -39,11 +73,15 @@ public class Help implements ICommand {
}
public String getUsage() {
- return "";
+ return "<*page>";
}
public String getDescription() {
return "Get the commands for the plugin";
}
+ public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
+ return Collections.singletonList(parameter);
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/ICommand.java b/src/main/java/net/tylermurphy/hideAndSeek/command/ICommand.java
deleted file mode 100644
index 275d189..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/ICommand.java
+++ /dev/null
@@ -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();
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java
index 941cec0..0c01265 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java
@@ -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;
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.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;
@@ -29,7 +16,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Join implements ICommand {
public void execute(Player sender, String[] args) {
- if (Main.getInstance().getGame().isNotSetup()) {
+ if (Main.getInstance().getGame().checkCurrentMap()) {
sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return;
}
@@ -42,7 +29,18 @@ public class Join implements ICommand {
sender.sendMessage(errorPrefix + message("GAME_INGAME"));
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);
}
@@ -51,11 +49,18 @@ public class Join implements ICommand {
}
public String getUsage() {
- return "";
+ return "<*map>";
}
public String getDescription() {
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;
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java
index 092ff50..109930b 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.command.util.ICommand;
import org.bukkit.Bukkit;
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;
@@ -29,7 +14,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Leave implements ICommand {
public void execute(Player sender, String[] args) {
- if (Main.getInstance().getGame().isNotSetup()) {
+ if (Main.getInstance().getGame().checkCurrentMap()) {
sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return;
}
@@ -57,4 +42,8 @@ public class Leave implements ICommand {
return "Leaves the lobby if game is set to manual join/leave";
}
+ public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
+ return null;
+ }
+
} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java
index 56f4517..0c2b6b1 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
-import net.tylermurphy.hideAndSeek.configuration.Config;
-import net.tylermurphy.hideAndSeek.configuration.Items;
-import net.tylermurphy.hideAndSeek.configuration.Localization;
+import net.tylermurphy.hideAndSeek.command.util.ICommand;
+import net.tylermurphy.hideAndSeek.configuration.*;
import net.tylermurphy.hideAndSeek.game.util.Status;
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.messagePrefix;
@@ -38,9 +21,18 @@ public class Reload implements ICommand {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
- Config.loadConfig();
- Localization.loadLocalization();
- Items.loadItems();
+
+ try {
+ 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"));
}
@@ -55,5 +47,9 @@ public class Reload implements ICommand {
public String getDescription() {
return "Reloads the config";
}
-
+
+ public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
+ return null;
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Send.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Send.java
new file mode 100644
index 0000000..43620c5
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Send.java
@@ -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;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java
deleted file mode 100644
index b456e6a..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java
+++ /dev/null
@@ -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.";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java
deleted file mode 100644
index 434e4a6..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java
+++ /dev/null
@@ -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.";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetExitLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetExitLocation.java
new file mode 100644
index 0000000..7da404f
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/SetExitLocation.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java
deleted file mode 100644
index e961188..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java
+++ /dev/null
@@ -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";
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java
index 18bcbba..5184933 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
-import java.util.Optional;
-import java.util.Random;
+import java.util.List;
+import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
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 void execute(Player sender, String[] args) {
- if (Main.getInstance().getGame().isNotSetup()) {
+ if (Main.getInstance().getGame().checkCurrentMap()) {
sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return;
}
@@ -52,22 +35,13 @@ public class Start implements ICommand {
}
String seekerName;
if (args.length < 1) {
- Optional<Player> rand = Main.getInstance().getBoard().getPlayers().stream().skip(new Random().nextInt(Main.getInstance().getBoard().size())).findFirst();
- if (!rand.isPresent()) {
- Main.getInstance().getLogger().warning("Failed to select random seeker.");
- return;
- }
- seekerName = rand.get().getName();
+ Main.getInstance().getGame().start();
+ return;
} else {
seekerName = args[0];
}
- Player temp = Bukkit.getPlayer(seekerName);
- if (temp == null) {
- sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName));
- return;
- }
- Player seeker = Main.getInstance().getBoard().getPlayer(temp.getUniqueId());
- if (seeker == null) {
+ Player seeker = Bukkit.getPlayer(seekerName);
+ if (seeker == null || !Main.getInstance().getBoard().contains(seeker)) {
sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName));
return;
}
@@ -79,11 +53,18 @@ public class Start implements ICommand {
}
public String getUsage() {
- return "<player>";
+ return "<*player>";
}
public String getDescription() {
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;
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java
index 9280b53..498e30d 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.game.util.Status;
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.errorPrefix;
@@ -30,8 +15,8 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class Stop implements ICommand {
public void execute(Player sender, String[] args) {
- if (Main.getInstance().getGame().isNotSetup()) {
- sender.sendMessage(errorPrefix + "Game is not setup. Run /hs setup to see what you needed to do");
+ if (Main.getInstance().getGame().checkCurrentMap()) {
+ sender.sendMessage(errorPrefix + message("GAME_SETUP"));
return;
}
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";
}
+ public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
+ return null;
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java
index 72a695c..13f3069 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.database.util.PlayerInfo;
import org.bukkit.ChatColor;
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;
@@ -74,10 +58,15 @@ public class Top implements ICommand {
}
public String getUsage() {
- return "<page>";
+ return "<*page>";
}
public String getDescription() {
return "Gets the top players in the server.";
}
+
+ public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
+ return Collections.singletonList(parameter);
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java
index e12d2d4..fb61fb2 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.command.util.ICommand;
import net.tylermurphy.hideAndSeek.database.util.PlayerInfo;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import java.util.Collections;
+import java.util.List;
import java.util.UUID;
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
@@ -70,10 +55,14 @@ public class Wins implements ICommand {
}
public String getUsage() {
- return "<player>";
+ return "<*player>";
}
public String getDescription() {
return "Get the win information for yourself or another player.";
}
+
+ public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
+ return Collections.singletonList(parameter);
+ }
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/LocationUtils.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/LocationUtils.java
new file mode 100644
index 0000000..5e4afb5
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/location/LocationUtils.java
@@ -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()));
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/Locations.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/Locations.java
new file mode 100644
index 0000000..c1316f8
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/location/Locations.java
@@ -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";
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetExitLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetExitLocation.java
deleted file mode 100644
index 93c0d8c..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetExitLocation.java
+++ /dev/null
@@ -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";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetLobbyLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetLobbyLocation.java
deleted file mode 100644
index eb228f9..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetLobbyLocation.java
+++ /dev/null
@@ -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";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSeekerLobbyLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSeekerLobbyLocation.java
deleted file mode 100644
index c6c3ccb..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSeekerLobbyLocation.java
+++ /dev/null
@@ -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";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java
deleted file mode 100644
index 5ecfb8d..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java
+++ /dev/null
@@ -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";
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/LocationUtils.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/LocationUtils.java
deleted file mode 100644
index 50d1776..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/LocationUtils.java
+++ /dev/null
@@ -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();
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/Locations.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/Locations.java
deleted file mode 100644
index 35f74ea..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/Locations.java
+++ /dev/null
@@ -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;
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Add.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Add.java
new file mode 100644
index 0000000..72f0740
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Add.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java
new file mode 100644
index 0000000..209d0d6
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/GoTo.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/GoTo.java
new file mode 100644
index 0000000..7d27642
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/GoTo.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/List.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/List.java
new file mode 100644
index 0000000..ac2badf
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/List.java
@@ -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;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Remove.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Remove.java
new file mode 100644
index 0000000..d681848
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Remove.java
@@ -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;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Save.java
index 1e66395..03e23a8 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Save.java
@@ -1,35 +1,22 @@
-/*
- * 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.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.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
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.Localization.message;
-public class SaveMap implements ICommand {
+public class Save implements ICommand {
public static boolean runningBackup = false;
@@ -42,21 +29,31 @@ public class SaveMap implements ICommand {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
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"));
return;
}
+ if (map.isBoundsNotSetup()) {
+ sender.sendMessage(errorPrefix + message("ERROR_MAP_BOUNDS"));
+ return;
+ }
sender.sendMessage(messagePrefix + message("MAPSAVE_START"));
sender.sendMessage(warningPrefix + message("MAPSAVE_WARNING"));
- World world = Bukkit.getServer().getWorld(spawnWorld);
+ World world = map.getSpawn().load();
if (world == null) {
- throw new RuntimeException("Unable to get world: " + spawnWorld);
+ sender.sendMessage(warningPrefix + message("MAPSAVE_FAIL_WORLD"));
+ return;
}
world.save();
BukkitRunnable runnable = new BukkitRunnable() {
public void run() {
sender.sendMessage(
- Main.getInstance().getGame().getWorldLoader().save()
+ map.getWorldLoader().save()
);
runningBackup = false;
}
@@ -66,15 +63,22 @@ public class SaveMap implements ICommand {
}
public String getLabel() {
- return "saveMap";
+ return "save";
}
public String getUsage() {
- return "";
+ return "<map>";
}
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;
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Status.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Status.java
new file mode 100644
index 0000000..90615e5
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Status.java
@@ -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;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/Enabled.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/Enabled.java
new file mode 100644
index 0000000..2567427
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/Enabled.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Add.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Add.java
new file mode 100644
index 0000000..fea08ef
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Add.java
@@ -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;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/List.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/List.java
new file mode 100644
index 0000000..de783ce
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/List.java
@@ -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;
+ }
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Remove.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Remove.java
new file mode 100644
index 0000000..1c16fdc
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Remove.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java
new file mode 100644
index 0000000..64bf5d4
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java
@@ -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);
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Bounds.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Bounds.java
new file mode 100644
index 0000000..3d1f036
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Bounds.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Lobby.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Lobby.java
new file mode 100644
index 0000000..6690ae9
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Lobby.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/SeekerLobby.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/SeekerLobby.java
new file mode 100644
index 0000000..b6c5cf0
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/SeekerLobby.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Spawn.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Spawn.java
new file mode 100644
index 0000000..0baf55e
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Spawn.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java
new file mode 100644
index 0000000..0cb307b
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java
@@ -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;
+ }
+
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/util/ICommand.java b/src/main/java/net/tylermurphy/hideAndSeek/command/util/ICommand.java
new file mode 100644
index 0000000..1be678c
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/util/ICommand.java
@@ -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);
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/Create.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Create.java
new file mode 100644
index 0000000..e399993
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Create.java
@@ -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;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/Delete.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Delete.java
new file mode 100644
index 0000000..985ccdc
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Delete.java
@@ -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;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/List.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/List.java
new file mode 100644
index 0000000..bdb98e5
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/List.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/Tp.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Tp.java
new file mode 100644
index 0000000..b166297
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Tp.java
@@ -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;
+ }
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java
index a71369f..5881d19 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java
@@ -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;
import com.cryptomorin.xseries.XItemStack;
@@ -24,16 +5,15 @@ import com.cryptomorin.xseries.XMaterial;
import com.cryptomorin.xseries.XSound;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.game.util.CountdownDisplay;
+import net.tylermurphy.hideAndSeek.util.Location;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -49,10 +29,6 @@ public class Config {
abortPrefix,
gameOverPrefix,
warningPrefix,
- spawnWorld,
- seekerLobbyWorld,
- exitWorld,
- lobbyWorld,
locale,
leaveServer,
placeholderError,
@@ -64,18 +40,10 @@ public class Config {
databasePass,
databaseName;
- public static Vector
- spawnPosition,
- lobbyPosition,
- exitPosition,
- seekerLobbyPosition,
- worldBorderPosition;
-
public static boolean
nameTagsVisible,
permissionsRequired,
announceMessagesToNonPlayers,
- worldBorderEnabled,
tauntEnabled,
tauntCountdown,
tauntLast,
@@ -93,20 +61,11 @@ public class Config {
mapSaveEnabled,
allowNaturalCauses,
saveInventory,
- blockhuntEnabled,
delayedRespawn;
public static int
minPlayers,
- worldBorderSize,
- worldBorderDelay,
- currentWorldborderSize,
- worldBorderChange,
gameLength,
- saveMinX,
- saveMinZ,
- saveMaxX,
- saveMaxZ,
tauntDelay,
glowLength,
countdown,
@@ -120,7 +79,6 @@ public class Config {
lobbyItemStartPosition,
flightToggleItemPosition,
teleportItemPosition,
- solidifyTime,
delayedRespawnDelay;
public static float
@@ -132,27 +90,6 @@ public class Config {
blockedCommands,
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
lobbyLeaveItem,
lobbyStartItem,
@@ -166,74 +103,36 @@ public class Config {
public static CountdownDisplay
countdownDisplay;
+
+ public static Location
+ exitPosition;
public static void loadConfig() {
config = ConfigManager.create("config.yml");
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");
- 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
- char SYMBOLE = '\u00A7';
- String SYMBOLE_STRING = String.valueOf(SYMBOLE);
+ char SYMBOL = '\u00A7';
+ String SYMBOL_STRING = String.valueOf(SYMBOL);
- messagePrefix = config.getString("prefix.default").replace("&", SYMBOLE_STRING);
- errorPrefix = config.getString("prefix.error").replace("&", SYMBOLE_STRING);
- tauntPrefix = config.getString("prefix.taunt").replace("&", SYMBOLE_STRING);
- worldBorderPrefix = config.getString("prefix.border").replace("&", SYMBOLE_STRING);
- abortPrefix = config.getString("prefix.abort").replace("&", SYMBOLE_STRING);
- gameOverPrefix = config.getString("prefix.gameover").replace("&", SYMBOLE_STRING);
- warningPrefix = config.getString("prefix.warning").replace("&", SYMBOLE_STRING);
+ messagePrefix = config.getString("prefix.default").replace("&", SYMBOL_STRING);
+ errorPrefix = config.getString("prefix.error").replace("&", SYMBOL_STRING);
+ tauntPrefix = config.getString("prefix.taunt").replace("&", SYMBOL_STRING);
+ worldBorderPrefix = config.getString("prefix.border").replace("&", SYMBOL_STRING);
+ abortPrefix = config.getString("prefix.abort").replace("&", SYMBOL_STRING);
+ gameOverPrefix = config.getString("prefix.gameover").replace("&", SYMBOL_STRING);
+ warningPrefix = config.getString("prefix.warning").replace("&", SYMBOL_STRING);
- //Map Bounds
- saveMinX = config.getInt("bounds.min.x");
- saveMinZ = config.getInt("bounds.min.z");
- saveMaxX = config.getInt("bounds.max.x");
- saveMaxZ = config.getInt("bounds.max.z");
+ // Locations
+ exitPosition = new Location(
+ config.getString("exit.world"),
+ config.getInt("exit.x"),
+ config.getInt("exit.y"),
+ config.getInt("exit.z")
+ );
mapSaveEnabled = config.getBoolean("mapSaveEnabled");
//Taunt
@@ -289,8 +188,7 @@ public class Config {
try {
countdownDisplay = CountdownDisplay.valueOf(config.getString("hideCountdownDisplay"));
} catch (IllegalArgumentException e) {
- countdownDisplay = CountdownDisplay.CHAT;
- Main.getInstance().getLogger().warning("hideCountdownDisplay: "+config.getString("hideCountdownDisplay")+" is not a valid configuration option!");
+ throw new RuntimeException("hideCountdownDisplay: "+config.getString("hideCountdownDisplay")+", is not a valid configuration option!");
}
blockedInteracts = new ArrayList<>();
List<String> tempInteracts = config.getStringList("blockedInteracts");
@@ -305,37 +203,6 @@ public class Config {
}
bungeeLeave = config.getString("leaveType") == null || config.getString("leaveType").equalsIgnoreCase("proxy");
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
if (config.getBoolean("lobbyItems.leave.enabled")) {
@@ -364,8 +231,7 @@ public class Config {
databaseType = config.getString("databaseType").toUpperCase();
if(!databaseType.equals("SQLITE") && !databaseType.equals("MYSQL")){
- Main.getInstance().getLogger().warning("databaseType: "+databaseType+" is not a valid configuration option!");
- databaseType = "SQLITE";
+ throw new RuntimeException("databaseType: "+databaseType+" is not a valid configuration option!");
}
delayedRespawn = config.getBoolean("delayedRespawn.enabled");
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java
index 5e28258..92fa4ce 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
@@ -25,8 +6,8 @@ import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.*;
-import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
import java.util.List;
import java.util.Map;
@@ -93,6 +74,7 @@ public class ConfigManager {
try {
this.config.load(reader);
} catch(InvalidConfigurationException e) {
+ Main.getInstance().getLogger().severe(e.getMessage());
throw new RuntimeException("Invalid configuration in config file: "+file.getPath());
} catch(IOException e) {
throw new RuntimeException("Could not access file: "+file.getPath());
@@ -107,9 +89,10 @@ public class ConfigManager {
try {
this.defaultConfig.load(default_reader);
} 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) {
- throw new RuntimeException("Could not access file: "+file.getPath());
+ throw new RuntimeException("Could not access internal file: "+defaultFilename);
}
try{
@@ -124,6 +107,7 @@ public class ConfigManager {
return config.contains(path);
}
+ @SuppressWarnings("unused")
public double getDouble(String path) {
if (!config.contains(path)) {
return defaultConfig.getDouble(path);
@@ -226,71 +210,122 @@ public class ConfigManager {
config.set(path, value);
}
+ public void overwriteConfig() {
+ try {
+ this.config.save(file);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
public void saveConfig() {
try {
+ // open config file
InputStream is = Main.getInstance().getResource(defaultFilename);
+ // if failed error
if (is == null) {
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));
- 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;
- while((c = reader.read()) != -1) {
+ while((c = reader.read()) != -1)
textBuilder.append((char) c);
- }
- String yamlString = new String(textBuilder.toString().getBytes(), StandardCharsets.UTF_8);
- Map<String, Object> temp = config.getValues(true);
- for(Map.Entry<String, Object> entry: temp.entrySet()) {
- if (entry.getValue() instanceof Integer || entry.getValue() instanceof Double || entry.getValue() instanceof String || entry.getValue() instanceof Boolean || entry.getValue() instanceof List) {
- String[] parts = entry.getKey().split("\\.");
- int index = 0;
- int i = 0;
- for(String part : parts) {
- if (i == 0) {
- index = yamlString.indexOf(part+":", index);
- } else {
- index = yamlString.indexOf(" " + part+":", index);
- index++;
- }
- i++;
- if (index == -1) break;
- }
- if (index < 10) continue;
- int start = yamlString.indexOf(' ', index);
- int end = yamlString.indexOf('\n', index);
- if (end == -1) end = yamlString.length();
- StringBuilder replace = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8));
- if (entry.getValue() instanceof List) {
- if (((List<?>) entry.getValue()).isEmpty()) {
- replace.append("[]");
- } else {
- replace.append("[");
- for (Object o : (List<?>) entry.getValue()) {
- replace.append(o.toString()).append(", ");
- }
- replace = new StringBuilder(replace.substring(0, replace.length() - 2));
- replace.append("]");
- }
+ // store yaml file into a string
+ String yaml = new String(textBuilder.toString().getBytes(), StandardCharsets.UTF_8);
+ // get config values
+ Map<String, Object> data = config.getValues(true);
+ // write each stored config value into the yaml string
+ for(Map.Entry<String, Object> entry: data.entrySet()) {
+ // if type isn't supported, skip
+ if(!isSupported(entry.getValue())) continue;
+ // get index of key in yaml string
+ int index = getIndex(yaml, entry.getKey());
+ // if index not found, skip
+ if (index < 10) continue;
+ // get start and end of the value
+ int start = yaml.indexOf(' ', index) + 1;
+ int end = yaml.indexOf('\n', index);
+ // if end not found, set it to the end of the file
+ if (end == -1) end = yaml.length();
+ // create new replace sting
+ StringBuilder replace = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8));
+ // get value
+ Object value = entry.getValue();
+ // if the value is a list,
+ if (value instanceof List) {
+ end = yaml.indexOf(']', start) + 1;
+ List<?> list = (List<?>) entry.getValue();
+ if (list.isEmpty()) {
+ // if list is empty, put an empty list
+ replace.append("[]");
} else {
- replace.append(entry.getValue());
- }
- if (entry.getValue() instanceof String) {
- replace.append("\"");
- replace.reverse();
- replace.append("\"");
- replace.reverse();
+ // 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("]");
}
- StringBuilder builder = new StringBuilder(yamlString);
- builder.replace(start+1, end, replace.toString());
- yamlString = builder.toString();
+ // otherwise just put the value directly
+ } else {
+ replace.append(convert(value));
}
+ // 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();
} catch (IOException e) {
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();
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java
index 06dbb99..e5f970b 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java
@@ -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;
import com.cryptomorin.xseries.XItemStack;
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Leaderboard.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Leaderboard.java
new file mode 100644
index 0000000..63dc850
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Leaderboard.java
@@ -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();
+
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java
index 9418414..b9f9b69 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java
@@ -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;
import net.md_5.bungee.api.ChatColor;
@@ -31,8 +12,16 @@ public class Localization {
public static final Map<String,LocalizationString> DEFAULT_LOCAL = new HashMap<>();
private static final Map<String,String[][]> CHANGES = new HashMap<String,String[][]>() {{
- put("en-US", new String[][]{{"WORLDBORDER_DECREASING"},{"START","TAUNTED"}});
- put("de-DE", new String[][]{{},{"TAUNTED"}});
+ put("en-US", new String[][]{
+ {"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() {
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java
index 3d8bc0f..b457622 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java
@@ -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;
import org.bukkit.entity.Entity;
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java
new file mode 100644
index 0000000..a23a1f7
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Maps.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Maps.java
new file mode 100644
index 0000000..d691fa9
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Maps.java
@@ -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;
+ }
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java
index e7bfb26..dca2de0 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java
@@ -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;
import com.google.common.io.ByteStreams;
@@ -45,8 +26,10 @@ public class Database {
public Database(){
if(databaseType.equals("SQLITE")) {
+ Main.getInstance().getLogger().info("SQLITE database chosen");
connection = new SQLiteConnection();
} else {
+ Main.getInstance().getLogger().info("MYSQL database chosen");
connection = new MySQLConnection();
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java
index 8f0ddde..c01f615 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java
@@ -175,10 +175,10 @@ public class GameDataTable {
@NotNull Board board,
@NotNull List<UUID> uuids,
@NotNull List<UUID> winners,
- @NotNull Map<String,Integer> hider_kills,
- @NotNull Map<String,Integer> hider_deaths,
- @NotNull Map<String,Integer> seeker_kills,
- @NotNull Map<String,Integer> seeker_deaths,
+ @NotNull Map<UUID,Integer> hider_kills,
+ @NotNull Map<UUID,Integer> hider_deaths,
+ @NotNull Map<UUID,Integer> seeker_kills,
+ @NotNull Map<UUID,Integer> seeker_deaths,
@NotNull WinType type
) {
for(UUID uuid : uuids) {
@@ -192,10 +192,10 @@ public class GameDataTable {
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.getSeekerGames() + (board.getFirstSeeker().getUniqueId().equals(uuid) ? 1 : 0),
- info.getHiderKills() + hider_kills.getOrDefault(uuid.toString(), 0),
- info.getSeekerKills() + seeker_kills.getOrDefault(uuid.toString(), 0),
- info.getHiderDeaths() + hider_deaths.getOrDefault(uuid.toString(), 0),
- info.getSeekerDeaths() + seeker_deaths.getOrDefault(uuid.toString(), 0)
+ info.getHiderKills() + hider_kills.getOrDefault(uuid, 0),
+ info.getSeekerKills() + seeker_kills.getOrDefault(uuid, 0),
+ info.getHiderDeaths() + hider_deaths.getOrDefault(uuid, 0),
+ info.getSeekerDeaths() + seeker_deaths.getOrDefault(uuid, 0)
);
}
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java
index b7c1b1d..56f53f6 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java
@@ -21,6 +21,7 @@ package net.tylermurphy.hideAndSeek.database.connections;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
+import net.tylermurphy.hideAndSeek.Main;
import java.sql.Connection;
import java.sql.SQLException;
@@ -35,6 +36,13 @@ public class MySQLConnection implements DatabaseConnection {
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.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java
index 55dfa3c..2050f33 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
@@ -33,114 +14,133 @@ import java.util.*;
import java.util.stream.Collectors;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
+import static net.tylermurphy.hideAndSeek.configuration.Leaderboard.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
-@SuppressWarnings("deprecation")
public class Board {
- private final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>();
- private final Map<String, Player> playerList = new HashMap<>();
- private final Map<String, CustomBoard> customBoards = new HashMap<>();
- private final Map<String, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>();
+ private enum Type {
+ HIDER,
+ SEEKER,
+ 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) {
- return playerList.containsKey(player.getUniqueId().toString());
+ return Players.containsKey(player.getUniqueId());
}
public boolean isHider(Player player) {
- return Hider.contains(player.getUniqueId().toString());
+ return isHider(player.getUniqueId());
}
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) {
- return Seeker.contains(player.getUniqueId().toString());
+ return isSeeker(player.getUniqueId());
}
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) {
- 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() {
- return Hider.size();
+ return getHiders().size();
}
public int sizeSeeker() {
- return Seeker.size();
+ return getSeekers().size();
}
public int size() {
- return playerList.values().size();
+ return getPlayers().size();
}
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() {
- return Seeker.stream().filter(Objects::nonNull).map(playerList::get).collect(Collectors.toList());
- }
-
- public Player getFirstSeeker() {
- return playerList.get(Seeker.get(0));
+ return Players.keySet().stream()
+ .filter(s -> Players.get(s) == Type.SEEKER)
+ .map(Bukkit::getPlayer)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
}
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() {
- 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) {
- return playerList.get(uuid.toString());
+ if(!Players.containsKey(uuid)) {
+ return null;
+ }
+ return Bukkit.getPlayer(uuid);
}
public void addHider(Player player) {
- Hider.add(player.getUniqueId().toString());
- Seeker.remove(player.getUniqueId().toString());
- Spectator.remove(player.getUniqueId().toString());
- playerList.put(player.getUniqueId().toString(), player);
+ Players.put(player.getUniqueId(), Type.HIDER);
}
public void addSeeker(Player player) {
- Hider.remove(player.getUniqueId().toString());
- Seeker.add(player.getUniqueId().toString());
- Spectator.remove(player.getUniqueId().toString());
- playerList.put(player.getUniqueId().toString(), player);
+ if(initialSeeker == null) {
+ initialSeeker = player.getUniqueId();
+ }
+ Players.put(player.getUniqueId(), Type.SEEKER);
}
public void addSpectator(Player player) {
- Hider.remove(player.getUniqueId().toString());
- Seeker.remove(player.getUniqueId().toString());
- Spectator.add(player.getUniqueId().toString());
- playerList.put(player.getUniqueId().toString(), player);
+ Players.put(player.getUniqueId(), Type.SPECTATOR);
}
public void remove(Player player) {
- Hider.remove(player.getUniqueId().toString());
- Seeker.remove(player.getUniqueId().toString());
- Spectator.remove(player.getUniqueId().toString());
- playerList.remove(player.getUniqueId().toString());
+ Players.remove(player.getUniqueId());
}
public boolean onSameTeam(Player player1, Player player2) {
- if (Hider.contains(player1.getUniqueId().toString()) && Hider.contains(player2.getUniqueId().toString())) return true;
- 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());
+ return Players.get(player1.getUniqueId()) == Players.get(player2.getUniqueId());
}
public void reload() {
- Hider.clear();
- Seeker.clear();
- Spectator.clear();
+ Players.replaceAll((u, v) -> Type.HIDER);
hider_kills.clear();
seeker_kills.clear();
hider_deaths.clear();
@@ -148,47 +148,38 @@ public class Board {
}
public void addKill(UUID uuid) {
- if (Hider.contains(uuid.toString())) {
- if (hider_kills.containsKey(uuid.toString())) {
- hider_kills.put(uuid.toString(), hider_kills.get(uuid.toString())+1);
- } else {
- hider_kills.put(uuid.toString(), 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);
- }
+ if(Players.get(uuid) == Type.HIDER) {
+ int kills = hider_kills.getOrDefault(uuid, 0);
+ hider_kills.put(uuid, kills + 1);
+ } else if(Players.get(uuid) == Type.SEEKER) {
+ int kills = seeker_kills.getOrDefault(uuid, 0);
+ seeker_kills.put(uuid, kills + 1);
}
}
public void addDeath(UUID uuid) {
- if (Hider.contains(uuid.toString())) {
- if (hider_deaths.containsKey(uuid.toString())) {
- hider_deaths.put(uuid.toString(), hider_deaths.get(uuid.toString())+1);
- } else {
- hider_deaths.put(uuid.toString(), 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);
- }
+ if(Players.get(uuid) == Type.HIDER) {
+ int kills = hider_deaths.getOrDefault(uuid, 0);
+ hider_deaths.put(uuid, kills + 1);
+ } else if(Players.get(uuid) == Type.SEEKER) {
+ int kills = seeker_deaths.getOrDefault(uuid, 0);
+ seeker_deaths.put(uuid, kills + 1);
}
}
- public Map<String, Integer> getHiderKills() {
+ public Map<UUID, Integer> getHiderKills() {
return new HashMap<>(hider_kills);
}
- public Map<String, Integer> getSeekerKills() {
+
+ public Map<UUID, Integer> getSeekerKills() {
return new HashMap<>(seeker_kills);
}
- public Map<String, Integer> getHiderDeaths() {
+
+ public Map<UUID, Integer> getHiderDeaths() {
return new HashMap<>(hider_deaths);
}
- public Map<String, Integer> getSeekerDeaths() {
+
+ public Map<UUID, Integer> getSeekerDeaths() {
return new HashMap<>(seeker_deaths);
}
@@ -197,7 +188,7 @@ public class Board {
}
private void createLobbyBoard(Player player, boolean recreate) {
- CustomBoard board = customBoards.get(player.getUniqueId().toString());
+ CustomBoard board = customBoards.get(player.getUniqueId());
if (recreate || board == null) {
board = new CustomBoard(player, LOBBY_TITLE);
board.updateTeams();
@@ -219,14 +210,22 @@ public class Board {
} else if (line.contains("{SEEKER%}")) {
board.setLine(String.valueOf(i), line.replace("{SEEKER%}", getSeekerPercent()+""));
} 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 {
board.setLine(String.valueOf(i), line);
}
i++;
}
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) {
@@ -234,7 +233,7 @@ public class Board {
}
private void createGameBoard(Player player, boolean recreate) {
- CustomBoard board = customBoards.get(player.getUniqueId().toString());
+ CustomBoard board = customBoards.get(player.getUniqueId());
if (recreate || board == null) {
board = new CustomBoard(player, GAME_TITLE);
board.updateTeams();
@@ -244,7 +243,7 @@ public class Board {
Status status = Main.getInstance().getGame().getStatus();
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();
int i = 0;
@@ -259,8 +258,8 @@ public class Board {
String value = getTeam(player);
board.setLine(String.valueOf(i), line.replace("{TEAM}", value));
} else if (line.contains("{BORDER}")) {
- if (!worldBorderEnabled) continue;
- if (worldBorder == null || status == Status.STARTING) {
+ if (!Main.getInstance().getGame().getCurrentMap().isWorldBorderEnabled()) continue;
+ if (status == Status.STARTING) {
board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replace("{AMOUNT}", "0")));
} else if (!worldBorder.isRunning()) {
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 (taunt == null || status == Status.STARTING) {
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));
} else if (!taunt.isRunning()) {
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()+""));
} else if (line.contains("{#HIDER}")) {
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 {
board.setLine(String.valueOf(i), line);
}
@@ -296,23 +297,23 @@ public class Board {
i++;
}
board.display();
- customBoards.put(player.getUniqueId().toString(), board);
+ customBoards.put(player.getUniqueId(), board);
}
public void removeBoard(Player player) {
ScoreboardManager manager = Bukkit.getScoreboardManager();
assert manager != null;
player.setScoreboard(manager.getMainScoreboard());
- customBoards.remove(player.getUniqueId().toString());
+ customBoards.remove(player.getUniqueId());
}
public void reloadLobbyBoards() {
- for(Player player : playerList.values())
+ for(Player player : getPlayers())
createLobbyBoard(player, false);
}
public void reloadGameBoards() {
- for(Player player : playerList.values())
+ for(Player player : getPlayers())
createGameBoard(player, false);
}
@@ -322,17 +323,19 @@ public class Board {
}
private String getSeekerPercent() {
- if (playerList.values().size() < 2)
+ int size = size();
+ if (size < 2)
return " --";
else
- return " "+(int)(100*(1.0/playerList.size()));
+ return " "+(int)(100*(1.0/size));
}
private String getHiderPercent() {
- if (playerList.size() < 2)
+ int size = size();
+ if (size < 2)
return " --";
else
- return " "+(int)(100-100*(1.0/playerList.size()));
+ return " "+(int)(100-100*(1.0/size));
}
private String getTeam(Player player) {
@@ -343,10 +346,8 @@ public class Board {
}
public void cleanup() {
- playerList.clear();
- Hider.clear();
- Seeker.clear();
- Spectator.clear();
+ Players.clear();;
+ initialSeeker = null;
customBoards.clear();
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java
index 2f8cbf6..351ba10 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java
@@ -1,21 +1,23 @@
package net.tylermurphy.hideAndSeek.game;
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 org.bukkit.Material;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
-import java.util.Map;
public class Disguiser {
- private final Map<Player, Disguise> disguises;
+ private final HashMap<Player, Disguise> disguises;
public Disguiser(){
this.disguises = new HashMap<>();
+
}
public Disguise getDisguise(Player player){
@@ -35,7 +37,7 @@ public class Disguiser {
}
public void check(){
- for(Map.Entry<Player, Disguise> set : disguises.entrySet()){
+ for(HashMap.Entry<Player, Disguise> set : disguises.entrySet()){
Disguise disguise = set.getValue();
Player player = set.getKey();
if(!player.isOnline()) {
@@ -47,9 +49,9 @@ public class Disguiser {
}
}
- public void disguise(Player player, Material material){
- if(!blockhuntEnabled){
- player.sendMessage(errorPrefix + "Please enable blockhunt in config.yml to enable disguises. Blockhunt does not work on 1.8");
+ public void disguise(Player player, Material material, Map map){
+ if(!map.isBlockHuntEnabled()){
+ player.sendMessage(errorPrefix + message("BLOCKHUNT_DISABLED"));
return;
}
if(disguises.containsKey(player)){
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java
index 8274655..3892f6f 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java
@@ -235,11 +235,7 @@ public class EntityHider implements Listener {
destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()});
} catch (Exception e){ return false; }
// Make the entity disappear
- try {
- manager.sendServerPacket(observer, destroyEntity);
- } catch (InvocationTargetException e) {
- throw new RuntimeException("Cannot send server packet.", e);
- }
+ manager.sendServerPacket(observer, destroyEntity);
}
return visibleBefore;
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java
index 71c3e84..e18a309 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java
@@ -24,18 +24,17 @@ import com.cryptomorin.xseries.messages.Titles;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
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.Taunt;
import net.tylermurphy.hideAndSeek.game.listener.RespawnHandler;
import net.tylermurphy.hideAndSeek.game.util.*;
-import net.tylermurphy.hideAndSeek.world.WorldLoader;
import org.bukkit.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
-import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
@@ -46,24 +45,25 @@ public class Game {
private final Taunt taunt;
private final Glow glow;
- private final Border worldBorder;
- private final WorldLoader worldLoader;
private final Board board;
private Status status;
+ private Map currentMap;
+
private int gameTick;
private int lobbyTimer;
private int startingTimer;
private int gameTimer;
private boolean hiderLeft;
- public Game(Board board){
+ public Game(Map map, Board board) {
+
+ this.currentMap = map;
+
this.taunt = new Taunt();
this.glow = new Glow();
- this.worldBorder = new Border();
- this.worldLoader = new WorldLoader(spawnWorld);
this.status = Status.STANDBY;
@@ -92,40 +92,34 @@ public class Game {
return glow;
}
- public Border getBorder(){
- return worldBorder;
- }
-
public Taunt getTaunt(){
return taunt;
}
- public WorldLoader getWorldLoader(){
- return worldLoader;
- }
-
public void start() {
+ Player seeker;
try {
- Optional<Player> rand = board.getPlayers().stream().skip(new Random().nextInt(board.size())).findFirst();
- Player seeker = rand.orElse(board.getPlayers().get(0));
- start(seeker);
+ int rand = (int) (Math.random() * board.getPlayers().size());
+ seeker = board.getPlayers().get(rand);
} catch (Exception e){
Main.getInstance().getLogger().warning("Failed to select random seeker.");
+ return;
}
+ start(seeker);
}
public void start(Player seeker) {
- if (mapSaveEnabled) worldLoader.rollback();
+ if (mapSaveEnabled) currentMap.getWorldLoader().rollback();
board.reload();
board.addSeeker(seeker);
- PlayerLoader.loadSeeker(seeker, getGameWorld());
+ PlayerLoader.loadSeeker(seeker, currentMap);
board.getPlayers().forEach(player -> {
if(board.isSeeker(player)) return;
board.addHider(player);
- PlayerLoader.loadHider(player, getGameWorld());
+ PlayerLoader.loadHider(player, currentMap);
});
board.getPlayers().forEach(board::createGameBoard);
- worldBorder.resetWorldBorder(getGameWorld());
+ currentMap.getWorldBorder().resetWorldBorder();
if (gameLength > 0) gameTimer = gameLength;
status = Status.STARTING;
startingTimer = 30;
@@ -147,21 +141,23 @@ public class Game {
public void end() {
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 -> {
if (leaveOnEnd) {
board.removeBoard(player);
board.remove(player);
handleBungeeLeave(player);
} else {
- player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ()));
+ currentMap.getLobby().teleport(player);
board.createLobbyBoard(player);
board.addHider(player);
- PlayerLoader.joinPlayer(player);
+ PlayerLoader.joinPlayer(player, currentMap);
}
});
RespawnHandler.temp_loc.clear();
- if (mapSaveEnabled) worldLoader.unloadMap();
+ if (mapSaveEnabled) currentMap.getWorldLoader().unloadMap();
board.reloadLobbyBoards();
status = Status.ENDED;
}
@@ -172,14 +168,14 @@ public class Game {
ItemStack[] data = player.getInventory().getContents();
Main.getInstance().getDatabase().getInventoryData().saveInventory(player.getUniqueId(), data);
}
- PlayerLoader.joinPlayer(player);
+ PlayerLoader.joinPlayer(player, currentMap);
board.addHider(player);
board.createLobbyBoard(player);
board.reloadLobbyBoards();
if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player));
else broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player));
} else {
- PlayerLoader.loadSpectator(player, getGameWorld());
+ PlayerLoader.loadSpectator(player, currentMap);
board.addSpectator(player);
board.createGameBoard(player);
player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR"));
@@ -216,12 +212,12 @@ public class Game {
out.writeUTF(leaveServer);
player.sendPluginMessage(Main.getInstance(), "BungeeCord", out.toByteArray());
} else {
- player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
+ exitPosition.teleport(player);
}
}
public void onTick() {
- if (isNotSetup()) return;
+ if (currentMap == null || currentMap.isNotSetup()) return;
if (status == Status.STANDBY) whileWaiting();
else if (status == Status.STARTING) whileStarting();
else if (status == Status.PLAYING) whilePlaying();
@@ -257,7 +253,7 @@ public class Game {
board.getPlayers().forEach(player -> {
PlayerLoader.resetPlayer(player, board);
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){
@@ -317,7 +313,7 @@ public class Game {
board.reloadGameBoards();
gameTimer--;
}
- if (worldBorderEnabled) worldBorder.update();
+ if (currentMap.isWorldBorderEnabled()) currentMap.getWorldBorder().update();
if (tauntEnabled) taunt.update();
if (glowEnabled || alwaysGlow) glow.update();
}
@@ -331,21 +327,22 @@ public class Game {
}
}
- public boolean isNotSetup() {
- if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) return true;
- 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 boolean isCurrentMapValid() {
+ return currentMap != null && !currentMap.isNotSetup();
+ }
+
+ public boolean checkCurrentMap() {
+ if(currentMap != null && !currentMap.isNotSetup()) return false;
+ this.currentMap = Maps.getRandomMap();
+ return this.currentMap == null;
+ }
+
+ public void setCurrentMap(Map map) {
+ this.currentMap = map;
}
- public String getGameWorld() {
- if (mapSaveEnabled) return "hideandseek_"+spawnWorld;
- else return spawnWorld;
+ public Map getCurrentMap() {
+ return currentMap;
}
private void checkWinConditions() {
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java
index eedfabe..10157cd 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java
@@ -23,9 +23,8 @@ import com.cryptomorin.xseries.messages.Titles;
import net.md_5.bungee.api.ChatColor;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Items;
-import org.bukkit.Bukkit;
+import net.tylermurphy.hideAndSeek.configuration.Map;
import org.bukkit.GameMode;
-import org.bukkit.Location;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.Player;
@@ -35,30 +34,29 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
-import static net.tylermurphy.hideAndSeek.configuration.Config.lobbyPosition;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
@SuppressWarnings("deprecation")
public class PlayerLoader {
- public static void loadHider(Player player, String gameWorld){
- player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ()));
+ public static void loadHider(Player player, Map map){
+ map.getGameSpawn().teleport(player);
loadPlayer(player);
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());
- if(blockhuntEnabled){
- openBlockHuntPicker(player);
+ if(map.isBlockHuntEnabled()){
+ openBlockHuntPicker(player, map);
}
}
- public static void loadSeeker(Player player, String gameWorld){
- player.teleport(new Location(Bukkit.getWorld(gameWorld), seekerLobbyPosition.getX(),seekerLobbyPosition.getY(),seekerLobbyPosition.getZ()));
+ public static void loadSeeker(Player player, Map map){
+ map.getGameSeekerLobby().teleport(player);
loadPlayer(player);
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){
- player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ()));
+ public static void loadSpectator(Player player, Map map){
+ map.getGameSpawn().teleport(player);
loadPlayer(player);
player.setAllowFlight(true);
player.setFlying(true);
@@ -115,8 +113,8 @@ public class PlayerLoader {
player.setFallDistance(0.0F);
}
- public static void joinPlayer(Player player){
- player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ()));
+ public static void joinPlayer(Player player, Map map){
+ map.getLobby().teleport(player);
loadPlayer(player);
if (lobbyStartItem != null && (!lobbyItemStartAdmin || player.hasPermission("hideandseek.start")))
player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem);
@@ -143,11 +141,11 @@ public class PlayerLoader {
}
}
- public static void openBlockHuntPicker(Player player){
- int slots = ((blockhuntBlocks.size()-1)/9)*9+9;
- Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block");
- for(int i=0;i<blockhuntBlocks.size();i++){
- inventory.setItem(i, new ItemStack(blockhuntBlocks.get(i)));
+ public static void openBlockHuntPicker(Player player, Map map){
+ int slots = ((map.getBlockHunt().size()-1)/9)*9+9;
+ Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block: " + map.getName());
+ for(int i=0;i<map.getBlockHunt().size();i++){
+ inventory.setItem(i, new ItemStack(map.getBlockHunt().get(i)));
}
player.openInventory(inventory);
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java
index 647c4b6..9f7b5bf 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java
@@ -1,8 +1,7 @@
package net.tylermurphy.hideAndSeek.game.events;
import net.tylermurphy.hideAndSeek.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.World;
+import net.tylermurphy.hideAndSeek.configuration.Map;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
@@ -11,9 +10,13 @@ public class Border {
private int delay;
private boolean running;
+ private final Map map;
+ private int currentSize;
- public Border() {
- delay = 60 * worldBorderDelay;
+ public Border(Map map) {
+ this.map = map;
+ this.delay = (int) (60 * map.getWorldBorderData().getY());
+ this.currentSize = (int) map.getWorldBorderData().getX();
}
public void update() {
@@ -21,7 +24,7 @@ public class Border {
Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_WARN"));
} else if (delay == 0) {
if (running) {
- delay = 60 * worldBorderDelay;
+ delay = (int) (60 * map.getWorldBorderData().getY());
running = false;
}
else decreaseWorldBorder();
@@ -30,34 +33,32 @@ public class Border {
}
private void decreaseWorldBorder() {
- if (currentWorldborderSize == 100) return;
- int change = worldBorderChange;
- if (currentWorldborderSize-worldBorderChange < 100) {
- change = currentWorldborderSize-100;
+ if (currentSize == 100) return;
+ if(map.getGameSpawn().load() == null) return;
+ int change = (int) map.getWorldBorderData().getZ();
+ if (currentSize-change < 100) {
+ change = currentSize-100;
}
running = true;
Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_DECREASING").addAmount(change));
- currentWorldborderSize -= worldBorderChange;
- World world = Bukkit.getWorld(Main.getInstance().getGame().getGameWorld());
- assert world != null;
- org.bukkit.WorldBorder border = world.getWorldBorder();
+ currentSize -= map.getWorldBorderData().getZ();
+ org.bukkit.WorldBorder border = map.getGameSpawn().load().getWorldBorder();
border.setSize(border.getSize()-change,30);
delay = 30;
}
- public void resetWorldBorder(String worldName) {
- World world = Bukkit.getWorld(worldName);
- assert world != null;
- org.bukkit.WorldBorder border = world.getWorldBorder();
- if (worldBorderEnabled) {
- border.setSize(worldBorderSize);
- border.setCenter(worldBorderPosition.getX(), worldBorderPosition.getZ());
- currentWorldborderSize = worldBorderSize;
+ public void resetWorldBorder() {
+ if(map.getGameSpawn().load() == null) return;
+ org.bukkit.WorldBorder border = map.getGameSpawn().load().getWorldBorder();
+ if (map.isWorldBorderEnabled()) {
+ border.setSize(map.getWorldBorderData().getX());
+ border.setCenter(map.getWorldBorderPos().getX(), map.getWorldBorderPos().getY());
+ currentSize = (int) map.getWorldBorderData().getX();
} else {
border.setSize(30000000);
border.setCenter(0, 0);
}
- delay = 60 * worldBorderDelay;
+ delay = (int) (60 * map.getWorldBorderData().getY());
}
public int getDelay() {
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java
index 8631ef5..dec23d7 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java
@@ -6,6 +6,7 @@ import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.util.packet.EntityMetadataPacket;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
@@ -64,22 +65,13 @@ public class Glow {
}
public void setGlow(Player player, Player target, boolean glowing) {
- PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_METADATA);
- packet.getIntegers().write(0, target.getEntityId());
- WrappedDataWatcher watcher = new WrappedDataWatcher();
- WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class);
- watcher.setEntity(target);
- if (glowing) {
- 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();
- }
+
+ EntityMetadataPacket packet = new EntityMetadataPacket();
+ packet.setEntity(target);
+ packet.setGlow(glowing);
+ packet.writeMetadata();
+ packet.send(player);
+
}
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java
index 27a6235..27347c2 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java
@@ -11,7 +11,7 @@ public class ChatHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onChat(AsyncPlayerChatEvent event) {
- if (Main.getInstance().getBoard().isSeeker(event.getPlayer())) {
+ if (Main.getInstance().getBoard().isSpectator(event.getPlayer())) {
event.setCancelled(true);
Main.getInstance().getBoard().getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage()));
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java
index d03d5d6..37537d6 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java
@@ -7,7 +7,6 @@ import net.tylermurphy.hideAndSeek.game.Game;
import net.tylermurphy.hideAndSeek.game.PlayerLoader;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.Bukkit;
-import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
@@ -18,7 +17,6 @@ import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
-import static net.tylermurphy.hideAndSeek.configuration.Config.spawnPosition;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
public class DamageHandler implements Listener {
@@ -32,8 +30,8 @@ public class DamageHandler implements Listener {
// Define variables
Player player = (Player) event.getEntity();
Player attacker = null;
- // If no spawn position, we won't be able to manage their death :o
- if (spawnPosition == null) { return; }
+ // If map is not setup we won't be able to process on it :o
+ if (!game.isCurrentMapValid()) { return; }
// If there is an attacker, find them
if (event instanceof EntityDamageByEntityEvent) {
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
if (attacker != null) {
- System.out.println(event.getFinalDamage() + " " + player.getDisplayName() + " " + attacker.getDisplayName());
// 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))) {
event.setCancelled(true);
@@ -73,9 +70,9 @@ public class DamageHandler implements Listener {
if (board.isSpectator(player)) {
event.setCancelled(true);
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) {
- player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
+ game.getCurrentMap().getGameSpawn().teleport(player);
}
return;
}
@@ -98,15 +95,15 @@ public class DamageHandler implements Listener {
Main.getInstance().getDisguiser().reveal(player);
// Teleport player to seeker spawn
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));
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> {
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);
} else {
- player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
+ game.getCurrentMap().getGameSpawn().teleport(player);
}
// Add leaderboard stats
board.addDeath(player.getUniqueId());
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java
index cb8ad04..c80e83f 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java
@@ -1,7 +1,6 @@
package net.tylermurphy.hideAndSeek.game.listener;
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.ProtocolManager;
@@ -42,7 +41,7 @@ public class DisguiseHandler implements Listener {
if(lastLocation.getWorld() != currentLocation.getWorld()) return;
double distance = lastLocation.distance(currentLocation);
disguise.setSolidify(distance < .1);
- }, solidifyTime);
+ }, 20 * 3);
if(event.getFrom().distance(event.getTo()) > .1)
disguise.setSolidify(false);
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java
index 3440780..0326391 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java
@@ -50,7 +50,7 @@ public class InteractHandler implements Listener {
if (temp.isSimilar(lobbyStartItem) && event.getPlayer().hasPermission("hideandseek.start")) {
event.setCancelled(true);
- if (Main.getInstance().getGame().isNotSetup()) {
+ if (Main.getInstance().getGame().checkCurrentMap()) {
event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP"));
return;
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java
index e72bea0..0f306b1 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java
@@ -19,11 +19,11 @@
package net.tylermurphy.hideAndSeek.game.listener;
-import static net.tylermurphy.hideAndSeek.configuration.Config.*;
-
import com.cryptomorin.xseries.XMaterial;
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 org.bukkit.Material;
import org.bukkit.entity.Player;
@@ -79,17 +79,23 @@ public class InventoryHandler implements Listener {
private void checkForBlockHuntMenu(InventoryClickEvent event){
boolean test;
+ String mapName;
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 {
- 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);
- 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;
Player player = (Player) event.getWhoClicked();
- Main.getInstance().getDisguiser().disguise(player, mat);
+ Main.getInstance().getDisguiser().disguise(player, mat, map);
player.closeInventory();
}
@@ -97,17 +103,23 @@ public class InventoryHandler implements Listener {
public void onInventoryClose(InventoryCloseEvent event){
if (!(event.getPlayer() instanceof Player)) return;
boolean test;
+ String mapName;
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 {
- 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;
- Material mat = blockhuntBlocks.get(0);
+ Map map = Maps.getMap(mapName);
+ if(map == null) return;
+ Material mat = map.getBlockHunt().get(0);
if(mat == null) return;
Player player = (Player) event.getPlayer();
if(Main.getInstance().getDisguiser().disguised(player)) return;
- Main.getInstance().getDisguiser().disguise(player, mat);
+ Main.getInstance().getDisguiser().disguise(player, mat, map);
player.closeInventory();
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java
index 6d88ebf..d8534a3 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java
@@ -4,9 +4,7 @@ import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Items;
import net.tylermurphy.hideAndSeek.game.PlayerLoader;
import net.tylermurphy.hideAndSeek.game.util.Status;
-import org.bukkit.Bukkit;
import org.bukkit.GameMode;
-import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -17,7 +15,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
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 {
@@ -28,20 +26,27 @@ public class JoinLeaveHandler implements Listener {
}
Main.getInstance().getBoard().remove(event.getPlayer());
removeItems(event.getPlayer());
- if (Main.getInstance().getGame().isNotSetup()) return;
+ if (Main.getInstance().getGame().checkCurrentMap()) return;
if (autoJoin) {
+ if (Main.getInstance().getGame().checkCurrentMap()) {
+ event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP"));
+ return;
+ }
Main.getInstance().getGame().join(event.getPlayer());
} else if (teleportToExit) {
- if (event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld()) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) {
- event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
+ if (
+ 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);
}
} 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) {
Main.getInstance().getGame().join(event.getPlayer());
} else {
- event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
+ exitPosition.teleport(event.getPlayer());
event.getPlayer().setGameMode(GameMode.ADVENTURE);
}
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java
index e6e32f6..1dd6cfc 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java
@@ -2,6 +2,7 @@ package net.tylermurphy.hideAndSeek.game.listener;
import com.google.common.collect.Sets;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.configuration.Map;
import net.tylermurphy.hideAndSeek.game.listener.events.PlayerJumpEvent;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
@@ -12,9 +13,6 @@ import org.bukkit.event.player.PlayerMoveEvent;
import java.util.Set;
import java.util.UUID;
-import static net.tylermurphy.hideAndSeek.configuration.Config.*;
-import static net.tylermurphy.hideAndSeek.configuration.Config.saveMaxZ;
-
public class MovementHandler implements Listener {
private final Set<UUID> prevPlayersOnGround = Sets.newHashSet();
@@ -51,10 +49,11 @@ public class MovementHandler implements Listener {
private void checkBounds(PlayerMoveEvent event){
if (!Main.getInstance().getBoard().contains(event.getPlayer())) return;
- if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) return;
- if (!event.getTo().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().getCurrentMap().getGameSpawnName())) 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);
}
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java
index 1e7ba69..d34cb11 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java
@@ -2,7 +2,6 @@ package net.tylermurphy.hideAndSeek.game.listener;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Items;
-import net.tylermurphy.hideAndSeek.game.Game;
import net.tylermurphy.hideAndSeek.game.util.Status;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/WorldInteractHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/WorldInteractHandler.java
new file mode 100644
index 0000000..10b8e3e
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/WorldInteractHandler.java
@@ -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);
+ }
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java
index e630070..44f19b2 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java
@@ -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;
public enum Status {
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java
index f584d80..24544ba 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java
@@ -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;
public enum WinType {
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java
deleted file mode 100644
index 2dda402..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java
+++ /dev/null
@@ -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;
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java b/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java
new file mode 100644
index 0000000..606b64b
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java b/src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java
new file mode 100644
index 0000000..0aad195
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/TabCompleter.java b/src/main/java/net/tylermurphy/hideAndSeek/util/TabCompleter.java
deleted file mode 100644
index 2605e7b..0000000
--- a/src/main/java/net/tylermurphy/hideAndSeek/util/TabCompleter.java
+++ /dev/null
@@ -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;
- }
-
-}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java b/src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java
new file mode 100644
index 0000000..5a40ff8
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java
index 9293beb..4e3fc3b 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java
@@ -23,9 +23,7 @@ public class AbstractPacket {
}
public void send(Player player){
- try {
- protocolManager.sendServerPacket(player, packet);
- } catch (InvocationTargetException ignored) {}
+ protocolManager.sendServerPacket(player, packet);
}
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java
new file mode 100644
index 0000000..d77a227
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java
@@ -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());
+ }
+
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java b/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java
index b0ce824..4f9ad0d 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java
@@ -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;
+import org.bukkit.Location;
import org.bukkit.World;
+import org.bukkit.block.Biome;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import org.jetbrains.annotations.NotNull;
@@ -36,41 +19,27 @@ public class VoidGenerator extends ChunkGenerator {
return Collections.emptyList();
}
- public boolean shouldGenerateNoise() {
- return false;
- }
-
- public boolean shouldGenerateSurface() {
- return false;
- }
-
- public boolean shouldGenerateBedrock() {
- return false;
- }
-
- public boolean shouldGenerateCaves() {
- return false;
- }
-
- public boolean shouldGenerateDecorations() {
- return false;
+ @Override
+ public boolean canSpawn(World world, int x, int z) {
+ return true;
}
- public boolean shouldGenerateMobs() {
- return false;
+ @Override
+ public Location getFixedSpawnLocation(World world, Random random) {
+ return new Location(world, 0, 100, 0);
}
- public boolean shouldGenerateStructures() {
- return false;
- }
+ // 1.13 And Prev
+ public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
+ ChunkData chunkData = super.createChunkData(world);
- public boolean canSpawn(@NotNull World world, int x, int z) {
- return true;
- }
+ for(int x = 0; x < 16; x++) {
+ for(int z = 0; z < 16; z++) {
+ biome.setBiome(x, z, Biome.PLAINS);
+ }
+ }
- // 1.13 And Prev
- public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) {
- return createChunkData(world);
+ return chunkData;
}
// 1.8
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java
index 1d4ff71..e5913aa 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java
@@ -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;
import net.tylermurphy.hideAndSeek.Main;
+import net.tylermurphy.hideAndSeek.configuration.Map;
import org.bukkit.Bukkit;
-import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.WorldCreator;
@@ -32,46 +13,43 @@ import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
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){
- this.mapName = mapName;
- this.saveName = "hideandseek_"+ mapName;
+ private final Map map;
+
+ public WorldLoader(Map map) {
+ this.map = map;
}
public World getWorld() {
- return Bukkit.getServer().getWorld(saveName);
+ return Bukkit.getServer().getWorld(map.getGameSpawnName());
}
public void unloadMap() {
- World world = Bukkit.getServer().getWorld(saveName);
+ World world = Bukkit.getServer().getWorld(map.getGameSpawnName());
if (world == null) {
- Main.getInstance().getLogger().warning(saveName + " already unloaded.");
+ Main.getInstance().getLogger().warning(map.getGameSpawnName() + " already unloaded.");
return;
}
- world.getPlayers().forEach(player -> player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())));
- if (Bukkit.getServer().unloadWorld(world, false)) {
- Main.getInstance().getLogger().info("Successfully unloaded " + saveName);
- }else{
- Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + saveName);
- }
+ world.getPlayers().forEach(player -> exitPosition.teleport(player));
+ Main.getInstance().scheduleTask(() -> {
+ if (Bukkit.getServer().unloadWorld(world, false)) {
+ Main.getInstance().getLogger().info("Successfully unloaded " + map.getGameSpawnName());
+ } else {
+ Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + map.getGameSpawnName());
+ }
+ });
}
public void loadMap() {
- Bukkit.getServer().createWorld(new WorldCreator(saveName).generator(new VoidGenerator()));
- World world = Bukkit.getServer().getWorld(saveName);
- if (world == null) {
- Main.getInstance().getLogger().severe("COULD NOT LOAD " + saveName);
- return;
- }
- world.setAutoSave(false);
+ Main.getInstance().scheduleTask(() -> {
+ Bukkit.getServer().createWorld(new WorldCreator(map.getGameSpawnName()).generator(new VoidGenerator()));
+ World world = Bukkit.getServer().getWorld(map.getGameSpawnName());
+ if (world == null) {
+ Main.getInstance().getLogger().severe("COULD NOT LOAD " + map.getGameSpawnName());
+ return;
+ }
+ world.setAutoSave(false);
+ });
}
public void rollback() {
@@ -80,15 +58,15 @@ public class WorldLoader {
}
public String save() {
- World world = Bukkit.getServer().getWorld(mapName);
+ World world = Bukkit.getServer().getWorld(map.getSpawnName());
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()) {
try {
- File destination = new File(Main.getInstance().getWorldContainer()+File.separator+ saveName);
- File temp_destination = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ saveName);
+ File destination = new File(Main.getInstance().getWorldContainer()+File.separator+ map.getGameSpawnName());
+ File temp_destination = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ map.getGameSpawnName());
copyFileFolder("region",true);
copyFileFolder("entities",true);
copyFileFolder("datapacks",false);
@@ -101,7 +79,7 @@ public class WorldLoader {
}
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) {
e.printStackTrace();
@@ -114,8 +92,8 @@ public class WorldLoader {
}
private void copyFileFolder(String name, Boolean isMca) throws IOException {
- File region = new File(Main.getInstance().getWorldContainer()+File.separator+ mapName +File.separator+name);
- File temp = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ saveName +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_"+ map.getGameSpawnName() +File.separator+name);
if (region.exists() && region.isDirectory()) {
if (!temp.exists())
if (!temp.mkdirs())
@@ -127,10 +105,10 @@ public class WorldLoader {
}
for (String file : files) {
if (isMca) {
- int minX = (int)Math.floor(saveMinX / 512.0);
- int minZ = (int)Math.floor(saveMinZ / 512.0);
- int maxX = (int)Math.floor(saveMaxX / 512.0);
- int maxZ = (int)Math.floor(saveMaxZ / 512.0);
+ int minX = (int)Math.floor(map.getBoundsMin().getX() / 512.0);
+ int minZ = (int)Math.floor(map.getBoundsMin().getZ() / 512.0);
+ int maxX = (int)Math.floor(map.getBoundsMax().getX() / 512.0);
+ int maxZ = (int)Math.floor(map.getBoundsMax().getZ() / 512.0);
String[] parts = file.split("\\.");
if (parts.length > 1) {
@@ -162,7 +140,7 @@ public class WorldLoader {
out.close();
}
- private void deleteDirectory(File directoryToBeDeleted) {
+ public static void deleteDirectory(File directoryToBeDeleted) {
File[] allContents = directoryToBeDeleted.listFiles();
if (allContents != null) {
for (File file : allContents) {
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 1d61cdc..82b9379 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -15,23 +15,23 @@ gameLength: 1200
announceMessagesToNonPlayers: true
# 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.
#
-# 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
-hideCountdownDisplay: CHAT
+hideCountdownDisplay: "CHAT"
# Allow Hiders to see their own teams nametags as well as seekers. Seekers can never see nametags regardless.
# default: 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
permissionsRequired: true
@@ -80,11 +80,11 @@ leaveOnEnd: false
# PROXY - Send the player to a specified server in a bungee-cord / velocity setup.
#
# 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
# 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
# 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.
#
# default: SQLITE
-databaseType: SQLITE
+databaseType: "SQLITE"
# 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
# host port (usually 3306), database username, and database password.
-databaseHost: localhost
+databaseHost: "localhost"
databasePort: 3306
-databaseUser: root
-databasePass:
-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
+databaseUser: "root"
+databasePass: "pass"
+databaseName: "hideandseek"
# 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
@@ -173,8 +149,12 @@ glow:
stackable: true
enabled: true
name: "Glow Powerup"
- lore: [ "Throw to make all seekers glow", "Last 30s, all hiders can see it", "Time stacks on multi use" ]
- material: SNOWBALL
+ lore: [
+ "Throw to make all seekers glow",
+ "Last 30s, all hiders can see it",
+ "Time stacks on multi use"
+ ]
+ material: "SNOWBALL"
model-data: 0
# 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.
lobbyItems:
leave:
- material: BED
+ material: "BED"
name: "&cLeave Lobby"
- lore: ["Go back to server hub"]
+ lore: [
+ "Go back to server hub"
+ ]
position: 8
model-data: 0
enabled: true
start:
- material: CLOCK
+ material: "CLOCK"
name: "&bStart Game"
lore: []
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.
spectatorItems:
flight:
- material: FEATHER
+ material: "FEATHER"
name: "&bToggle Flight"
- lore: [ "Turns flying on and off" ]
+ lore: [
+ "Turns flying on and off"
+ ]
position: 3
model-data: 0
teleport:
- material: COMPASS
+ material: "COMPASS"
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
model-data: 0
@@ -265,8 +251,8 @@ seekerPing:
leadingVolume: 0.5
volume: 0.3
pitch: 1
- heartbeatNoise: BLOCK_NOTE_BLOCK_BASEDRUM
- ringingNoise: BLOCK_NOTE_BLOCK_PLING
+ heartbeatNoise: "BLOCK_NOTE_BLOCK_BASEDRUM"
+ ringingNoise: "BLOCK_NOTE_BLOCK_PLING"
enabled: true
# Changes the default plugin language. Currently, Supported localizations are:
@@ -275,58 +261,34 @@ seekerPing:
locale: "en-US"
# 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.
# Not really usefully if using permission plugins.
# You can add /kill for any use, but it's already blocked on those
# 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.
# 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
# the block ID you enter, as the plugin will automatically switch to the
# block ID of your current Minecraft server version.
-blockedInteracts: [FURNACE, CRAFTING_TABLE, ANVIL, CHEST, BARREL]
-# ---------------------------------------------------------- #
-# ONLY EDIT BEYOND THIS POINT IF YOU KNOW WHAT YOU ARE DOING #
-# ---------------------------------------------------------- #
-
-# The 2 coordinate bounds that will contain your hideAndSeek map. Its recommended
-# that you use /hs setbounds for this, and not edit this directly, as breaking
-# this section will completely break the entire plugin when you run /hs savemap.
-bounds:
- min:
- x: 0
- z: 0
- max:
- x: 0
- z: 0
+blockedInteracts: [
+ "FURNACE",
+ "CRAFTING_TABLE",
+ "ANVIL",
+ "CHEST",
+ "BARREL"
+]
-# 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 \ No newline at end of file
+# Location where players are teleported when they exit (/hs leave)
+# Auto filled by /hs setexit, so you don't need to touch this here
+exit:
+ x: 0
+ y: 0
+ z: 0
+ world: "world" \ No newline at end of file
diff --git a/src/main/resources/lang/localization_de-DE.yml b/src/main/resources/lang/localization_de-DE.yml
index 9789a75..92309ee 100644
--- a/src/main/resources/lang/localization_de-DE.yml
+++ b/src/main/resources/lang/localization_de-DE.yml
@@ -10,6 +10,7 @@ Localization:
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_ERROR: "Ein unbekannter Fehler ist aufgetreten."
+ COMMAND_INVALID_ARG: "Ungültiges Argument: {AMOUNT}"
GAME_PLAYER_DEATH: "&c{PLAYER}&f ist gestorben."
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."
@@ -17,7 +18,7 @@ Localization:
GAME_GAMEOVER_SEEKERS_QUIT: "All Seeker 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_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_NOT_INGAME: "Du bist weder in einer Lobby noch in einem 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_SPECTATOR: "Du bist als Beobachter einem laufenden Spiel beigetreten."
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."
MAPSAVE_INPROGRESS: "Weltkarte wird aktuell gespeichert. Versuche es später nochmal."
MAPSAVE_START: "Starte Speichervorgang der Weltkarte"
@@ -32,6 +34,9 @@ Localization:
MAPSAVE_END: "Speichervorgang abgeschlossen."
MAPSAVE_ERROR: "Aktuelle Weltkarte konnte nicht gefunden werden."
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_INVALID_INPUT: "Ungültiger Wert: {AMOUNT}"
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_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_CHANGE_SIZE: "Die Änderung der Weltgrenze kann nicht 0 oder weniger sein."
TAUNTED: "&c&oOh nein! Du wurdest geärgert!"
TAUNT: "Ein zufälliger Hider wird in den nächsten 30 Sekunden geärgert."
TAUNT_ACTIVATE: "Ärgern wurde aktiviert"
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_GAME: "&c&l- &fTeleport-Position für den Spielbeginn festlegen mit /hs setspawn"
- SETUP_LOBBY: "&c&l- &fTeleport-Position für die Lobby festlegen mit /hs setlobby"
- SETUP_SEEKER_LOBBY: "&c&l- &fTeleport-Position für die Lobby Seekern festlegen mit /hs setseekerlobby"
- SETUP_EXIT: "&c&l- &fTeleport-Position für das Spielende festlegen mit /hs setexit"
- SETUP_SAVEMAP: "&c&l- &fHide and Seek Weltkarte speichern mit /hs savemap (nach /hs setspawn)"
+ SETUP_GAME: "&c&l- &fSpielspawn ist nicht gesetzt, /hs map set spawn <map>"
+ SETUP_LOBBY: "&c&l- &fLobby-Spawn ist nicht gesetzt, /hs map set lobby <map>"
+ SETUP_SEEKER_LOBBY: "&c&l- &fSucherlobby-Spawn ist nicht gesetzt, /hs map set seekerlobby <map>"
+ SETUP_EXIT: "&c&l- &fBeenden/Verlassen der Teleportposition ist nicht festgelegt, /hs setexit"
+ 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_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"
LOBBY_SPAWN: "Teleport-Position für Lobby festgelegt"
EXIT_SPAWN: "Teleport-Position für Spielende 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_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_LAST: "Die Hider haben {AMOUNT} Sekunde Zeit sich zu verstecken!"
START: "Los, Seeker! Es ist Zeit, die Hider zu finden."
@@ -76,7 +89,44 @@ Localization:
FLYING_ENABLED: "Fliegen aktiviert"
FLYING_DISABLED: "Fliegen deaktiviert"
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
-version: 3
+version: 4
type: "de-DE"
diff --git a/src/main/resources/lang/localization_en-US.yml b/src/main/resources/lang/localization_en-US.yml
index f03d188..062f4f2 100644
--- a/src/main/resources/lang/localization_en-US.yml
+++ b/src/main/resources/lang/localization_en-US.yml
@@ -10,6 +10,7 @@ Localization:
COMMAND_PLAYER_ONLY: "This command can only be run as a player."
COMMAND_NOT_ALLOWED: "You are not allowed to run this command."
COMMAND_ERROR: "An internal error has occurred."
+ COMMAND_INVALID_ARG: "Invalid argument: {AMOUNT}"
GAME_PLAYER_DEATH: "&c{PLAYER}&f was killed."
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."
@@ -17,7 +18,7 @@ Localization:
GAME_GAMEOVER_SEEKERS_QUIT: "All seekers have quit."
GAME_GAMEOVER_HIDERS_QUIT: "All hiders have quit."
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_NOT_INGAME: "You are not in a lobby/game."
GAME_INPROGRESS: "There is currently a game in progress."
@@ -25,6 +26,7 @@ Localization:
GAME_JOIN: "{PLAYER} has joined the HideAndSeek lobby."
GAME_JOIN_SPECTATOR: "You have joined mid game and are now a spectator."
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."
MAPSAVE_INPROGRESS: "Map save is currently in progress. Try again later."
MAPSAVE_START: "Starting map save."
@@ -32,6 +34,9 @@ Localization:
MAPSAVE_END: "Map save complete."
MAPSAVE_ERROR: "Couldn't find current map."
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_INVALID_INPUT: "Invalid integer {AMOUNT}."
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_ACTIVATE: "Taunt has been activated."
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_GAME: "&c&l- &fGame spawn isn't set, /hs setspawn"
- SETUP_LOBBY: "&c&l- &fLobby spawn isn't set, /hs setlobby"
- SETUP_SEEKER_LOBBY: "&c&l- &fSeeker Lobby spawn isn't set, /hs setseekerlobby"
+ SETUP_GAME: "&c&l- &fGame spawn isn't set, /hs map set spawn <map>"
+ 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 map set seekerlobby <map>"
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_BOUNDS: "&c&l- &fPlease set game bounds in 2 opposite corners of the game map, /hs setbounds"
+ 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 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!"
GAME_SPAWN: "Set game spawn 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"
START_MIN_PLAYERS: "You must have at least {AMOUNT} players to start."
START_INVALID_NAME: "Invalid player: {PLAYER}."
+ START_FAILED_SEEKER: "Failed to select random seeker."
START_COUNTDOWN: "Hiders have {AMOUNT} seconds to hide!"
START_COUNTDOWN_LAST: "Hiders have {AMOUNT} second to hide!"
START: "Attention SEEKERS, its time to find the hiders!"
@@ -77,7 +89,44 @@ Localization:
FLYING_ENABLED: "&l&bFlying Enabled"
FLYING_DISABLED: "&l&bFlying Disabled"
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
-version: 3
+version: 4
type: "en-US" \ No newline at end of file
diff --git a/src/main/resources/leaderboard.yml b/src/main/resources/leaderboard.yml
index 9c7a777..cd958a3 100644
--- a/src/main/resources/leaderboard.yml
+++ b/src/main/resources/leaderboard.yml
@@ -16,6 +16,7 @@
# {COUNT} - The amount of player currently in the lobby.
# {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.
+# {MAP} - The current map the player is on
#
# GAME BOARD PLACEHOLDERS
#
@@ -38,6 +39,7 @@
# only Hiders will be able to see its effects though.
# {#SEEKER} - Number of current seekers.
# {#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
# BE CHANGED, AND THE SECOND ONE WILL SAY A PLACEHOLDER MARKER!
@@ -50,12 +52,15 @@ lobby:
"Players: {COUNT}",
"",
"&cSEEKER % &f{SEEKER%}",
- "&6HIDER % &f{HIDER%}"
+ "&6HIDER % &f{HIDER%}",
+ "",
+ "Map: {MAP}",
]
game:
title: "&eHIDE AND SEEK"
content: [
+ "Map: {MAP}",
"Team: {TEAM}",
"",
"Time Left: &a{TIME}",
diff --git a/src/main/resources/maps.yml b/src/main/resources/maps.yml
new file mode 100644
index 0000000..8505162
--- /dev/null
+++ b/src/main/resources/maps.yml
@@ -0,0 +1 @@
+maps: \ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index f0d8fe5..c6ce455 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,6 +1,6 @@
name: KenshinsHideAndSeek
main: net.tylermurphy.hideAndSeek.Main
-version: 1.6.2
+version: 1.7.0
author: KenshinEto
load: STARTUP
api-version: 1.13
@@ -12,82 +12,64 @@ commands:
usage: /hideandseek [command]
aliases: hs
permissions:
- hideandseek.*:
- 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
+ hs.help:
default: true
- hideandseek.help:
- description: Allows you to run the help command
+ hs.join:
default: true
- hideandseek.reload:
- description: Allows you to reload the config
+ hs.leave:
+ default: true
+ hs.top:
+ default: true
+ hs.wins:
+ default: true
+ hs.reload:
default: op
- hideandseek.setborder:
- description: Allows you to set the game world border
+ hs.send:
default: op
- hideandseek.setspawn:
- description: Allows you to set the game spawn point
+ hs.setexit:
default: op
- hideandseek.setlobby:
- description: Allows you to set the game lobby point
+ hs.start:
default: op
- hideandseek.setseekerlobby:
- description: Allows you to set the game seeker lobby point
+ hs.stop:
default: op
- hideandseek.setexit:
- description: Allows you to set the game exit point
+ hs.map.add:
default: op
- hideandseek.setbounds:
- description: Allows you to set bounds for the game map
+ hs.map.remove:
default: op
- hideandseek.setup:
- description: Allows you to see what needs to be setup for the plugin to function
+ hs.map.list:
default: op
- hideandseek.start:
- description: Allows you to start the game
+ hs.map.status:
default: op
- hideandseek.stop:
- description: Allows you to stop the game
+ hs.map.save:
default: op
- hideandseek.savemap:
- description: Allows you to set the current game map
+ hs.map.debug:
default: op
- hideandseek.join:
- description: Allows you to join the game manual lobby
- default: true
- hideandseek.leave:
- description: Allows you to leave the game manual lobby
- default: true
- hideandseek.leavebounds:
- description: Allows players to leave specified game bounderies
+ hs.map.goto:
default: op
- hideandseek.wins:
- 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
+ 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
+