Merge pull request '1.7.0 - Multi Map Support' (#4) from dev into main
Reviewed-on: https://g.tylerm.dev/tylermurphy534/KenshinsHideAndSeek/pulls/4
This commit is contained in:
commit
8fdd3461c1
99 changed files with 3627 additions and 2244 deletions
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -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.
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
|
@ -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.
|
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -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.
|
37
.github/workflows/beta.yml
vendored
37
.github/workflows/beta.yml
vendored
|
@ -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
|
37
.github/workflows/release.yml
vendored
37
.github/workflows/release.yml
vendored
|
@ -1,37 +0,0 @@
|
|||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout branch
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up JDK 1.8
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 1.8
|
||||
|
||||
- name: Build with Maven
|
||||
run: |
|
||||
mvn -B package --file pom.xml
|
||||
mkdir staging && cp target/*.jar staging
|
||||
|
||||
- name: Set up a cache for maven
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.m2
|
||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-m2
|
||||
|
||||
- name: Upload artificats
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: artifacts-release
|
||||
path: staging
|
BIN
lib/ProtocolLib.jar
Normal file
BIN
lib/ProtocolLib.jar
Normal file
Binary file not shown.
32
pom.xml
32
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>
|
|
@ -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();
|
||||
|
||||
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;
|
||||
|
||||
if(board != null) {
|
||||
board.getPlayers().forEach(player -> {
|
||||
board.removeBoard(player);
|
||||
PlayerLoader.unloadPlayer(player);
|
||||
player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
|
||||
exitPosition.teleport(player);
|
||||
});
|
||||
|
||||
Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(this);
|
||||
board.cleanup();
|
||||
}
|
||||
|
||||
if(disguiser != null) {
|
||||
disguiser.cleanUp();
|
||||
}
|
||||
|
||||
Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(this);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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) {
|
||||
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"));
|
||||
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");
|
||||
}
|
||||
message = new StringBuilder(message.substring(0, message.length() - 1));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[0]));
|
||||
return;
|
||||
}
|
||||
String spacer = ChatColor.GRAY + "?" + ChatColor.WHITE;
|
||||
StringBuilder message = new StringBuilder();
|
||||
message.append(String.format("%s================ %sHelp: Page (%s/%s) %s================",
|
||||
ChatColor.AQUA, ChatColor.WHITE, page, pages, ChatColor.AQUA));
|
||||
int lines = 0;
|
||||
for(Pair<String, ICommand> pair : commands.stream().skip((long) (page - 1) * pageSize).limit(pageSize).collect(Collectors.toList())) {
|
||||
ICommand command = pair.getRight();
|
||||
String label = pair.getLeft();
|
||||
String start = label.substring(0, label.indexOf(" "));
|
||||
String invoke = label.substring(label.indexOf(" ")+1);
|
||||
message.append(String.format("\n%s %s/%s %s%s %s%s\n%s %s%s%s",
|
||||
spacer,
|
||||
ChatColor.AQUA,
|
||||
start,
|
||||
ChatColor.WHITE,
|
||||
invoke,
|
||||
ChatColor.BLUE,
|
||||
command.getUsage(),
|
||||
spacer,
|
||||
ChatColor.GRAY,
|
||||
ChatColor.ITALIC,
|
||||
command.getDescription()
|
||||
));
|
||||
lines += 2;
|
||||
}
|
||||
if(lines / 2 < pageSize) {
|
||||
for(int i = 0; i < pageSize * 2 - lines; i++) {
|
||||
message.append("\n").append(spacer);
|
||||
}
|
||||
}
|
||||
message.append("\n").append(ChatColor.AQUA).append("===============================================");
|
||||
sender.sendMessage(message.toString());
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
@ -56,4 +48,8 @@ public class Reload implements ICommand {
|
|||
return "Reloads the config";
|
||||
}
|
||||
|
||||
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
69
src/main/java/net/tylermurphy/hideAndSeek/command/Send.java
Normal file
69
src/main/java/net/tylermurphy/hideAndSeek/command/Send.java
Normal file
|
@ -0,0 +1,69 @@
|
|||
package net.tylermurphy.hideAndSeek.command;
|
||||
|
||||
import net.tylermurphy.hideAndSeek.Main;
|
||||
import net.tylermurphy.hideAndSeek.command.util.ICommand;
|
||||
import net.tylermurphy.hideAndSeek.configuration.Map;
|
||||
import net.tylermurphy.hideAndSeek.configuration.Maps;
|
||||
import net.tylermurphy.hideAndSeek.game.util.Status;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix;
|
||||
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
|
||||
|
||||
public class Send implements ICommand {
|
||||
|
||||
public void execute(Player sender, String[] args) {
|
||||
|
||||
if (Main.getInstance().getGame().getStatus() != Status.STANDBY) {
|
||||
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
|
||||
return;
|
||||
}
|
||||
|
||||
Map map = Maps.getMap(args[0]);
|
||||
if(map == null) {
|
||||
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
|
||||
return;
|
||||
}
|
||||
|
||||
if(map.isNotSetup()){
|
||||
sender.sendMessage(errorPrefix + message("MAP_NOT_SETUP"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Main.getInstance().getBoard().contains(sender)) {
|
||||
sender.sendMessage(errorPrefix + message("GAME_NOT_INGAME"));
|
||||
return;
|
||||
}
|
||||
|
||||
Main.getInstance().getGame().setCurrentMap(map);
|
||||
Main.getInstance().getBoard().reloadLobbyBoards();
|
||||
for(Player player : Main.getInstance().getBoard().getPlayers()) {
|
||||
map.getLobby().teleport(player);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return "send";
|
||||
}
|
||||
|
||||
public String getUsage() {
|
||||
return "<map>";
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return "Set the current lobby to another map";
|
||||
}
|
||||
|
||||
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
|
||||
if(parameter.equals("map")) {
|
||||
return Maps.getAllMaps().stream().filter(map -> !map.isNotSetup()).map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -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.";
|
||||
}
|
||||
|
||||
}
|
|
@ -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.";
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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.");
|
||||
Main.getInstance().getGame().start();
|
||||
return;
|
||||
}
|
||||
seekerName = rand.get().getName();
|
||||
} 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
123
src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java
Normal file
123
src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java
Normal file
|
@ -0,0 +1,123 @@
|
|||
package net.tylermurphy.hideAndSeek.command.map;
|
||||
|
||||
import com.cryptomorin.xseries.XMaterial;
|
||||
import net.tylermurphy.hideAndSeek.Main;
|
||||
import net.tylermurphy.hideAndSeek.command.util.ICommand;
|
||||
import net.tylermurphy.hideAndSeek.configuration.Maps;
|
||||
import net.tylermurphy.hideAndSeek.game.PlayerLoader;
|
||||
import net.tylermurphy.hideAndSeek.game.util.Status;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
|
||||
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
|
||||
|
||||
public class Debug implements ICommand {
|
||||
|
||||
private static final Map<Player, Map<Integer, Consumer<Player>>> debugMenuFunctions = new HashMap<>();
|
||||
|
||||
public void execute(Player sender, String[] args) {
|
||||
net.tylermurphy.hideAndSeek.configuration.Map map = Maps.getMap(args[0]);
|
||||
if(map == null) {
|
||||
sender.sendMessage(errorPrefix + message("INVALID_MAP"));
|
||||
return;
|
||||
}
|
||||
Inventory debugMenu = createMenu(map, sender);
|
||||
sender.openInventory(debugMenu);
|
||||
}
|
||||
|
||||
private Inventory createMenu(net.tylermurphy.hideAndSeek.configuration.Map map, Player sender){
|
||||
Map<Integer, Consumer<Player>> functions = new HashMap<>();
|
||||
Inventory debugMenu = Main.getInstance().getServer().createInventory(null, 9, "Debug Menu");
|
||||
debugMenu.setItem(0, createOption(functions, 0, XMaterial.LEATHER_CHESTPLATE.parseMaterial(), "&6Become a &lHider", 1, player -> {
|
||||
if(mapSaveEnabled) {
|
||||
if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap();
|
||||
}
|
||||
Main.getInstance().getBoard().addHider(player);
|
||||
PlayerLoader.loadHider(player, map);
|
||||
if(Main.getInstance().getGame().getStatus() != Status.STARTING)
|
||||
PlayerLoader.resetPlayer(player, Main.getInstance().getBoard());
|
||||
}));
|
||||
debugMenu.setItem(1, createOption(functions, 1, XMaterial.GOLDEN_CHESTPLATE.parseMaterial(), "&cBecome a &lSeeker", 1, player -> {
|
||||
if(mapSaveEnabled) {
|
||||
if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap();
|
||||
}
|
||||
Main.getInstance().getBoard().addSeeker(player);
|
||||
PlayerLoader.loadSeeker(player, map);
|
||||
if(Main.getInstance().getGame().getStatus() != Status.STARTING)
|
||||
PlayerLoader.resetPlayer(player, Main.getInstance().getBoard());
|
||||
}));
|
||||
debugMenu.setItem(2, createOption(functions, 2, XMaterial.IRON_CHESTPLATE.parseMaterial(), "&8Become a &lSpectator", 1, player -> {
|
||||
if(mapSaveEnabled) {
|
||||
if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap();
|
||||
}
|
||||
Main.getInstance().getBoard().addSpectator(player);
|
||||
PlayerLoader.loadSpectator(player, map);
|
||||
}));
|
||||
debugMenu.setItem(3, createOption(functions, 3, XMaterial.BARRIER.parseMaterial(), "&cUnload from Game", 1, player -> {
|
||||
Main.getInstance().getBoard().remove(player);
|
||||
PlayerLoader.unloadPlayer(player);
|
||||
exitPosition.teleport(player);
|
||||
}));
|
||||
debugMenu.setItem(4, createOption(functions, 4, XMaterial.BARRIER.parseMaterial(), "&cDie In Game", 2, player -> {
|
||||
if((Main.getInstance().getBoard().isSeeker(player) || Main.getInstance().getBoard().isHider(player)) && Main.getInstance().getGame().getStatus() == Status.PLAYING){
|
||||
player.setHealth(0.1);
|
||||
}
|
||||
}));
|
||||
if(map.isBlockHuntEnabled()) {
|
||||
debugMenu.setItem(7, createOption(functions, 7, XMaterial.GLASS.parseMaterial(), "&dEnable Disguise", 1, player -> {
|
||||
PlayerLoader.openBlockHuntPicker(player, map);
|
||||
}));
|
||||
debugMenu.setItem(8, createOption(functions, 8, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> Main.getInstance().getDisguiser().reveal(player)));
|
||||
}
|
||||
debugMenuFunctions.put(sender, functions);
|
||||
return debugMenu;
|
||||
}
|
||||
|
||||
private ItemStack createOption(Map<Integer, Consumer<Player>> functions, int slow, Material material, String name, int amount, Consumer<Player> callback){
|
||||
ItemStack temp = new ItemStack(material, amount);
|
||||
ItemMeta meta = temp.getItemMeta();
|
||||
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
|
||||
temp.setItemMeta(meta);
|
||||
functions.put(slow, callback);
|
||||
return temp;
|
||||
}
|
||||
|
||||
public static void handleOption(Player player, int slotId){
|
||||
Main.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> {
|
||||
Consumer<Player> callback = debugMenuFunctions.get(player).get(slotId);
|
||||
if(callback != null) callback.accept(player);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return "debug";
|
||||
}
|
||||
|
||||
public String getUsage() {
|
||||
return "<map>";
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return "Run debug commands";
|
||||
}
|
||||
|
||||
public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) {
|
||||
if(parameter.equals("map")) {
|
||||
return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
|
@ -167,73 +104,35 @@ 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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
// 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;
|
||||
int start = yamlString.indexOf(' ', index);
|
||||
int end = yamlString.indexOf('\n', index);
|
||||
if (end == -1) end = yamlString.length();
|
||||
// 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));
|
||||
if (entry.getValue() instanceof List) {
|
||||
if (((List<?>) entry.getValue()).isEmpty()) {
|
||||
// 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("[");
|
||||
for (Object o : (List<?>) entry.getValue()) {
|
||||
replace.append(o.toString()).append(", ");
|
||||
// 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 = new StringBuilder(replace.substring(0, replace.length() - 2));
|
||||
replace.append("]");
|
||||
replace.append('\n').append(space).append("]");
|
||||
}
|
||||
// otherwise just put the value directly
|
||||
} else {
|
||||
replace.append(entry.getValue());
|
||||
replace.append(convert(value));
|
||||
}
|
||||
if (entry.getValue() instanceof String) {
|
||||
replace.append("\"");
|
||||
replace.reverse();
|
||||
replace.append("\"");
|
||||
replace.reverse();
|
||||
// replace the new value in the yaml string
|
||||
StringBuilder builder = new StringBuilder(yaml);
|
||||
builder.replace(start, end, replace.toString());
|
||||
yaml = builder.toString();
|
||||
}
|
||||
StringBuilder builder = new StringBuilder(yamlString);
|
||||
builder.replace(start+1, end, replace.toString());
|
||||
yamlString = 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
|
|
238
src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java
Normal file
238
src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java
Normal file
|
@ -0,0 +1,238 @@
|
|||
package net.tylermurphy.hideAndSeek.configuration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.tylermurphy.hideAndSeek.Main;
|
||||
import net.tylermurphy.hideAndSeek.game.events.Border;
|
||||
import net.tylermurphy.hideAndSeek.world.WorldLoader;
|
||||
import net.tylermurphy.hideAndSeek.util.Location;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.util.Vector;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
|
||||
|
||||
public class Map {
|
||||
|
||||
private final String name;
|
||||
|
||||
private Location
|
||||
spawnPosition = Location.getDefault(),
|
||||
lobbyPosition = Location.getDefault(),
|
||||
seekerLobbyPosition = Location.getDefault();
|
||||
|
||||
private int
|
||||
xBoundMin = 0,
|
||||
zBoundMin = 0,
|
||||
xBoundMax = 0,
|
||||
zBoundMax = 0,
|
||||
xWorldBorder = 0,
|
||||
zWorldBorder = 0,
|
||||
worldBorderSize = 0,
|
||||
worldBorderDelay = 0,
|
||||
worldBorderChange = 0;
|
||||
|
||||
private boolean
|
||||
blockhunt = false;
|
||||
|
||||
private List<Material>
|
||||
blockhuntBlocks = new ArrayList<>();
|
||||
|
||||
private final Border
|
||||
worldBorder;
|
||||
|
||||
private final WorldLoader
|
||||
worldLoader;
|
||||
|
||||
public Map(String name) {
|
||||
this.name = name;
|
||||
this.worldBorder = new Border(this);
|
||||
this.worldLoader = new WorldLoader(this);
|
||||
}
|
||||
|
||||
public void setSpawn(Location pos) {
|
||||
this.spawnPosition = pos;
|
||||
}
|
||||
|
||||
public void setLobby(Location pos) {
|
||||
this.lobbyPosition = pos;
|
||||
}
|
||||
|
||||
public void setSeekerLobby(Location pos) {
|
||||
this.seekerLobbyPosition = pos;
|
||||
}
|
||||
|
||||
public void setWorldBorderData(int x, int z, int size, int delay, int move) {
|
||||
if(size < 1) {
|
||||
this.worldBorderSize = 0;
|
||||
this.worldBorderDelay = 0;
|
||||
this.worldBorderChange = 0;
|
||||
this.xWorldBorder = 0;
|
||||
this.zWorldBorder = 0;
|
||||
} else {
|
||||
this.worldBorderSize = size;
|
||||
this.worldBorderDelay = delay;
|
||||
this.worldBorderChange = move;
|
||||
this.xWorldBorder = x;
|
||||
this.zWorldBorder = z;
|
||||
}
|
||||
this.worldBorder.resetWorldBorder();
|
||||
}
|
||||
|
||||
public void setBlockhunt(boolean enabled, List<Material> blocks) {
|
||||
if (Main.getInstance().supports(9)) {
|
||||
this.blockhunt = enabled;
|
||||
} else {
|
||||
this.blockhunt = false;
|
||||
}
|
||||
this.blockhuntBlocks = blocks;
|
||||
}
|
||||
|
||||
public void setBoundMin(int x, int z) {
|
||||
this.xBoundMin = x;
|
||||
this.zBoundMin = z;
|
||||
}
|
||||
|
||||
public void setBoundMax(int x, int z) {
|
||||
this.xBoundMax = x;
|
||||
this.zBoundMax = z;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Location getGameSpawn() {
|
||||
if(mapSaveEnabled) {
|
||||
return spawnPosition.changeWorld("hs_"+name);
|
||||
} else {
|
||||
return spawnPosition;
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getGameSpawnName() {
|
||||
if(mapSaveEnabled)
|
||||
return getGameSpawn().getWorld();
|
||||
else
|
||||
return getSpawn().getWorld();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Location getSpawn() {
|
||||
return spawnPosition;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getSpawnName() {
|
||||
return getSpawn().getWorld();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Location getLobby() {
|
||||
return lobbyPosition;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getLobbyName() {
|
||||
return getLobby().getWorld();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Location getSeekerLobby() {
|
||||
return seekerLobbyPosition;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getSeekerLobbyName() {
|
||||
return getSeekerLobby().getWorld();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Location getGameSeekerLobby() {
|
||||
if(mapSaveEnabled) {
|
||||
return seekerLobbyPosition.changeWorld("hs_"+name);
|
||||
} else {
|
||||
return seekerLobbyPosition;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isWorldBorderEnabled() {
|
||||
return worldBorderSize > 0;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Vector getWorldBorderPos() {
|
||||
return new Vector(
|
||||
xWorldBorder,
|
||||
0,
|
||||
zWorldBorder
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Vector getWorldBorderData() {
|
||||
return new Vector(
|
||||
worldBorderSize,
|
||||
worldBorderDelay,
|
||||
worldBorderChange
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Border getWorldBorder() {
|
||||
return worldBorder;
|
||||
}
|
||||
|
||||
public boolean isBlockHuntEnabled() {
|
||||
return blockhunt;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public List<Material> getBlockHunt() {
|
||||
return blockhuntBlocks;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Vector getBoundsMin() {
|
||||
return new Vector(
|
||||
xBoundMin,
|
||||
0,
|
||||
zBoundMin
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Vector getBoundsMax() {
|
||||
return new Vector(
|
||||
xBoundMax,
|
||||
0,
|
||||
zBoundMax
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public WorldLoader getWorldLoader() {
|
||||
return worldLoader;
|
||||
}
|
||||
|
||||
public boolean isNotSetup() {
|
||||
if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0 || !spawnPosition.exists()) return true;
|
||||
if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0 || !lobbyPosition.exists()) return true;
|
||||
if (exitPosition == null || exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0 || !exitPosition.exists()) return true;
|
||||
if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0 || !seekerLobbyPosition.exists()) return true;
|
||||
if (mapSaveEnabled && !getGameSpawn().exists()) return true;
|
||||
if (blockhunt && blockhuntBlocks.isEmpty()) return true;
|
||||
if(isWorldBorderEnabled() &&
|
||||
new Vector(spawnPosition.getX(), 0, spawnPosition.getZ()).distance(new Vector(xWorldBorder, 0, zWorldBorder)) > 100) return true;
|
||||
return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0;
|
||||
}
|
||||
|
||||
public boolean isBoundsNotSetup() {
|
||||
return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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();
|
||||
|
@ -220,13 +211,21 @@ public class Board {
|
|||
board.setLine(String.valueOf(i), line.replace("{SEEKER%}", getSeekerPercent()+""));
|
||||
} else if (line.contains("{HIDER%}")) {
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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)){
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
return visibleBefore;
|
||||
}
|
||||
|
|
|
@ -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 String getGameWorld() {
|
||||
if (mapSaveEnabled) return "hideandseek_"+spawnWorld;
|
||||
else return spawnWorld;
|
||||
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 Map getCurrentMap() {
|
||||
return currentMap;
|
||||
}
|
||||
|
||||
private void checkWinConditions() {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
} else {
|
||||
test = event.getInventory().getName().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().startsWith("Select a Block: ");
|
||||
if(!test) return;
|
||||
mapName = event.getInventory().getName().substring("Select a Block: ".length());
|
||||
}
|
||||
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");
|
||||
} else {
|
||||
test = event.getInventory().getName().equals("Select a Block");
|
||||
}
|
||||
test = event.getView().getTitle().startsWith("Select a Block: ");
|
||||
if(!test) return;
|
||||
Material mat = blockhuntBlocks.get(0);
|
||||
mapName = event.getView().getTitle().substring("Select a Block: ".length());
|
||||
} else {
|
||||
test = event.getInventory().getName().startsWith("Select a Block: ");
|
||||
if(!test) return;
|
||||
mapName = event.getInventory().getName().substring("Select a Block: ".length());
|
||||
}
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
145
src/main/java/net/tylermurphy/hideAndSeek/util/Location.java
Normal file
145
src/main/java/net/tylermurphy/hideAndSeek/util/Location.java
Normal file
|
@ -0,0 +1,145 @@
|
|||
package net.tylermurphy.hideAndSeek.util;
|
||||
|
||||
import net.tylermurphy.hideAndSeek.Main;
|
||||
import net.tylermurphy.hideAndSeek.world.VoidGenerator;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.WorldCreator;
|
||||
import org.bukkit.WorldType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class Location {
|
||||
|
||||
private final String world;
|
||||
private final double x;
|
||||
private final double y;
|
||||
private final double z;
|
||||
|
||||
public static Location getDefault() {
|
||||
return new Location(
|
||||
"",
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
);
|
||||
}
|
||||
|
||||
public static Location from(Player player) {
|
||||
org.bukkit.Location location = player.getLocation();
|
||||
return new Location(
|
||||
player.getWorld().getName(),
|
||||
location.getX(),
|
||||
location.getY(),
|
||||
location.getZ()
|
||||
);
|
||||
}
|
||||
|
||||
public Location(@NotNull String world, double x, double y, double z) {
|
||||
this.world = world;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public Location(@NotNull String world, @NotNull org.bukkit.Location location) {
|
||||
this.world = world;
|
||||
this.x = location.getX();
|
||||
this.y = location.getY();
|
||||
this.z = location.getZ();
|
||||
}
|
||||
|
||||
public World load(WorldType type, World.Environment environment) {
|
||||
boolean mapSave = world.startsWith("hs_");
|
||||
World bukkitWorld = Bukkit.getWorld(world);
|
||||
if(bukkitWorld != null) return bukkitWorld;
|
||||
WorldCreator creator = new WorldCreator(world);
|
||||
if(type != null) {
|
||||
creator.type(type);
|
||||
}
|
||||
if(environment != null) {
|
||||
creator.environment(environment);
|
||||
}
|
||||
if(mapSave) {
|
||||
creator.generator(new VoidGenerator());
|
||||
}
|
||||
Bukkit.getServer().createWorld(creator).setAutoSave(!mapSave);
|
||||
return Bukkit.getWorld(world);
|
||||
}
|
||||
|
||||
public World load() {
|
||||
if(!exists()) return null;
|
||||
if(!Main.getInstance().isLoaded()) return null;
|
||||
return load(null, null);
|
||||
}
|
||||
|
||||
private org.bukkit.Location toBukkit() {
|
||||
return new org.bukkit.Location(
|
||||
Bukkit.getWorld(world),
|
||||
x,
|
||||
y,
|
||||
z
|
||||
);
|
||||
}
|
||||
|
||||
public void teleport(Player player) {
|
||||
if(!exists()) return;
|
||||
if(load() == null) return;
|
||||
player.teleport(toBukkit());
|
||||
}
|
||||
|
||||
public Location changeWorld(String world) {
|
||||
return new Location(
|
||||
world,
|
||||
x,
|
||||
y,
|
||||
z
|
||||
);
|
||||
}
|
||||
|
||||
public String getWorld() {
|
||||
return world;
|
||||
}
|
||||
|
||||
public double getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public double getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public double getZ() {
|
||||
return z;
|
||||
}
|
||||
|
||||
public int getBlockX() {
|
||||
return (int)x;
|
||||
}
|
||||
|
||||
public int getBlockY() {
|
||||
return (int)y;
|
||||
}
|
||||
|
||||
public int getBlockZ() {
|
||||
return (int)z;
|
||||
}
|
||||
|
||||
public boolean exists() {
|
||||
if(world.equals("")) return false;
|
||||
String path = Main.getInstance().getWorldContainer()+File.separator+world;
|
||||
File destination = new File(path);
|
||||
return destination.isDirectory();
|
||||
}
|
||||
|
||||
public boolean isNotSetup() {
|
||||
return getBlockX() == 0 && getBlockY() == 0 && getBlockZ() == 0;
|
||||
}
|
||||
|
||||
public boolean isNotInBounds(int xmin, int xmax, int zmin, int zmax) {
|
||||
return getBlockX() < xmin || getBlockX() > xmax || getBlockZ() < zmin || getBlockZ() > zmax;
|
||||
}
|
||||
|
||||
}
|
21
src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java
Normal file
21
src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package net.tylermurphy.hideAndSeek.util;
|
||||
|
||||
public class Pair<L, R> {
|
||||
|
||||
private final L left;
|
||||
private final R right;
|
||||
|
||||
public Pair(L left, R right) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
public L getLeft() {
|
||||
return left;
|
||||
}
|
||||
|
||||
public R getRight() {
|
||||
return right;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
27
src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java
Normal file
27
src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java
Normal file
|
@ -0,0 +1,27 @@
|
|||
package net.tylermurphy.hideAndSeek.util;
|
||||
|
||||
public class Tuple<L, C, R> {
|
||||
|
||||
private final L left;
|
||||
private final C center;
|
||||
private final R right;
|
||||
|
||||
public Tuple(L left, C center, R right) {
|
||||
this.left = left;
|
||||
this.center = center;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
public L getLeft() {
|
||||
return left;
|
||||
}
|
||||
|
||||
public C getCenter() {
|
||||
return center;
|
||||
}
|
||||
|
||||
public R getRight() {
|
||||
return right;
|
||||
}
|
||||
|
||||
}
|
|
@ -23,9 +23,7 @@ public class AbstractPacket {
|
|||
}
|
||||
|
||||
public void send(Player player){
|
||||
try {
|
||||
protocolManager.sendServerPacket(player, packet);
|
||||
} catch (InvocationTargetException ignored) {}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
public boolean shouldGenerateMobs() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean shouldGenerateStructures() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean canSpawn(@NotNull World world, int x, int z) {
|
||||
@Override
|
||||
public boolean canSpawn(World world, int x, int z) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getFixedSpawnLocation(World world, Random random) {
|
||||
return new Location(world, 0, 100, 0);
|
||||
}
|
||||
|
||||
// 1.13 And Prev
|
||||
public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) {
|
||||
return createChunkData(world);
|
||||
public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
|
||||
ChunkData chunkData = super.createChunkData(world);
|
||||
|
||||
for(int x = 0; x < 16; x++) {
|
||||
for(int z = 0; z < 16; z++) {
|
||||
biome.setBiome(x, z, Biome.PLAINS);
|
||||
}
|
||||
}
|
||||
|
||||
return chunkData;
|
||||
}
|
||||
|
||||
// 1.8
|
||||
|
|
|
@ -1,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;
|
||||
|
||||
|
@ -33,45 +14,42 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
|
|||
|
||||
public class WorldLoader {
|
||||
|
||||
private String mapName;
|
||||
private String saveName;
|
||||
private final Map map;
|
||||
|
||||
public WorldLoader(String mapName) {
|
||||
this.mapName = mapName;
|
||||
this.saveName = "hideandseek_"+ mapName;
|
||||
}
|
||||
|
||||
public void setNewMap(String mapName){
|
||||
this.mapName = mapName;
|
||||
this.saveName = "hideandseek_"+ mapName;
|
||||
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())));
|
||||
world.getPlayers().forEach(player -> exitPosition.teleport(player));
|
||||
Main.getInstance().scheduleTask(() -> {
|
||||
if (Bukkit.getServer().unloadWorld(world, false)) {
|
||||
Main.getInstance().getLogger().info("Successfully unloaded " + saveName);
|
||||
Main.getInstance().getLogger().info("Successfully unloaded " + map.getGameSpawnName());
|
||||
} else {
|
||||
Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + saveName);
|
||||
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);
|
||||
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 " + saveName);
|
||||
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) {
|
||||
|
|
|
@ -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 #
|
||||
# ---------------------------------------------------------- #
|
||||
blockedInteracts: [
|
||||
"FURNACE",
|
||||
"CRAFTING_TABLE",
|
||||
"ANVIL",
|
||||
"CHEST",
|
||||
"BARREL"
|
||||
]
|
||||
|
||||
# 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
|
||||
|
||||
# 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)
|
||||
# Auto filled by /hs setexit, so you don't need to touch this here
|
||||
exit:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
world: world
|
||||
world: "world"
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
|
@ -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}",
|
||||
|
|
1
src/main/resources/maps.yml
Normal file
1
src/main/resources/maps.yml
Normal file
|
@ -0,0 +1 @@
|
|||
maps:
|
|
@ -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
|
||||
default: op
|
||||
hideandseek.setborder:
|
||||
description: Allows you to set the game world border
|
||||
default: op
|
||||
hideandseek.setspawn:
|
||||
description: Allows you to set the game spawn point
|
||||
default: op
|
||||
hideandseek.setlobby:
|
||||
description: Allows you to set the game lobby point
|
||||
default: op
|
||||
hideandseek.setseekerlobby:
|
||||
description: Allows you to set the game seeker lobby point
|
||||
default: op
|
||||
hideandseek.setexit:
|
||||
description: Allows you to set the game exit point
|
||||
default: op
|
||||
hideandseek.setbounds:
|
||||
description: Allows you to set bounds for the game map
|
||||
default: op
|
||||
hideandseek.setup:
|
||||
description: Allows you to see what needs to be setup for the plugin to function
|
||||
default: op
|
||||
hideandseek.start:
|
||||
description: Allows you to start the game
|
||||
default: op
|
||||
hideandseek.stop:
|
||||
description: Allows you to stop the game
|
||||
default: op
|
||||
hideandseek.savemap:
|
||||
description: Allows you to set the current game map
|
||||
default: op
|
||||
hideandseek.join:
|
||||
description: Allows you to join the game manual lobby
|
||||
hs.leave:
|
||||
default: true
|
||||
hideandseek.leave:
|
||||
description: Allows you to leave the game manual lobby
|
||||
hs.top:
|
||||
default: true
|
||||
hideandseek.leavebounds:
|
||||
description: Allows players to leave specified game bounderies
|
||||
hs.wins:
|
||||
default: true
|
||||
hs.reload:
|
||||
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.send:
|
||||
default: op
|
||||
hs.setexit:
|
||||
default: op
|
||||
hs.start:
|
||||
default: op
|
||||
hs.stop:
|
||||
default: op
|
||||
hs.map.add:
|
||||
default: op
|
||||
hs.map.remove:
|
||||
default: op
|
||||
hs.map.list:
|
||||
default: op
|
||||
hs.map.status:
|
||||
default: op
|
||||
hs.map.save:
|
||||
default: op
|
||||
hs.map.debug:
|
||||
default: op
|
||||
hs.map.goto:
|
||||
default: op
|
||||
hs.map.set.lobby:
|
||||
default: op
|
||||
hs.map.set.spawn:
|
||||
default: op
|
||||
hs.map.set.seekerlobby:
|
||||
default: op
|
||||
hs.map.set.border:
|
||||
default: op
|
||||
hs.map.set.bounds:
|
||||
default: op
|
||||
hs.map.blockhunt.add:
|
||||
default: op
|
||||
hs.map.blockhunt.remove:
|
||||
default: op
|
||||
hs.map.blockhunt.list:
|
||||
default: op
|
||||
hs.world.create:
|
||||
default: op
|
||||
hs.world.delete:
|
||||
default: op
|
||||
hs.world.list:
|
||||
default: op
|
||||
hs.world.tp:
|
||||
default: op
|
||||
hs.confirm:
|
||||
default: op
|
||||
|
||||
|
|
Loading…
Reference in a new issue