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

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

View file

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

View file

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

View file

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

View file

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

View file

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

BIN
lib/ProtocolLib.jar Normal file

Binary file not shown.

32
pom.xml
View file

@ -1,13 +1,16 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<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>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,35 +1,22 @@
/*
* 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;
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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)
);
}
}

View file

@ -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");

View file

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

View file

@ -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)){

View file

@ -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;
}

View file

@ -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() {

View file

@ -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);
}

View file

@ -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() {

View file

@ -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);
}
}

View file

@ -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()));
}

View file

@ -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());

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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();
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,27 +1,8 @@
/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.tylermurphy.hideAndSeek.world;
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);
}else{
Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + saveName);
Main.getInstance().getLogger().info("Successfully unloaded " + map.getGameSpawnName());
} else {
Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + map.getGameSpawnName());
}
});
}
public void loadMap() {
Bukkit.getServer().createWorld(new WorldCreator(saveName).generator(new VoidGenerator()));
World world = Bukkit.getServer().getWorld(saveName);
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) {

View file

@ -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:
# 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
# Location where players are teleported into the lobby (/hs join)
lobby:
x: 0
y: 0
z: 0
world: world
# Location where seekers wait during the hiding grace period
seeker:
x: 0
y: 0
z: 0
# Currently is not used, seekers are teleported to spawns.game.world
world: world
# Location where players are teleported when they exit (/hs leave)
exit:
x: 0
y: 0
z: 0
world: world
world: "world"

View file

@ -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"

View file

@ -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"

View file

@ -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}",

View file

@ -0,0 +1 @@
maps:

View file

@ -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