Merge pull request #12 from tylermurphy534/1.3.1

1.3.1
This commit is contained in:
Tyler Murphy 2021-12-20 18:22:23 -05:00 committed by GitHub
commit 2ab0b2bbb6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
40 changed files with 1635 additions and 565 deletions

30
.github/workflows/beta.yml vendored Normal file
View file

@ -0,0 +1,30 @@
name: Beta
on:
release:
types: [ 1.3.1 ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
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
- name: Publish to GitHub Packages Apache Maven
run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml
env:
GITHUB_TOKEN: ${{ github.token }}

30
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,30 @@
name: Release
on:
release:
types: [ master ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
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
- name: Publish to GitHub Packages Apache Maven
run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml
env:
GITHUB_TOKEN: ${{ github.token }}

2
.gitignore vendored
View file

@ -4,3 +4,5 @@ project
bin/ bin/
target/ target/
.git/ .git/
.idea
*.iml

View file

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>hideandseek-plugin</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

66
pom.xml
View file

@ -1,43 +1,43 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<groupId>net.tylermurphy</groupId> <groupId>net.tylermurphy</groupId>
<artifactId>HideAndSeek</artifactId> <artifactId>HideAndSeek</artifactId>
<version>1.3.0</version> <version>1.3.1</version>
<name>Hide and Seek Plugin</name> <name>Hide and Seek Plugin</name>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version> <version>2.3.2</version>
<configuration> <configuration>
<source>1.8</source> <source>1.8</source>
<target>1.8</target> <target>1.8</target>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<repositories> <repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/public/</url>
</repository>
<repository> <repository>
<id>dmulloy2-repo</id> <id>spigot-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url> <url>https://hub.spigotmc.org/nexus/content/repositories/public/</url>
</repository> </repository>
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.17.1-R0.1-SNAPSHOT</version> <version>1.17.1-R0.1-SNAPSHOT</version>
<type>jar</type> <type>jar</type>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.comphenix.protocol</groupId> <groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId> <artifactId>ProtocolLib</artifactId>
<version>4.7.0</version> <version>4.7.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View file

@ -1,5 +1,7 @@
package net.tylermurphy.hideAndSeek; package net.tylermurphy.hideAndSeek;
import static net.tylermurphy.hideAndSeek.configuration.Config.spawnWorld;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -20,10 +22,12 @@ import net.tylermurphy.hideAndSeek.bukkit.TabCompleter;
import net.tylermurphy.hideAndSeek.bukkit.Tick; import net.tylermurphy.hideAndSeek.bukkit.Tick;
import net.tylermurphy.hideAndSeek.configuration.Config; import net.tylermurphy.hideAndSeek.configuration.Config;
import net.tylermurphy.hideAndSeek.configuration.Localization; import net.tylermurphy.hideAndSeek.configuration.Localization;
import net.tylermurphy.hideAndSeek.configuration.Items;
import net.tylermurphy.hideAndSeek.events.Glow; import net.tylermurphy.hideAndSeek.events.Glow;
import net.tylermurphy.hideAndSeek.events.Taunt; import net.tylermurphy.hideAndSeek.events.Taunt;
import net.tylermurphy.hideAndSeek.events.Worldborder; import net.tylermurphy.hideAndSeek.events.Worldborder;
import net.tylermurphy.hideAndSeek.util.Board; import net.tylermurphy.hideAndSeek.util.Board;
import net.tylermurphy.hideAndSeek.world.WorldLoader;
public class Main extends JavaPlugin implements Listener { public class Main extends JavaPlugin implements Listener {
@ -36,6 +40,8 @@ public class Main extends JavaPlugin implements Listener {
public Board board; public Board board;
public WorldLoader worldLoader;
public Map<String,Player> playerList = new HashMap<String,Player>(); public Map<String,Player> playerList = new HashMap<String,Player>();
public String status = "Standby"; public String status = "Standby";
@ -56,10 +62,12 @@ public class Main extends JavaPlugin implements Listener {
data = this.getDataFolder(); data = this.getDataFolder();
// Init Configuration // Init Configuration
Main.plugin.saveResource("localization.yml", false);
Main.plugin.saveResource("config.yml", false);
Config.loadConfig(); Config.loadConfig();
Localization.init(); Localization.loadLocalization();
Items.loadItems();
// Create World Loader
worldLoader = new WorldLoader(spawnWorld);
// Register Commands // Register Commands
CommandHandler.registerCommands(); CommandHandler.registerCommands();
@ -69,20 +77,19 @@ public class Main extends JavaPlugin implements Listener {
board.reload(); board.reload();
// Start Tick Timer // Start Tick Timer
onTickTask = Bukkit.getServer().getScheduler().runTaskTimer(this, new Runnable(){ onTickTask = Bukkit.getServer().getScheduler().runTaskTimer(this, () -> {
public void run(){ try{
try{ Tick.onTick();
Tick.onTick(); } catch (Exception e) {
} catch (Exception e) { e.printStackTrace();
e.printStackTrace(); }
} },0,1);
}
},0,1);
} }
public void onDisable() { public void onDisable() {
onTickTask.cancel(); if(onTickTask != null)
onTickTask.cancel();
} }
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

View file

@ -35,6 +35,7 @@ public class CommandHandler {
registerCommand(new SetBorder()); registerCommand(new SetBorder());
registerCommand(new Reload()); registerCommand(new Reload());
registerCommand(new SaveMap()); registerCommand(new SaveMap());
registerCommand(new SetBounds());
registerCommand(new Join()); registerCommand(new Join());
registerCommand(new Leave()); registerCommand(new Leave());
} }

View file

@ -2,6 +2,7 @@ package net.tylermurphy.hideAndSeek.bukkit;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import net.tylermurphy.hideAndSeek.command.Join;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
@ -27,7 +28,8 @@ import org.bukkit.event.player.PlayerQuitEvent;
import net.tylermurphy.hideAndSeek.util.Packet; import net.tylermurphy.hideAndSeek.util.Packet;
import net.tylermurphy.hideAndSeek.util.Util; import net.tylermurphy.hideAndSeek.util.Util;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.Start; import org.bukkit.potion.PotionEffect;
import static net.tylermurphy.hideAndSeek.configuration.Localization.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.*;
public class EventListener implements Listener { public class EventListener implements Listener {
@ -37,60 +39,90 @@ public class EventListener implements Listener {
event.getPlayer().setLevel(0); event.getPlayer().setLevel(0);
Main.plugin.board.remove(event.getPlayer()); Main.plugin.board.remove(event.getPlayer());
if(!Util.isSetup()) return; if(!Util.isSetup()) return;
if(event.getPlayer().getWorld().getName().equals("hideandseek_"+spawnWorld) || event.getPlayer().getWorld().getName().equals(lobbyWorld)){ if(autoJoin){
event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); Join.join(event.getPlayer());
event.getPlayer().setGameMode(GameMode.ADVENTURE); } else if(teleportToExit) {
if (event.getPlayer().getWorld().getName().equals("hideandseek_" + spawnWorld) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) {
event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
event.getPlayer().setGameMode(GameMode.ADVENTURE);
}
} else {
if (event.getPlayer().getWorld().getName().equals("hideandseek_" + spawnWorld)) {
event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()));
event.getPlayer().setGameMode(GameMode.ADVENTURE);
}
} }
} }
@EventHandler @EventHandler
public void onQuit(PlayerQuitEvent event) { public void onQuit(PlayerQuitEvent event) {
Main.plugin.board.remove(event.getPlayer()); Main.plugin.board.remove(event.getPlayer());
if(Main.plugin.status.equals("Standby")) {
Main.plugin.board.reloadLobbyBoards();
} else {
Main.plugin.board.reloadGameBoards();
}
for(PotionEffect effect : event.getPlayer().getActivePotionEffects()){
event.getPlayer().removePotionEffect(effect.getType());
}
} }
@EventHandler @EventHandler
public void onKick(PlayerKickEvent event) { public void onKick(PlayerKickEvent event) {
Main.plugin.board.remove(event.getPlayer()); Main.plugin.board.remove(event.getPlayer());
if(Main.plugin.status.equals("Standby")) {
Main.plugin.board.reloadLobbyBoards();
} else {
Main.plugin.board.reloadGameBoards();
}
for(PotionEffect effect : event.getPlayer().getActivePotionEffects()){
event.getPlayer().removePotionEffect(effect.getType());
}
} }
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageEvent event) { public void onEntityDamage(EntityDamageEvent event) {
if(event.getEntity() instanceof Player) { try {
Player p = (Player) event.getEntity(); if (event.getEntity() instanceof Player) {
if(!Main.plugin.board.isPlayer(p)) return; Player p = (Player) event.getEntity();
if(!Main.plugin.status.equals("Playing")) { if (!Main.plugin.board.isPlayer(p)) return;
event.setCancelled(true); if (!Main.plugin.status.equals("Playing")) {
return; event.setCancelled(true);
} return;
Player attacker = null;
if(event instanceof EntityDamageByEntityEvent) {
Entity damager = ((EntityDamageByEntityEvent)event).getDamager();
if(damager instanceof Player) {
attacker = (Player) damager;
if(Main.plugin.board.onSameTeam(p, attacker)) event.setCancelled(true);
if(Main.plugin.board.isSpectator(p)) event.setCancelled(true);
}
}
Player player = (Player) event.getEntity();
if(player.getHealth()-event.getDamage() < 0) {
if(spawnPosition == null) return;
event.setCancelled(true);
player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
player.teleport(new Location(Bukkit.getWorld("hideandseek_"+spawnWorld), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
Packet.playSound(player, Sound.ENTITY_PLAYER_DEATH, 1, 1);
if(Main.plugin.board.isSeeker(player)) {
Bukkit.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(event.getEntity()).toString());
} }
if(Main.plugin.board.isHider(player)) { Player attacker = null;
if(attacker == null) { if (event instanceof EntityDamageByEntityEvent) {
Util.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(event.getEntity()).toString()); Entity damager = ((EntityDamageByEntityEvent) event).getDamager();
} else { if (damager instanceof Player) {
Util.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(event.getEntity()).addPlayer(attacker).toString()); attacker = (Player) damager;
if (Main.plugin.board.onSameTeam(p, attacker)) event.setCancelled(true);
if (Main.plugin.board.isSpectator(p)) event.setCancelled(true);
} }
Main.plugin.board.addSeeker(player);
} }
Start.resetPlayer(player); Player player = (Player) event.getEntity();
if (player.getHealth() - event.getDamage() < 0 || !pvpEnabled) {
if (spawnPosition == null) return;
event.setCancelled(true);
player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
player.teleport(new Location(Bukkit.getWorld("hideandseek_" + spawnWorld), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
Packet.playSound(player, Sound.ENTITY_PLAYER_DEATH, 1, 1);
if (Main.plugin.board.isSeeker(player)) {
Bukkit.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(event.getEntity()).toString());
}
if (Main.plugin.board.isHider(player)) {
if (attacker == null) {
Util.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(event.getEntity()).toString());
} else {
Util.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(event.getEntity()).addPlayer(attacker).toString());
}
Main.plugin.board.addSeeker(player);
}
Util.resetPlayer(player);
Main.plugin.board.reloadBoardTeams();
}
} }
} catch (Exception e){
//Has shown to cause problems, so ignore if exception
} }
} }
@ -98,6 +130,7 @@ public class EventListener implements Listener {
public void onProjectile(ProjectileLaunchEvent event) { public void onProjectile(ProjectileLaunchEvent event) {
if(!Main.plugin.status.equals("Playing")) return; if(!Main.plugin.status.equals("Playing")) return;
if(event.getEntity() instanceof Snowball) { if(event.getEntity() instanceof Snowball) {
if(!glowEnabled) return;
Snowball snowball = (Snowball) event.getEntity(); Snowball snowball = (Snowball) event.getEntity();
if(snowball.getShooter() instanceof Player) { if(snowball.getShooter() instanceof Player) {
Player player = (Player) snowball.getShooter(); Player player = (Player) snowball.getShooter();

View file

@ -40,9 +40,13 @@ public class Tick {
else tick = 1; else tick = 1;
for(Player hider : Main.plugin.board.getHiders()) { for(Player hider : Main.plugin.board.getHiders()) {
int distance = 100; int distance = 100, temp = 100;
for(Player seeker : Main.plugin.board.getSeekers()) { for(Player seeker : Main.plugin.board.getSeekers()) {
int temp = (int) hider.getLocation().distance(seeker.getLocation()); try {
temp = (int) hider.getLocation().distance(seeker.getLocation());
} catch (Exception e){
//Players in different worlds, NOT OK!!!
}
if(distance > temp) { if(distance > temp) {
distance = temp; distance = temp;
} }

View file

@ -7,7 +7,7 @@ public class About implements ICommand {
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
sender.sendMessage( sender.sendMessage(
String.format("%s%sHide and Seek %s(1.3.0%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY,ChatColor.WHITE,ChatColor.GRAY) + String.format("%s%sHide and Seek %s(1.3.1%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY,ChatColor.WHITE,ChatColor.GRAY) +
String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) + String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) +
String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE) String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE)
); );

View file

@ -29,21 +29,28 @@ public class Join implements ICommand {
sender.sendMessage(errorPrefix + message("GAME_INGAME")); sender.sendMessage(errorPrefix + message("GAME_INGAME"));
return; return;
} }
join(player);
}
public static void join(Player player){
if(Main.plugin.status.equals("Standby")) { if(Main.plugin.status.equals("Standby")) {
player.getInventory().clear();
Main.plugin.board.addHider(player); Main.plugin.board.addHider(player);
if(announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); if(announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player));
else Util.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); else Util.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player));
player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ()));
player.setGameMode(GameMode.ADVENTURE); player.setGameMode(GameMode.ADVENTURE);
Main.plugin.board.createLobbyBoard(player);
Main.plugin.board.reloadLobbyBoards(); Main.plugin.board.reloadLobbyBoards();
} else { } else {
Main.plugin.board.addSeeker(player); Main.plugin.board.addSpectator(player);
player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR")); player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR"));
player.setGameMode(GameMode.SPECTATOR); player.setGameMode(GameMode.SPECTATOR);
Main.plugin.board.createGameBoard(player);
player.teleport(new Location(Bukkit.getWorld("hideandseek_"+spawnWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); player.teleport(new Location(Bukkit.getWorld("hideandseek_"+spawnWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ()));
} }
player.setFoodLevel(20); player.setFoodLevel(20);
player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue()); player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue());
} }

View file

@ -36,6 +36,7 @@ public class Leave implements ICommand {
Main.plugin.board.reloadLobbyBoards(); Main.plugin.board.reloadLobbyBoards();
} else { } else {
Main.plugin.board.reloadGameBoards(); Main.plugin.board.reloadGameBoards();
Main.plugin.board.reloadBoardTeams();
} }
} }

View file

@ -2,6 +2,7 @@ package net.tylermurphy.hideAndSeek.command;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import net.tylermurphy.hideAndSeek.configuration.Items;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
@ -19,7 +20,8 @@ public class Reload implements ICommand {
return; return;
} }
Config.loadConfig(); Config.loadConfig();
Localization.init(); Localization.loadLocalization();
Items.loadItems();
sender.sendMessage(messagePrefix + message("CONFIG_RELOAD")); sender.sendMessage(messagePrefix + message("CONFIG_RELOAD"));
} }

View file

@ -2,15 +2,6 @@ package net.tylermurphy.hideAndSeek.command;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
@ -36,66 +27,15 @@ public class SaveMap implements ICommand {
Bukkit.getServer().getWorld(spawnWorld).save(); Bukkit.getServer().getWorld(spawnWorld).save();
BukkitRunnable runnable = new BukkitRunnable() { BukkitRunnable runnable = new BukkitRunnable() {
public void run() { public void run() {
File current = new File(Main.root+File.separator+spawnWorld); sender.sendMessage(
if(current.exists()) { Main.plugin.worldLoader.save()
File temp_destenation = new File(Main.root+File.separator+"temp_hideandseek_"+spawnWorld); );
File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld); runningBackup = false;
copyFileStructure(current, temp_destenation);
if(destenation.exists()) {
deleteDirectory(destenation);
destenation.mkdir();
}
temp_destenation.renameTo(destenation);
sender.sendMessage(messagePrefix + message("MAPSAVE_END"));
runningBackup = false;
} else {
sender.sendMessage(errorPrefix + message("MAPSAVE_ERROR"));
}
} }
}; };
runnable.runTaskAsynchronously(Main.plugin); runnable.runTaskAsynchronously(Main.plugin);
runningBackup = true; runningBackup = true;
} }
private static void copyFileStructure(File source, File target){
try {
ArrayList<String> ignore = new ArrayList<>(Arrays.asList("uid.dat", "session.lock"));
if(!ignore.contains(source.getName())) {
if(source.isDirectory()) {
if(!target.exists())
if (!target.mkdirs())
throw new IOException("Couldn't create world directory!");
String files[] = source.list();
for (String file : files) {
File srcFile = new File(source, file);
File destFile = new File(target, file);
copyFileStructure(srcFile, destFile);
}
} else {
InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(target);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0)
out.write(buffer, 0, length);
in.close();
out.close();
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private boolean deleteDirectory(File directoryToBeDeleted) {
File[] allContents = directoryToBeDeleted.listFiles();
if (allContents != null) {
for (File file : allContents) {
deleteDirectory(file);
}
}
return directoryToBeDeleted.delete();
}
public String getLabel() { public String getLabel() {
return "saveMap"; return "saveMap";

View file

@ -26,9 +26,7 @@ public class SetBorder implements ICommand {
} }
if(args.length < 2) { if(args.length < 2) {
worldborderEnabled = false; worldborderEnabled = false;
Map<String, Object> temp = new HashMap<String,Object>(); addToConfig("worldBorder.enabled",false);
temp.put("enabled", false);
addToSection("worldBorder",temp);
saveConfig(); saveConfig();
sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE")); sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE"));
Worldborder.resetWorldborder(spawnWorld); Worldborder.resetWorldborder(spawnWorld);
@ -60,13 +58,11 @@ public class SetBorder implements ICommand {
worldborderSize = num; worldborderSize = num;
worldborderDelay = delay; worldborderDelay = delay;
worldborderEnabled = true; worldborderEnabled = true;
Map<String, Object> temp = new HashMap<String,Object>(); addToConfig("worldBorder.x", worldborderPosition.getBlockX());
temp.put("x", worldborderPosition.getBlockX()); addToConfig("worldBorder.z", worldborderPosition.getBlockZ());
temp.put("z", worldborderPosition.getBlockZ()); addToConfig("worldBorder.delay", worldborderDelay);
temp.put("delay", worldborderDelay); addToConfig("worldBorder.size", worldborderSize);
temp.put("size", worldborderSize); addToConfig("worldBorder.enabled", true);
temp.put("enabled", true);
addToSection("worldBorder",temp);
sender.sendMessage(messagePrefix + message("WORLDBORDER_ENABLE").addAmount(num).addAmount(delay)); sender.sendMessage(messagePrefix + message("WORLDBORDER_ENABLE").addAmount(num).addAmount(delay));
saveConfig(); saveConfig();
Worldborder.resetWorldborder(spawnWorld); Worldborder.resetWorldborder(spawnWorld);

View file

@ -0,0 +1,79 @@
package net.tylermurphy.hideAndSeek.command;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import net.tylermurphy.hideAndSeek.Main;
import static net.tylermurphy.hideAndSeek.configuration.Localization.*;
public class SetBounds implements ICommand {
public void execute(CommandSender sender, String[] args) {
if(!Main.plugin.status.equals("Standby")) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return;
}
if(spawnPosition == null) {
sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN"));
return;
}
Player player = (Player) sender;
if(!player.getWorld().getName().equals(spawnWorld)){
sender.sendMessage(errorPrefix + message("BOUNDS_WRONG_WORLD"));
return;
}
if(player.getLocation().getBlockX() == 0 || player.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", player.getLocation().getBlockX());
saveMaxX = player.getLocation().getBlockX();
} else if(saveMaxX < player.getLocation().getBlockX()) {
first = false;
addToConfig("bounds.max.x", player.getLocation().getBlockX());
addToConfig("bounds.min.x", saveMaxX);
saveMinX = saveMaxX;
saveMaxX = player.getLocation().getBlockX();
} else {
first = false;
addToConfig("bounds.min.x", player.getLocation().getBlockX());
saveMinX = player.getLocation().getBlockX();
}
if(saveMaxZ == 0) {
addToConfig("bounds.max.z", player.getLocation().getBlockZ());
saveMaxZ = player.getLocation().getBlockZ();
} else if(saveMaxZ < player.getLocation().getBlockZ()) {
first = false;
addToConfig("bounds.max.z", player.getLocation().getBlockZ());
addToConfig("bounds.min.z", saveMaxZ);
saveMinZ = saveMaxZ;
saveMaxZ = player.getLocation().getBlockZ();
} else {
first = false;
addToConfig("bounds.min.z", player.getLocation().getBlockZ());
saveMinZ = player.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

@ -15,23 +15,25 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.*;
public class SetExitLocation implements ICommand { public class SetExitLocation implements ICommand {
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
Vector newExitPosition = new Vector();
Player player = (Player) sender;
newExitPosition.setX(player.getLocation().getBlockX());
newExitPosition.setY(player.getLocation().getBlockY());
newExitPosition.setZ(player.getLocation().getBlockZ());
if(!Main.plugin.status.equals("Standby")) { if(!Main.plugin.status.equals("Standby")) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return; return;
} }
Vector newExitPosition = new Vector();
Player player = (Player) sender;
if(player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0 || player.getLocation().getBlockY() == 0){
sender.sendMessage(errorPrefix + message("NOT_AT_ZERO"));
return;
}
newExitPosition.setX(player.getLocation().getBlockX());
newExitPosition.setY(player.getLocation().getBlockY());
newExitPosition.setZ(player.getLocation().getBlockZ());
exitPosition = newExitPosition; exitPosition = newExitPosition;
sender.sendMessage(messagePrefix + message("EXIT_SPAWN")); sender.sendMessage(messagePrefix + message("EXIT_SPAWN"));
Map<String, Object> temp = new HashMap<String,Object>(); addToConfig("spawns.exit.x", exitPosition.getX());
temp.put("x", exitPosition.getX()); addToConfig("spawns.exit.y", exitPosition.getY());
temp.put("y", exitPosition.getY()); addToConfig("spawns.exit.z", exitPosition.getZ());
temp.put("z", exitPosition.getZ()); addToConfig("spawns.exit.world", player.getLocation().getWorld().getName());
temp.put("world", player.getLocation().getWorld().getName());
addToSection("spawns.exit",temp);
saveConfig(); saveConfig();
} }

View file

@ -15,23 +15,25 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.*;
public class SetLobbyLocation implements ICommand { public class SetLobbyLocation implements ICommand {
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
Vector newLobbyPosition = new Vector();
Player player = (Player) sender;
newLobbyPosition.setX(player.getLocation().getBlockX());
newLobbyPosition.setY(player.getLocation().getBlockY());
newLobbyPosition.setZ(player.getLocation().getBlockZ());
if(!Main.plugin.status.equals("Standby")) { if(!Main.plugin.status.equals("Standby")) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return; return;
} }
Vector newLobbyPosition = new Vector();
Player player = (Player) sender;
if(player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0 || player.getLocation().getBlockY() == 0){
sender.sendMessage(errorPrefix + message("NOT_AT_ZERO"));
return;
}
newLobbyPosition.setX(player.getLocation().getBlockX());
newLobbyPosition.setY(player.getLocation().getBlockY());
newLobbyPosition.setZ(player.getLocation().getBlockZ());
lobbyPosition = newLobbyPosition; lobbyPosition = newLobbyPosition;
sender.sendMessage(messagePrefix + message("LOBBY_SPAWN")); sender.sendMessage(messagePrefix + message("LOBBY_SPAWN"));
Map<String, Object> temp = new HashMap<String,Object>(); addToConfig("spawns.lobby.x", lobbyPosition.getX());
temp.put("x", lobbyPosition.getX()); addToConfig("spawns.lobby.y", lobbyPosition.getY());
temp.put("y", lobbyPosition.getY()); addToConfig("spawns.lobby.z", lobbyPosition.getZ());
temp.put("z", lobbyPosition.getZ()); addToConfig("spawns.lobby.world", player.getLocation().getWorld().getName());
temp.put("world", player.getLocation().getWorld().getName());
addToSection("spawns.lobby",temp);
saveConfig(); saveConfig();
} }

View file

@ -10,32 +10,36 @@ import org.bukkit.entity.Player;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import static net.tylermurphy.hideAndSeek.configuration.Config.addToConfig;
import static net.tylermurphy.hideAndSeek.configuration.Localization.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.*;
public class SetSpawnLocation implements ICommand { public class SetSpawnLocation implements ICommand {
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
Vector newSpawnPosition = new Vector();
Player player = (Player) sender;
newSpawnPosition.setX(player.getLocation().getBlockX());
newSpawnPosition.setY(player.getLocation().getBlockY());
newSpawnPosition.setZ(player.getLocation().getBlockZ());
if(!Main.plugin.status.equals("Standby")) { if(!Main.plugin.status.equals("Standby")) {
sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); sender.sendMessage(errorPrefix + message("GAME_INPROGRESS"));
return; return;
} }
if(worldborderEnabled && spawnPosition.distance(worldborderPosition) > 100) { Vector newSpawnPosition = new Vector();
Player player = (Player) sender;
if(player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0 || player.getLocation().getBlockY() == 0){
sender.sendMessage(errorPrefix + message("NOT_AT_ZERO"));
return;
}
newSpawnPosition.setX(player.getLocation().getBlockX());
newSpawnPosition.setY(player.getLocation().getBlockY());
newSpawnPosition.setZ(player.getLocation().getBlockZ());
if(worldborderEnabled && newSpawnPosition.distance(worldborderPosition) > 100) {
sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION")); sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION"));
return; return;
} }
spawnPosition = newSpawnPosition; spawnPosition = newSpawnPosition;
sender.sendMessage(messagePrefix + message("GAME_SPAWN")); sender.sendMessage(messagePrefix + message("GAME_SPAWN"));
Map<String, Object> temp = new HashMap<String,Object>(); addToConfig("spawns.game.x", spawnPosition.getX());
temp.put("x", spawnPosition.getX()); addToConfig("spawns.game.y", spawnPosition.getY());
temp.put("y", spawnPosition.getY()); addToConfig("spawns.game.z", spawnPosition.getZ());
temp.put("z", spawnPosition.getZ()); addToConfig("spawns.game.world", player.getLocation().getWorld().getName());
temp.put("world", player.getLocation().getWorld().getName());
addToSection("spawns.game",temp);
saveConfig(); saveConfig();
} }

View file

@ -28,9 +28,13 @@ public class Setup implements ICommand {
msg = msg + "\n" + message("SETUP_EXIT").toString(); msg = msg + "\n" + message("SETUP_EXIT").toString();
count++; count++;
} }
if(saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0) {
msg = msg + "\n" + message("SETUP_BOUNDS").toString();
count++;
}
File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld); File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld);
if(!destenation.exists()) { if(!destenation.exists()) {
msg = msg + "\n" + message("SETUP_MAPSAVE").toString(); msg = msg + "\n" + message("SETUP_SAVEMAP").toString();
count++; count++;
} }
if(count < 1) { if(count < 1) {

View file

@ -49,9 +49,9 @@ public class Start implements ICommand {
return; return;
} }
if(Bukkit.getServer().getWorld("hideandseek_"+spawnWorld) != null) { if(Bukkit.getServer().getWorld("hideandseek_"+spawnWorld) != null) {
Util.rollback("hideandseek_"+spawnWorld); Main.plugin.worldLoader.rollback();
} else { } else {
Util.loadMap("hideandseek_"+spawnWorld); Main.plugin.worldLoader.loadMap();
} }
String seekerName; String seekerName;
if(args.length < 1) { if(args.length < 1) {
@ -90,6 +90,9 @@ public class Start implements ICommand {
player.sendTitle(ChatColor.GOLD + "" + ChatColor.BOLD + "HIDER", ChatColor.WHITE + message("HIDERS_SUBTITLE").toString(), 10, 70, 20); player.sendTitle(ChatColor.GOLD + "" + ChatColor.BOLD + "HIDER", ChatColor.WHITE + message("HIDERS_SUBTITLE").toString(), 10, 70, 20);
} }
Worldborder.resetWorldborder("hideandseek_"+spawnWorld); Worldborder.resetWorldborder("hideandseek_"+spawnWorld);
for(Player player : Main.plugin.board.getPlayers()){
Main.plugin.board.createGameBoard(player);
}
Main.plugin.board.reloadGameBoards(); Main.plugin.board.reloadGameBoards();
Main.plugin.status = "Starting"; Main.plugin.status = "Starting";
int temp = Main.plugin.gameId; int temp = Main.plugin.gameId;
@ -106,7 +109,7 @@ public class Start implements ICommand {
Util.broadcastMessage(messagePrefix + message("START")); Util.broadcastMessage(messagePrefix + message("START"));
Main.plugin.status = "Playing"; Main.plugin.status = "Playing";
for(Player player : Main.plugin.board.getPlayers()) { for(Player player : Main.plugin.board.getPlayers()) {
resetPlayer(player); Util.resetPlayer(player);
} }
Main.plugin.worldborder = null; Main.plugin.worldborder = null;
Main.plugin.taunt = null; Main.plugin.taunt = null;
@ -116,86 +119,24 @@ public class Start implements ICommand {
Main.plugin.worldborder = new Worldborder(Main.plugin.gameId); Main.plugin.worldborder = new Worldborder(Main.plugin.gameId);
Main.plugin.worldborder.schedule(); Main.plugin.worldborder.schedule();
} }
Main.plugin.taunt = new Taunt(Main.plugin.gameId); if(tauntEnabled) {
Main.plugin.taunt.schedule(); Main.plugin.taunt = new Taunt(Main.plugin.gameId);
Main.plugin.taunt.schedule();
Main.plugin.glow = new Glow(Main.plugin.gameId); }
if (glowEnabled) {
Main.plugin.glow = new Glow(Main.plugin.gameId);
}
if(gameLength > 0) { if(gameLength > 0) {
Main.plugin.timeLeft = gameLength; Main.plugin.timeLeft = gameLength;
for(Player player : Main.plugin.board.getPlayers()) {
player.setLevel(gameLength);
}
} }
} }
}, 20 * 30); }, 20 * 30);
} }
public static void resetPlayer(Player player) {
player.getInventory().clear();
for(PotionEffect effect : player.getActivePotionEffects()){
player.removePotionEffect(effect.getType());
}
player.addPotionEffect(new PotionEffect(PotionEffectType.DOLPHINS_GRACE, 1000000, 1, false, false));
if(Main.plugin.board.isSeeker(player)){
ItemStack diamondSword = new ItemStack(Material.DIAMOND_SWORD,1);
diamondSword.addEnchantment(Enchantment.DAMAGE_ALL, 1);
ItemMeta diamondSwordMeta = diamondSword.getItemMeta();
diamondSwordMeta.setDisplayName("Seeker Sword");
diamondSwordMeta.setUnbreakable(true);
diamondSword.setItemMeta(diamondSwordMeta);
player.getInventory().addItem(diamondSword);
ItemStack wackyStick = new ItemStack(Material.STICK,1);
wackyStick.addUnsafeEnchantment(Enchantment.KNOCKBACK, 3);
ItemMeta wackyStickMeta = wackyStick.getItemMeta();
wackyStickMeta.setDisplayName("Wacky Stick");
wackyStick.setItemMeta(wackyStickMeta);
player.getInventory().addItem(wackyStick);
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 1000000, 2, false, false));
player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 1000000, 1, false, false));
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 1000000, 1, false, false));
player.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING, 1000000, 10, false, false));
}
else if(Main.plugin.board.isHider(player)){
ItemStack stoneSword = new ItemStack(Material.STONE_SWORD,1);
stoneSword.addEnchantment(Enchantment.DAMAGE_ALL, 2);
ItemMeta stoneSwordMeta = stoneSword.getItemMeta();
stoneSwordMeta.setDisplayName("Hider Sword");
stoneSwordMeta.setUnbreakable(true);
stoneSword.setItemMeta(stoneSwordMeta);
player.getInventory().addItem(stoneSword);
ItemStack splashPotion = new ItemStack(Material.SPLASH_POTION,1);
PotionMeta splashPotionMeta = (PotionMeta) splashPotion.getItemMeta();
splashPotionMeta.setBasePotionData(new PotionData(PotionType.REGEN));
splashPotion.setItemMeta(splashPotionMeta);
player.getInventory().addItem(splashPotion);
ItemStack potion = new ItemStack(Material.POTION,2);
PotionMeta potionMeta = (PotionMeta) potion.getItemMeta();
potionMeta.setBasePotionData(new PotionData(PotionType.INSTANT_HEAL));
potion.setItemMeta(potionMeta);
player.getInventory().addItem(potion);
ItemStack snowball = new ItemStack(Material.SNOWBALL,1);
ItemMeta snowballMeta = snowball.getItemMeta();
snowballMeta.setDisplayName("Glow Powerup");
List<String> snowballLore = new ArrayList<String>();
snowballLore.add("Throw to make all seekers glow");
snowballLore.add("Last 30s, all hiders can see it");
snowballLore.add("Time stacks on multi use");
snowballMeta.setLore(snowballLore);
snowball.setItemMeta(snowballMeta);
player.getInventory().addItem(snowball);
player.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING, 1000000, 1, false, false));
}
}
public String getLabel() { public String getLabel() {
return "start"; return "start";
} }

View file

@ -45,8 +45,8 @@ public class Stop implements ICommand {
Main.plugin.timeLeft = 0; Main.plugin.timeLeft = 0;
Worldborder.resetWorldborder("hideandseek_"+spawnWorld); Worldborder.resetWorldborder("hideandseek_"+spawnWorld);
for(Player player : Main.plugin.board.getPlayers()) { for(Player player : Main.plugin.board.getPlayers()) {
Main.plugin.board.createLobbyBoard(player);
player.setGameMode(GameMode.ADVENTURE); player.setGameMode(GameMode.ADVENTURE);
player.setLevel(0);
Main.plugin.board.addHider(player); Main.plugin.board.addHider(player);
player.getInventory().clear(); player.getInventory().clear();
player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ()));
@ -58,7 +58,7 @@ public class Stop implements ICommand {
Packet.setGlow(player, temp, false); Packet.setGlow(player, temp, false);
} }
} }
Util.unloadMap("hideandseek_"+spawnWorld); Main.plugin.worldLoader.unloadMap();
Main.plugin.board.reloadLobbyBoards(); Main.plugin.board.reloadLobbyBoards();
} }

View file

@ -1,15 +1,10 @@
package net.tylermurphy.hideAndSeek.configuration; package net.tylermurphy.hideAndSeek.configuration;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import net.tylermurphy.hideAndSeek.Main;
public class Config { public class Config {
private static ConfigManager manager;
public static String public static String
messagePrefix, messagePrefix,
@ -21,7 +16,8 @@ public class Config {
warningPrefix, warningPrefix,
spawnWorld, spawnWorld,
exitWorld, exitWorld,
lobbyWorld; lobbyWorld,
local;
public static Vector public static Vector
spawnPosition, spawnPosition,
@ -33,94 +29,115 @@ public class Config {
nametagsVisible, nametagsVisible,
permissionsRequired, permissionsRequired,
announceMessagesToNonPlayers, announceMessagesToNonPlayers,
worldborderEnabled; worldborderEnabled,
tauntEnabled,
tauntCountdown,
tauntLast,
glowEnabled,
glowStackable,
pvpEnabled,
autoJoin,
teleportToExit;
public static int public static int
minPlayers, minPlayers,
worldborderSize, worldborderSize,
worldborderDelay, worldborderDelay,
currentWorldborderSize, currentWorldborderSize,
gameLength; gameLength,
saveMinX,
public static FileConfiguration getConfig() { saveMinZ,
return Main.plugin.getConfig(); saveMaxX,
} saveMaxZ,
tauntDelay,
public static void saveConfig() { glowLength;
Main.plugin.saveConfig();
}
public static void loadConfig() { public static void loadConfig() {
Main.plugin.reloadConfig(); manager = new ConfigManager("config.yml");
manager.saveConfig();
//Spawn //Spawn
spawnPosition = new Vector( spawnPosition = new Vector(
getConfig().getDouble("spawns.game.x"), manager.getDouble("spawns.game.x"),
Math.max(0,Math.min(255,getConfig().getDouble("spawns.game.y"))), Math.max(0, Math.min(255, manager.getDouble("spawns.game.y"))),
getConfig().getDouble("spawns.game.z") manager.getDouble("spawns.game.z")
); );
spawnWorld = getConfig().getString("spawns.game.world"); spawnWorld = manager.getString("spawns.game.world");
///Lobby ///Lobby
lobbyPosition = new Vector( lobbyPosition = new Vector(
getConfig().getDouble("spawns.lobby.x"), manager.getDouble("spawns.lobby.x"),
Math.max(0,Math.min(255,getConfig().getDouble("spawns.lobby.y"))), Math.max(0, Math.min(255, manager.getDouble("spawns.lobby.y"))),
getConfig().getDouble("spawns.lobby.z") manager.getDouble("spawns.lobby.z")
); );
lobbyWorld = getConfig().getString("spawns.lobby.world"); lobbyWorld = manager.getString("spawns.lobby.world");
announceMessagesToNonPlayers = getConfig().getBoolean("announceMessagesToNonPlayers"); announceMessagesToNonPlayers = manager.getBoolean("announceMessagesToNonPlayers");
exitPosition = new Vector( exitPosition = new Vector(
getConfig().getDouble("spawns.exit.x"), manager.getDouble("spawns.exit.x"),
Math.max(0,Math.min(255,getConfig().getDouble("spawns.exit.y"))), Math.max(0, Math.min(255, manager.getDouble("spawns.exit.y"))),
getConfig().getDouble("spawns.exit.z") manager.getDouble("spawns.exit.z")
); );
exitWorld = getConfig().getString("spawns.exit.world"); exitWorld = manager.getString("spawns.exit.world");
//World border //World border
worldborderPosition = new Vector( worldborderPosition = new Vector(
getConfig().getInt("worldBorder.x"), manager.getInt("worldBorder.x"),
0, 0,
getConfig().getInt("worldBorder.z") manager.getInt("worldBorder.z")
); );
worldborderSize = Math.max(100,getConfig().getInt("worldBorder.size")); worldborderSize = Math.max(100, manager.getInt("worldBorder.size"));
worldborderDelay = Math.max(1,getConfig().getInt("worldBorder.delay")); worldborderDelay = Math.max(1, manager.getInt("worldBorder.delay"));
worldborderEnabled = getConfig().getBoolean("worldBorder.enabled"); worldborderEnabled = manager.getBoolean("worldBorder.enabled");
//Prefix //Prefix
char SYMBOLE = '\u00A7'; char SYMBOLE = '\u00A7';
String SYMBOLE_STRING = new String(new char[] {SYMBOLE}); String SYMBOLE_STRING = String.valueOf(SYMBOLE);
messagePrefix = getConfig().getString("prefix.default").replace("&", SYMBOLE_STRING); messagePrefix = manager.getString("prefix.default").replace("&", SYMBOLE_STRING);
errorPrefix = getConfig().getString("prefix.error").replace("&", SYMBOLE_STRING); errorPrefix = manager.getString("prefix.error").replace("&", SYMBOLE_STRING);
tauntPrefix = getConfig().getString("prefix.taunt").replace("&", SYMBOLE_STRING); tauntPrefix = manager.getString("prefix.taunt").replace("&", SYMBOLE_STRING);
worldborderPrefix = getConfig().getString("prefix.border").replace("&", SYMBOLE_STRING); worldborderPrefix = manager.getString("prefix.border").replace("&", SYMBOLE_STRING);
abortPrefix = getConfig().getString("prefix.abort").replace("&", SYMBOLE_STRING); abortPrefix = manager.getString("prefix.abort").replace("&", SYMBOLE_STRING);
gameoverPrefix = getConfig().getString("prefix.gameover").replace("&", SYMBOLE_STRING); gameoverPrefix = manager.getString("prefix.gameover").replace("&", SYMBOLE_STRING);
warningPrefix = getConfig().getString("prefix.warning").replace("&", SYMBOLE_STRING); warningPrefix = manager.getString("prefix.warning").replace("&", SYMBOLE_STRING);
//Map Bounds
saveMinX = manager.getInt("bounds.min.x");
saveMinZ = manager.getInt("bounds.min.z");
saveMaxX = manager.getInt("bounds.max.x");
saveMaxZ = manager.getInt("bounds.max.z");
//Taunt
tauntEnabled = manager.getBoolean("taunt.enabled");
tauntCountdown = manager.getBoolean("taunt.showCountdown");
tauntDelay = Math.max(60,manager.getInt("taunt.delay"));
tauntLast = manager.getBoolean("taunt.whenLastPerson");
//Glow
glowLength = Math.max(1,manager.getInt("glow.time"));
glowStackable = manager.getBoolean("glow.stackable");
glowEnabled = manager.getBoolean("glow.enabled");
//Other //Other
nametagsVisible = getConfig().getBoolean("nametagsVisible"); nametagsVisible = manager.getBoolean("nametagsVisible");
permissionsRequired = getConfig().getBoolean("permissionsRequired"); permissionsRequired = manager.getBoolean("permissionsRequired");
minPlayers = Math.max(2,getConfig().getInt("minPlayers")); minPlayers = Math.max(2, manager.getInt("minPlayers"));
gameLength = getConfig().getInt("gameLength"); gameLength = manager.getInt("gameLength");
pvpEnabled = manager.getBoolean("pvp");
getConfig().options().copyDefaults(true); autoJoin = manager.getBoolean("autoJoin");
saveConfig(); teleportToExit = manager.getBoolean("teleportToExit");
local = manager.getString("local");
} }
public static void addToSection(String sectionName, Map<String,Object> values) { public static void addToConfig(String path, Object value) {
ConfigurationSection section = getConfig().getConfigurationSection(sectionName); manager.set(path, value);
if(section == null) section = getConfig().createSection(sectionName); }
Map<String,Object> sectionValues = section.getValues(true);
for(Entry<String, Object> entry : values.entrySet()) { public static void saveConfig() {
sectionValues.put(entry.getKey(), entry.getValue()); manager.saveConfig();
}
getConfig().createSection(sectionName, sectionValues);
saveConfig();
} }
} }

View file

@ -0,0 +1,176 @@
package net.tylermurphy.hideAndSeek.configuration;
import net.tylermurphy.hideAndSeek.Main;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Map;
public class ConfigManager {
private File file;
private YamlConfiguration config,defaultConfig;
public ConfigManager(String filename){
this.file = new File(Main.plugin.getDataFolder(), filename);
if(!file.exists()){
saveDefaultConfiguration();
}
this.config = YamlConfiguration.loadConfiguration(file);
InputStream input = Main.plugin.getResource(file.getName());
InputStreamReader reader = new InputStreamReader(input);
this.defaultConfig = YamlConfiguration.loadConfiguration(reader);
try{
input.close();
reader.close();
} catch (IOException e){}
}
public ConfigManager(String filename, String defaultFilename){
this.file = new File(Main.plugin.getDataFolder(), filename);
if(!file.exists()){
saveDefaultConfiguration();
}
this.config = YamlConfiguration.loadConfiguration(file);
InputStream input = Main.plugin.getResource(defaultFilename);
InputStreamReader reader = new InputStreamReader(input);
this.defaultConfig = YamlConfiguration.loadConfiguration(reader);
try{
input.close();
reader.close();
} catch (IOException e){
Main.plugin.getLogger().severe("Couldn't find "+defaultFilename+" internally. Did you set an incorrect local?");
Main.plugin.getServer().getPluginManager().disablePlugin(Main.plugin);
throw new RuntimeException();
}
}
private void saveDefaultConfiguration(){
try{
InputStream input = Main.plugin.getResource(file.getName());
java.nio.file.Files.copy(input, file.toPath());
input.close();
} catch(IOException e){
e.printStackTrace();
}
}
public void addToConfig(String path, Object value) {
config.set(path, value);
}
public double getDouble(String path){
double value = config.getDouble(path);
if(value == 0.0D){
return defaultConfig.getDouble(path);
} else {
return value;
}
}
public int getInt(String path){
int value = config.getInt(path);
if(value == 0){
return defaultConfig.getInt(path);
} else {
return value;
}
}
public String getString(String path){
String value = config.getString(path);
if(value == null){
return defaultConfig.getString(path);
} else {
return value;
}
}
public void reset(String path){
config.set(path, defaultConfig.get(path));
}
public void resetConfig(){
config = defaultConfig;
saveConfig();
}
public boolean getBoolean(String path){
boolean value = config.getBoolean(path);
if(value == false){
return defaultConfig.getBoolean(path);
} else {
return true;
}
}
public ConfigurationSection getConfigurationSection(String path){
ConfigurationSection section = config.getConfigurationSection(path);
if(section == null){
return defaultConfig.getConfigurationSection(path);
} else {
return section;
}
}
public void set(String path, Object value){
config.set(path, value);
}
public void saveConfig(){
try {
InputStream is = Main.plugin.getResource(file.getName());
StringBuilder textBuilder = new StringBuilder();
Reader reader = new BufferedReader(new InputStreamReader(is, Charset.forName(StandardCharsets.UTF_8.name())));
int c = 0;
while((c = reader.read()) != -1){
textBuilder.append((char) c);
}
String yamlString = textBuilder.toString();
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){
String[] parts = entry.getKey().split("\\.");
int index = 0;
int i = 0;
for(String part : parts) {
if(i == 0) {
index = yamlString.indexOf(part, index);
} else {
index = yamlString.indexOf(" " + part, index);
index++;
}
i++;
if(index == -1) break;
}
if(index == -1) continue;;
int start = yamlString.indexOf(' ', index);
int end = yamlString.indexOf('\n', index);
if(end == -1) end = yamlString.length();
String replace = entry.getValue().toString();
if(entry.getValue() instanceof String){
replace = "\"" + replace + "\"";
}
StringBuilder builder = new StringBuilder(yamlString);
builder.replace(start+1, end == -1 ? yamlString.length() : end, replace);
yamlString = builder.toString();
}
}
PrintWriter out = new PrintWriter(file);
out.print(yamlString);
out.close();
} catch (IOException e){
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,129 @@
package net.tylermurphy.hideAndSeek.configuration;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Items {
public static List<ItemStack> HIDER_ITEMS, SEEKER_ITEMS;
public static List<PotionEffect> HIDER_EFFECTS, SEEKER_EFFECTS;
public static void loadItems() {
ConfigManager manager = new ConfigManager("items.yml");
SEEKER_ITEMS = new ArrayList<>();
ConfigurationSection SeekerItems = manager.getConfigurationSection("items.seeker");
int i = 1;
while (true) {
ConfigurationSection section = SeekerItems.getConfigurationSection(String.valueOf(i));
if(section == null) break;
ItemStack item = createItem(section);
if(item != null) SEEKER_ITEMS.add(item);
i++;
}
HIDER_ITEMS = new ArrayList<>();
ConfigurationSection HiderItems = manager.getConfigurationSection("items.hider");
i = 1;
while (true) {
ConfigurationSection section = HiderItems.getConfigurationSection(String.valueOf(i));
if(section == null) break;
ItemStack item = createItem(section);
if(item != null) HIDER_ITEMS.add(item);
i++;
}
SEEKER_EFFECTS = new ArrayList<>();
ConfigurationSection SeekerEffects = manager.getConfigurationSection("effects.seeker");
i = 1;
while (true) {
ConfigurationSection section = SeekerEffects.getConfigurationSection(String.valueOf(i));
if(section == null) break;
PotionEffect effect = getPotionEffect(section);
if(effect != null) SEEKER_EFFECTS.add(effect);
i++;
}
HIDER_EFFECTS = new ArrayList<>();
ConfigurationSection HiderEffects = manager.getConfigurationSection("effects.hider");
i = 1;
while (true) {
ConfigurationSection section = HiderEffects.getConfigurationSection(String.valueOf(i));
if(section == null) break;
PotionEffect effect = getPotionEffect(section);
if(effect != null) HIDER_EFFECTS.add(effect);
i++;
}
}
private static ItemStack createItem(ConfigurationSection item) {
String material_string = item.getString("material");
if(material_string == null) return null;
Material material = Material.valueOf(material_string.toUpperCase());
int amount = item.getInt("amount");
ItemStack stack = new ItemStack(material, amount);
if(material == Material.POTION || material == Material.SPLASH_POTION || material == Material.LINGERING_POTION){
PotionMeta meta = getPotionMeta(stack, item);
stack.setItemMeta(meta);
} else {
ConfigurationSection enchantments = item.getConfigurationSection("enchantments");
if (enchantments != null)
for (String enchantment_string : enchantments.getKeys(false)) {
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(enchantment_string));
if (enchantment == null) continue;
stack.addUnsafeEnchantment(
enchantment,
enchantments.getInt(enchantment_string)
);
}
ItemMeta meta = getItemMeta(stack,item);
stack.setItemMeta(meta);
}
return stack;
}
private static ItemMeta getItemMeta(ItemStack stack, ConfigurationSection item){
ItemMeta meta = stack.getItemMeta();
assert meta != null;
String name = item.getString("name");
if(name != null)
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
meta.setUnbreakable(item.getBoolean("unbreakable"));
meta.setLore(item.getStringList("lore"));
return meta;
}
private static PotionMeta getPotionMeta(ItemStack stack, ConfigurationSection item){
String type = item.getString("type");
PotionMeta meta = (PotionMeta) stack.getItemMeta();
if(type==null) return meta;
assert meta != null;
meta.setBasePotionData(new PotionData((PotionType.valueOf(type.toUpperCase()))));
return meta;
}
private static PotionEffect getPotionEffect(ConfigurationSection item){
String type = item.getString("type");
if(type == null) return null;
return new PotionEffect(
Objects.requireNonNull(PotionEffectType.getByName(type.toUpperCase())),
item.getInt("duration"),
item.getInt("amplifier"),
item.getBoolean("ambient"),
item.getBoolean("particles")
);
}
}

View file

@ -4,34 +4,51 @@ import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.bukkit.configuration.file.YamlConfiguration;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.tylermurphy.hideAndSeek.Main;
public class Localization { public class Localization {
public static final Map<String,LocalizationString> LOCAL = new HashMap<String,LocalizationString>(); public static final Map<String,LocalizationString> LOCAL = new HashMap<>();
static YamlConfiguration config; private static String[][] CHANGES = {{"WORLDBORDER_DECREASING"}};
public static boolean init() { public static void loadLocalization() {
Main.plugin.saveResource("localization.yml", false);
String path = Main.data.getAbsolutePath()+File.separator + "localization.yml"; ConfigManager manager = new ConfigManager("localization.yml", "lang"+File.separator+"localization_"+Config.local+".yml");
config = YamlConfiguration.loadConfiguration(new File(path));
for(String key : config.getConfigurationSection("Localization").getKeys(false)) { int PLUGIN_VERSION = 2;
int VERSION = manager.getInt("version");
if(VERSION < PLUGIN_VERSION){
for(int i = VERSION; i < PLUGIN_VERSION; i++){
if(i < 1) continue;
String[] changeList = CHANGES[i-1];
for(String change : changeList)
manager.reset("Localization." + change);
}
manager.reset("version");
}
String SELECTED_LOCAL = manager.getString("local");
if(!SELECTED_LOCAL.equals(Config.local)){
manager.resetConfig();
}
manager.saveConfig();
for(String key : manager.getConfigurationSection("Localization").getKeys(false)) {
LOCAL.put( LOCAL.put(
key, key,
new LocalizationString( ChatColor.translateAlternateColorCodes('&', config.getString("Localization."+key) ) ) new LocalizationString( ChatColor.translateAlternateColorCodes('&', manager.getString("Localization."+key) ) )
); );
} }
return true;
} }
public static LocalizationString message(String key) { public static LocalizationString message(String key) {
LocalizationString temp = LOCAL.get(key); LocalizationString temp = LOCAL.get(key);
if(temp == null) if(temp == null) {
return new LocalizationString(key+" missing from localization.yml"); return new LocalizationString(ChatColor.RED + "" + ChatColor.ITALIC + key + "is not found in localization.yml. This is a plugin issue, please report it.");
}
return new LocalizationString(temp.toString()); return new LocalizationString(temp.toString());
} }
} }

View file

@ -6,6 +6,8 @@ import org.bukkit.entity.Player;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.util.Packet; import net.tylermurphy.hideAndSeek.util.Packet;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class Glow { public class Glow {
private final int temp; private final int temp;
@ -18,7 +20,8 @@ public class Glow {
} }
public void onProjectilve() { public void onProjectilve() {
glowTime++; if(glowStackable) glowTime += glowLength;
else glowTime = glowLength;
if(!running) if(!running)
startGlow(); startGlow();
} }
@ -34,26 +37,29 @@ public class Glow {
} }
private void waitGlow() { private void waitGlow() {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, new Runnable() { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> {
public void run() { if(temp != Main.plugin.gameId) return;
if(temp != Main.plugin.gameId) return; glowTime--;
glowTime--; glowTime = Math.max(glowTime, 0);
glowTime = Math.max(glowTime, 0); if(glowTime == 0) {
if(glowTime == 0) { stopGlow();
stopGlow(); } else {
} else { waitGlow();
waitGlow();
}
} }
}, 20*30); }, 20);
} }
private void stopGlow() { private void stopGlow() {
running = false;
for(Player hider : Main.plugin.board.getHiders()) { for(Player hider : Main.plugin.board.getHiders()) {
for(Player seeker : Main.plugin.board.getSeekers()) { for (Player seeker : Main.plugin.board.getSeekers()) {
Packet.setGlow(hider, seeker, false); Packet.setGlow(hider, seeker, false);
} }
} }
} }
public boolean isRunning() {
return running;
}
} }

View file

@ -18,41 +18,33 @@ public class Taunt {
private final int temp; private final int temp;
private String tauntPlayer; private String tauntPlayer;
private int delay;
private boolean running;
public Taunt(int temp) { public Taunt(int temp) {
this.temp = temp; this.temp = temp;
this.delay = 0;
} }
public void schedule() { public void schedule() {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, new Runnable() { delay = tauntDelay;
public void run() { waitTaunt();
tryTaunt();
}
},20*60*5);
} }
private void waitTaunt() { private void waitTaunt() {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, new Runnable() { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> {
public void run() { if(delay == 0) {
tryTaunt(); if(!tauntLast && Main.plugin.board.size() < 2) return;
else executeTaunt();
} else {
delay--;
waitTaunt();
} }
},20*60); },20);
}
private void tryTaunt() {
if(temp != Main.plugin.gameId) return;
if(Math.random() > .8) {
executeTaunt();
} else {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, new Runnable() {
public void run() {
tryTaunt();
}
},20*60);
}
} }
private void executeTaunt() { private void executeTaunt() {
if(temp != Main.plugin.gameId) return;
Player taunted = null; Player taunted = null;
int rand = (int) (Math.random()*Main.plugin.board.sizeHider()); int rand = (int) (Math.random()*Main.plugin.board.sizeHider());
for(Player player : Main.plugin.board.getPlayers()) { for(Player player : Main.plugin.board.getPlayers()) {
@ -65,37 +57,45 @@ public class Taunt {
} }
} }
if(taunted != null) { if(taunted != null) {
running = true;
taunted.sendMessage(message("TAUNTED").toString()); taunted.sendMessage(message("TAUNTED").toString());
Util.broadcastMessage(tauntPrefix + message("TAUNT")); Util.broadcastMessage(tauntPrefix + message("TAUNT"));
tauntPlayer = taunted.getName(); tauntPlayer = taunted.getName();
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, new Runnable() { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> {
public void run() { if(temp != Main.plugin.gameId) return;
if(temp != Main.plugin.gameId) return; Player taunted1 = Main.plugin.board.getPlayer(tauntPlayer);
Player taunted = Main.plugin.board.getPlayer(tauntPlayer); if(taunted1 != null) {
if(taunted != null) { Firework fw = (Firework) taunted1.getLocation().getWorld().spawnEntity(taunted1.getLocation(), EntityType.FIREWORK);
Firework fw = (Firework) taunted.getLocation().getWorld().spawnEntity(taunted.getLocation(), EntityType.FIREWORK); FireworkMeta fwm = fw.getFireworkMeta();
FireworkMeta fwm = fw.getFireworkMeta(); fwm.setPower(4);
fwm.setPower(4); fwm.addEffect(FireworkEffect.builder()
fwm.addEffect(FireworkEffect.builder() .withColor(Color.BLUE)
.withColor(Color.BLUE) .withColor(Color.RED)
.withColor(Color.RED) .withColor(Color.YELLOW)
.withColor(Color.YELLOW) .with(FireworkEffect.Type.STAR)
.with(FireworkEffect.Type.STAR) .with(FireworkEffect.Type.BALL)
.with(FireworkEffect.Type.BALL) .with(FireworkEffect.Type.BALL_LARGE)
.with(FireworkEffect.Type.BALL_LARGE) .flicker(true)
.flicker(true) .withTrail()
.withTrail() .build());
.build()); fw.setFireworkMeta(fwm);
fw.setFireworkMeta(fwm); Util.broadcastMessage(tauntPrefix + message("TAUNT_ACTIVATE"));
Util.broadcastMessage(tauntPrefix + message("TAUNT_ACTIVATE"));
}
tauntPlayer = "";
waitTaunt();
} }
tauntPlayer = "";
running = false;
schedule();
},20*30); },20*30);
} else { } else {
waitTaunt(); schedule();
} }
} }
public int getDelay(){
return delay;
}
public boolean isRunning() {
return running;
}
} }

View file

@ -13,32 +13,38 @@ import net.tylermurphy.hideAndSeek.util.Util;
public class Worldborder { public class Worldborder {
private final int temp; private final int temp;
private int delay;
private boolean running;
public Worldborder(int temp) { public Worldborder(int temp) {
this.temp = temp; this.temp = temp;
} }
public void schedule() { public void schedule() {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, new Runnable() { delay = 60*worldborderDelay;
public void run() { running = false;
decreaceWorldborder(); waitBorder();
}
private void waitBorder(){
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> {
if(delay == 0) decreaceWorldborder();
else {
delay--; waitBorder();
} }
},20*60*worldborderDelay); }, 20);
} }
private void decreaceWorldborder() { private void decreaceWorldborder() {
if(temp != Main.plugin.gameId) return; if(temp != Main.plugin.gameId) return;
if(currentWorldborderSize-100 > 100) { if(currentWorldborderSize-100 > 100) {
running = true;
Util.broadcastMessage(worldborderPrefix + message("WORLDBORDER_DECREASING")); Util.broadcastMessage(worldborderPrefix + message("WORLDBORDER_DECREASING"));
currentWorldborderSize -= 100; currentWorldborderSize -= 100;
World world = Bukkit.getWorld("hideandseek_"+spawnWorld); World world = Bukkit.getWorld("hideandseek_"+spawnWorld);
WorldBorder border = world.getWorldBorder(); WorldBorder border = world.getWorldBorder();
border.setSize(border.getSize()-100,30); border.setSize(border.getSize()-100,30);
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.plugin, new Runnable() { schedule();
public void run() {
decreaceWorldborder();
}
},20*60*worldborderDelay);
} }
} }
@ -56,5 +62,13 @@ public class Worldborder {
border.setCenter(0, 0); border.setCenter(0, 0);
} }
} }
public int getDelay(){
return delay;
}
public boolean isRunning() {
return running;
}
} }

View file

@ -26,7 +26,8 @@ public class Board {
private List<String> Hider, Seeker, Spectator; private List<String> Hider, Seeker, Spectator;
private Map<String, Player> playerList = new HashMap<String,Player>(); private Map<String, Player> playerList = new HashMap<String,Player>();
private Map<String, CustomBoard> customBoards = new HashMap<String, CustomBoard>();
public boolean isPlayer(Player player) { public boolean isPlayer(Player player) {
return playerList.containsKey(player.getName()); return playerList.containsKey(player.getName());
} }
@ -145,64 +146,91 @@ public class Board {
seekerTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.NEVER); seekerTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.NEVER);
} }
} }
private void createLobbyBoard(Player player) { public void createLobbyBoard(Player player) {
createLobbyBoard(player, true);
Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard();
Objective obj = board.registerNewObjective("LobbyScoreboard", "dummy",
ChatColor.translateAlternateColorCodes('&', "&l&eHIDE AND SEEK"));
createTeamsForBoard(board);
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
Score waiting = obj.getScore("Waiting to start...");
waiting.setScore(6);
Score blank1 = obj.getScore(ChatColor.RESET.toString());
blank1.setScore(5);
Score players = obj.getScore("Players: "+playerList.values().size());
players.setScore(4);
Score blank2 = obj.getScore(ChatColor.RESET.toString() + ChatColor.RESET.toString());
blank2.setScore(3);
Score seeker = obj.getScore(ChatColor.BOLD + "" + ChatColor.RED + "SEEKER%" + ChatColor.WHITE + getSeekerPercent());
seeker.setScore(2);
Score hider = obj.getScore(ChatColor.BOLD + "" + ChatColor.GOLD + "HIDER%" + ChatColor.WHITE + getHiderPercent());
hider.setScore(1);
player.setScoreboard(board);
} }
private void createGameBoard(Player player) { private void createLobbyBoard(Player player, boolean recreate) {
Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard(); CustomBoard board = customBoards.get(player.getName());
Objective obj = board.registerNewObjective("GameScoreboard", "dummy", if(recreate) {
ChatColor.translateAlternateColorCodes('&', "&l&eHIDE AND SEEK")); board = new CustomBoard(player, "&l&eHIDE AND SEEK");
createTeamsForBoard(board); board.updateTeams();
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
Score team = obj.getScore("Team: " + getTeam(player));
team.setScore(6);
Score blank1 = obj.getScore(ChatColor.RESET.toString());
blank1.setScore(5);
if(gameLength > 0) {
Score waiting = obj.getScore(ChatColor.GREEN + "Time Left: " + ChatColor.WHITE + Main.plugin.timeLeft/60 + "m" + Main.plugin.timeLeft%60 + "s");
waiting.setScore(4);
Score blank2 = obj.getScore(ChatColor.RESET.toString() + ChatColor.RESET.toString());
blank2.setScore(3);
} }
Score seeker = obj.getScore(ChatColor.BOLD + "" + ChatColor.RED + "SEEKERS:" + ChatColor.WHITE + " " + Seeker.size()); board.setLine("hiders", ChatColor.BOLD + "" + ChatColor.YELLOW + "HIDER%" + ChatColor.WHITE + getHiderPercent());
seeker.setScore(2); board.setLine("seekers", ChatColor.BOLD + "" + ChatColor.RED + "SEEKER%" + ChatColor.WHITE + getSeekerPercent());
Score hider = obj.getScore(ChatColor.BOLD + "" + ChatColor.GOLD + "HIDERS:" + ChatColor.WHITE + " " + Hider.size()); board.addBlank();
hider.setScore(1); board.setLine("players", "Players: " + playerList.values().size());
player.setScoreboard(board); board.addBlank();
board.setLine("waiting", "Waiting to start...");
board.display();
customBoards.put(player.getName(), board);
}
public void createGameBoard(Player player){
createGameBoard(player, true);
}
private void createGameBoard(Player player, boolean recreate){
CustomBoard board = customBoards.get(player.getName());
if(recreate) {
board = new CustomBoard(player, "&l&eHIDE AND SEEK");
}
board.setLine("hiders", ChatColor.BOLD + "" + ChatColor.YELLOW + "HIDERS:" + ChatColor.WHITE + " " + Hider.size());
board.setLine("seekers", ChatColor.BOLD + "" + ChatColor.RED + "SEEKERS:" + ChatColor.WHITE + " " + Seeker.size());
board.addBlank();
if(glowEnabled){
if(Main.plugin.glow == null || Main.plugin.status.equals("Starting") || !Main.plugin.glow.isRunning())
board.setLine("glow", "Glow: " + ChatColor.RED + "Inactive");
else
board.setLine("glow", "Glow: " + ChatColor.GREEN + "Active");
}
if(tauntEnabled && tauntCountdown){
if(Main.plugin.taunt == null || Main.plugin.status.equals("Starting"))
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + "0m0s");
else if(!tauntLast && Hider.size() == 1){
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + "Expired");
} else if(!Main.plugin.taunt.isRunning())
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + Main.plugin.taunt.getDelay()/60 + "m" + Main.plugin.taunt.getDelay()%60 + "s");
else
board.setLine("taunt", "Taunt: " + ChatColor.YELLOW + "Active");
}
if(worldborderEnabled){
if(Main.plugin.worldborder == null || Main.plugin.status.equals("Starting")){
board.setLine("board", "WorldBorder: " + ChatColor.YELLOW + "0m0s");
} else if(!Main.plugin.worldborder.isRunning()) {
board.setLine("board", "WorldBorder: " + ChatColor.YELLOW + Main.plugin.worldborder.getDelay()/60 + "m" + Main.plugin.worldborder.getDelay()%60 + "s");
} else {
board.setLine("board", "WorldBorder: " + ChatColor.YELLOW + "Decreasing");
}
}
if(glowEnabled || (tauntEnabled && tauntCountdown) || worldborderEnabled)
board.addBlank();
board.setLine("time", "Time Left: " + ChatColor.GREEN + Main.plugin.timeLeft/60 + "m" + Main.plugin.timeLeft%60 + "s");
board.addBlank();
board.setLine("team", "Team: " + getTeam(player));
board.display();
customBoards.put(player.getName(), board);
} }
public void removeBoard(Player player) { public void removeBoard(Player player) {
player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
customBoards.remove(player.getName());
} }
public void reloadLobbyBoards() { public void reloadLobbyBoards() {
for(Player player : playerList.values()) for(Player player : playerList.values())
createLobbyBoard(player); createLobbyBoard(player, false);
} }
public void reloadGameBoards() { public void reloadGameBoards() {
for(Player player : playerList.values()) for(Player player : playerList.values())
createGameBoard(player); createGameBoard(player, false);
}
public void reloadBoardTeams() {
for(CustomBoard board : customBoards.values())
board.updateTeams();
} }
private String getSeekerPercent() { private String getSeekerPercent() {

View file

@ -0,0 +1,121 @@
package net.tylermurphy.hideAndSeek.util;
import net.tylermurphy.hideAndSeek.Main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.*;
import java.util.HashMap;
import java.util.Map;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class CustomBoard {
private final Scoreboard board;
private final Objective obj;
private final Player player;
private final Map<String,Line> LINES;
private int blanks;
private boolean displayed;
public CustomBoard(Player player, String title){
this.board = Bukkit.getScoreboardManager().getNewScoreboard();
this.LINES = new HashMap<String,Line>();
this.player = player;
this.obj = board.registerNewObjective(
"Scoreboard", "dummy", ChatColor.translateAlternateColorCodes('&', title));
this.blanks = 0;
this.displayed = false;
this.updateTeams();
}
public void updateTeams() {
try{ board.registerNewTeam("Hider"); } catch (Exception e){}
try{ board.registerNewTeam("Seeker"); } catch (Exception e){}
Team hiderTeam = board.getTeam("Hider");
for(String entry : hiderTeam.getEntries())
hiderTeam.removeEntry(entry);
for(Player player : Main.plugin.board.getHiders())
hiderTeam.addEntry(player.getName());
Team seekerTeam = board.getTeam("Seeker");
for(String entry : seekerTeam.getEntries())
seekerTeam.removeEntry(entry);
for(Player player : Main.plugin.board.getSeekers())
seekerTeam.addEntry(player.getName());
if(nametagsVisible) {
hiderTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OWN_TEAM);
seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OTHER_TEAMS);
} else {
hiderTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER);
seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER);
}
hiderTeam.setColor(ChatColor.GOLD);
seekerTeam.setColor(ChatColor.RED);
}
public void setLine(String key, String message){
Line line = LINES.get(key);
if(line == null)
addLine(key, message);
else
updateLine(key, message);
}
private void addLine(String key, String message){
Score score = obj.getScore(message);
score.setScore(LINES.values().size()+1);
Line line = new Line(LINES.values().size()+1, message);
LINES.put(key, line);
}
public void addBlank(){
if(displayed) return;
String temp = "";
for(int i = 0; i <= blanks; i ++)
temp += ChatColor.RESET;
blanks++;
addLine("blank"+blanks, temp);
}
private void updateLine(String key, String message){
Line line = LINES.get(key);
board.resetScores(line.getMessage());
line.setMessage(message);
Score newScore = obj.getScore(message);
newScore.setScore(line.getScore());
}
public void display() {
displayed = true;
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
player.setScoreboard(board);
}
}
class Line {
private int score;
private String message;
public Line(int score, String message){
this.score = score;
this.message = message;
}
public int getScore() {
return score;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

View file

@ -2,13 +2,27 @@ package net.tylermurphy.hideAndSeek.util;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import java.io.File; import java.io.*;
import java.util.ArrayList;
import java.util.List;
import net.md_5.bungee.api.ChatColor;
import net.tylermurphy.hideAndSeek.configuration.Items;
import net.tylermurphy.hideAndSeek.configuration.LocalizationString;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.WorldCreator; import org.bukkit.Material;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
public class Util { public class Util {
@ -24,27 +38,10 @@ public class Util {
if(exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) return false; if(exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) return false;
File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld); File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld);
if(!destenation.exists()) return false; if(!destenation.exists()) return false;
if(saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0) return false;
return true; return true;
} }
public static void unloadMap(String mapname){
if(Bukkit.getServer().unloadWorld(Bukkit.getServer().getWorld(mapname), false)){
Main.plugin.getLogger().info("Successfully unloaded " + mapname);
}else{
Main.plugin.getLogger().severe("COULD NOT UNLOAD " + mapname);
}
}
public static void loadMap(String mapname){
Bukkit.getServer().createWorld(new WorldCreator(mapname));
Bukkit.getServer().getWorld("hideandseek_"+spawnWorld).setAutoSave(false);
}
public static void rollback(String mapname){
unloadMap(mapname);
loadMap(mapname);
}
public static void sendDelayedMessage(String message, int gameId, int delay) { public static void sendDelayedMessage(String message, int gameId, int delay) {
Bukkit.getScheduler().runTaskLaterAsynchronously(Main.plugin, new Runnable() { Bukkit.getScheduler().runTaskLaterAsynchronously(Main.plugin, new Runnable() {
public void run() { public void run() {
@ -53,5 +50,36 @@ public class Util {
} }
}, delay); }, delay);
} }
public static void resetPlayer(Player player) {
player.getInventory().clear();
for (PotionEffect effect : player.getActivePotionEffects()) {
player.removePotionEffect(effect.getType());
}
if (Main.plugin.board.isSeeker(player)) {
if(pvpEnabled)
for(ItemStack item : Items.SEEKER_ITEMS)
player.getInventory().addItem(item);
for(PotionEffect effect : Items.SEEKER_EFFECTS)
player.addPotionEffect(effect);
} else if (Main.plugin.board.isHider(player)) {
if(pvpEnabled)
for(ItemStack item : Items.HIDER_ITEMS)
player.getInventory().addItem(item);
for(PotionEffect effect : Items.HIDER_EFFECTS)
player.addPotionEffect(effect);
if(glowEnabled) {
ItemStack snowball = new ItemStack(Material.SNOWBALL, 1);
ItemMeta snowballMeta = snowball.getItemMeta();
snowballMeta.setDisplayName("Glow Powerup");
List<String> snowballLore = new ArrayList<String>();
snowballLore.add("Throw to make all seekers glow");
snowballLore.add("Last 30s, all hiders can see it");
snowballLore.add("Time stacks on multi use");
snowballMeta.setLore(snowballLore);
snowball.setItemMeta(snowballMeta);
player.getInventory().addItem(snowball);
}
}
}
} }

View file

@ -0,0 +1,57 @@
package net.tylermurphy.hideAndSeek.world;
import java.util.Collections;
import java.util.List;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
public class VoidGenerator extends ChunkGenerator{
@Override
public List<BlockPopulator> getDefaultPopulators(World world) {
return Collections.<BlockPopulator>emptyList();
}
@Override
public boolean shouldGenerateNoise() {
return false;
}
@Override
public boolean shouldGenerateSurface() {
return false;
}
@Override
public boolean shouldGenerateBedrock() {
return false;
}
@Override
public boolean shouldGenerateCaves() {
return false;
}
@Override
public boolean shouldGenerateDecorations() {
return false;
}
@Override
public boolean shouldGenerateMobs() {
return false;
}
@Override
public boolean shouldGenerateStructures() {
return false;
}
@Override
public boolean canSpawn(World world, int x, int z) {
return true;
}
}

View file

@ -0,0 +1,129 @@
package net.tylermurphy.hideAndSeek.world;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Localization.message;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.bukkit.Bukkit;
import org.bukkit.WorldCreator;
import net.tylermurphy.hideAndSeek.Main;
public class WorldLoader {
String mapname;
String savename;
public WorldLoader(String mapname) {
this.mapname = mapname;
this.savename = "hideandseek_"+mapname;
}
public void unloadMap(){
if(Bukkit.getServer().unloadWorld(Bukkit.getServer().getWorld(savename), false)){
Main.plugin.getLogger().info("Successfully unloaded " + savename);
}else{
Main.plugin.getLogger().severe("COULD NOT UNLOAD " + savename);
}
}
public void loadMap(){
Bukkit.getServer().createWorld(new WorldCreator(savename).generator(new VoidGenerator()));
Bukkit.getServer().getWorld(savename).setAutoSave(false);
}
public void rollback(){
unloadMap();
loadMap();
}
public String save() {
File current = new File(Main.root+File.separator+mapname);
if(current.exists()) {
try {
File destenation = new File(Main.root+File.separator+savename);
File temp_destenation = new File(Main.root+File.separator+"temp_"+savename);
copyFileFolder("region",true);
copyFileFolder("entities",true);
copyFileFolder("datapacks",false);
File srcFile = new File(current, "level.dat");
File destFile = new File(temp_destenation, "level.dat");
copyFile(srcFile,destFile);
if(destenation.exists()) {
deleteDirectory(destenation);
destenation.mkdir();
}
temp_destenation.renameTo(destenation);
} catch(IOException e) {
e.printStackTrace();
return errorPrefix + message("COMMAND_ERROR");
}
return messagePrefix + message("MAPSAVE_END");
} else {
return errorPrefix + message("MAPSAVE_ERROR");
}
}
private void copyFileFolder(String name, Boolean isMca) throws IOException {
File region = new File(Main.root+File.separator+mapname+File.separator+name);
File temp = new File(Main.root+File.separator+"temp_"+savename+File.separator+name);
if(region.exists() && region.isDirectory()) {
if(!temp.exists())
if(!temp.mkdirs())
throw new IOException("Couldn't create region directory!");
String files[] = region.list();
for (String file : files) {
if(isMca) {
int minX = (int)Math.floor(saveMinX / 32.0);
int minZ = (int)Math.floor(saveMinZ / 32.0);
int maxX = (int)Math.floor(saveMaxX / 32.0);
int maxZ = (int)Math.floor(saveMaxZ / 32.0);
String[] parts = file.split(".");
if(parts.length > 1) {
Main.plugin.getLogger().info(file);
if( Integer.parseInt(parts[1]) < minX || Integer.parseInt(parts[1]) > maxX ||Integer.parseInt(parts[2]) < minZ || Integer.parseInt(parts[2]) > maxZ )
continue;
}
}
File srcFile = new File(region, file);
if(srcFile.isDirectory()) {
copyFileFolder(name+File.separator+file, false);
} else {
File destFile = new File(temp, file);
copyFile(srcFile, destFile);
}
}
}
}
private void copyFile(File source, File target) throws IOException {
InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(target);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0)
out.write(buffer, 0, length);
in.close();
out.close();
}
private boolean deleteDirectory(File directoryToBeDeleted) {
File[] allContents = directoryToBeDeleted.listFiles();
if (allContents != null) {
for (File file : allContents) {
deleteDirectory(file);
}
}
return directoryToBeDeleted.delete();
}
}

View file

@ -10,14 +10,98 @@ announceMessagesToNonPlayers: true
# default: false # default: false
nametagsVisible: false nametagsVisible: false
# Require bukkit permessions though a plugin to run commands, recomended on large servers # Require bukkit permissions though a plugin to run commands, recommended on large servers
# default: true # default: true
permissionsRequired: true permissionsRequired: true
# Minimum ammount of players to start the game. Cannot go lower than 2. # Minimum amount of players to start the game. Cannot go lower than 2.
# default: 2 # default: 2
minPlayers: 2 minPlayers: 2
# This plugin by default functions as not tag to catch Hiders, but to pvp. All players are given weapons,
# and seekers slightly better weapons (this can be changed in items.yml). If you want, you can disable this
# entire pvp functionality, and make Hiders get found on a single hit. Hiders would also not be able to fight
# back against Seekers if disabled.
# default: true
pvp: true
# Players that join the server will automatically be placed into the lobby.
# default: false
autoJoin: false
# (When autoJoin is false), when players join the world containing the lobby, they are automatically teleported
# to the designated exit position so that they possibly don't spawn in the lobby while not in the queue. Anyone
# who ever joins in the game world (the duplicated world where the game is played) will always be teleported
# out regardless.
# default: false
teleportToExit: false
countdown:
# The worldborder closes every interval, which is evey [delay] in minutes.
# Thw worldborder 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.
worldBorder:
x: 0
z: 0
delay: 10
size: 500
warn: true
enabled: false
# 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
# to publicly show the taunt countdown, and have the taunt run with only
# one Hider left. Taunt delay must at least be 60s.
taunt:
delay: 360
whenLastPerson: false
showCountdown: true
enabled: true
# The glow powerup allows all Hiders to see where every Seeker is. It last for
# the amount of time set in seconds. You can allow it to be stackable, meaning
# when multiple Hiders use the powerup at the same time, it stacks the times, or
# just overwrites. Only Hiders can see that the Seekers are glowing. Delay must
# be longer than 1s.
glow:
time: 30
stackable: true
enabled: true
# The message prefixes displayed before messages. The message contents themselves
# can be changed in localization.yml.
prefix:
default: '&9Hide and Seek > &f'
error: '&cError > &f'
taunt: '&eTaunt > &f'
border: '&cWorld Border > &f'
abort: '&cAbort > &f'
gameover: '&aGame Over > &f'
warning: '&cWarning > &f'
# Changes the default plugin language. Currently, Supported localizations are:
# en-US (United States)
# de-DE (German)
local: "en-US"
# ---------------------------------------------------------- #
# ONLY EDIT BEYOND THIS POINT IF YOU KNOW WHAT YOU ARE DOING #
# ---------------------------------------------------------- #
# The 2 coordinate bounds that will contain your hideAndSeek map. Its recommended
# that you use /hs setbounds for this, and not edit this directly, as breaking
# this section will completely break the entire plugin when you run /hs mapsave.
bounds:
min:
x: 0
z: 0
max:
x: 0
z: 0
# Spawn locations where players are teleported # Spawn locations where players are teleported
spawns: spawns:
# Location where players are teleported into the game (/hs start) # Location where players are teleported into the game (/hs start)
@ -37,25 +121,4 @@ spawns:
x: 0 x: 0
y: 0 y: 0
z: 0 z: 0
world: world world: world
# The worldborder closes every interval, whish is evey [delay] in minutes.
# Thw worldborder stharts at [size], and decreaces 100 blocks every interval.
# x & z are the center location. [enabled] is whenever the border is enabled.
worldBorder:
x: 0
z: 0
delay: 10
size: 500
enabled: false
# The message prefixes displayed before messages. The message contents themselvs
# can be changed in localization.yml.
prefix:
default: '&9Hide and Seek > &f'
error: '&cError > &f'
taunt: '&eTaunt > &f'
border: '&cWorld Border > &f'
abort: '&cAbort > &f'
gameover: '&aGame Over > &f'
warning: '&cWarning > &f'

View file

@ -0,0 +1,87 @@
# For materials, look at https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html
# For potion types, look at https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionType.html
# For effects, look at https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionEffectType.html
# If pvp is disabled in config.yml, only effects will be given to players.
items:
seeker:
'1':
material: DIAMOND_SWORD
amount: 1
enchantments:
sharpness: 1
name: 'Seeker Sword'
unbreakable: true
lore:
- 'This is the seeker sword'
'2':
material: STICK
amount: 1
enchantments:
knockback: 3
name: 'Wacky Stick'
lore:
- 'It will launch people very far'
- 'Use wisely!'
hider:
'1':
material: STONE_SWORD
amount: 1
enchantments:
sharpness: 2
name: 'Hider Sword'
unbreakable: true
lore:
- 'This is the hider sword'
'2':
material: SPLASH_POTION
amount: 1
type: REGEN
'3':
material: POTION
amount: 2
type: INSTANT_HEAL
effects:
seeker:
'1':
type: SPEED
duration: 1000000
amplifier: 2
ambient: false
particles: false
'2':
type: JUMP
duration: 1000000
amplifier: 1
ambient: false
particles: false
'3':
type: SLOW_FALLING
duration: 1000000
amplifier: 1
ambient: false
particles: false
'4':
type: WATER_BREATHING
duration: 1000000
amplifier: 10
ambient: false
particles: false
'5':
type: DOLPHINS_GRACE
duration: 1000000
amplifier: 1
ambient: false
particles: false
hider:
'1':
type: WATER_BREATHING
duration: 1000000
amplifier: 1
ambient: false
particles: false
'2':
type: DOLPHINS_GRACE
duration: 1000000
amplifier: 1
ambient: false
particles: false

View file

@ -0,0 +1,60 @@
#============================================================#
# +--------------------------------------------------------+ #
# | Kenshins Hide and Seek | #
# | German language file | #
# | by HerrMelodious | #
# +--------------------------------------------------------+ #
#============================================================#
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."
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."
GAME_GAMEOVER_HIDERS_FOUND: "Alle Hider wurden gefunden."
GAME_GAMEOVER_SEEKERS_QUIT: "All Seeker 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_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."
GAME_NOT_INPROGRESS: "Es läuft kein Spiel."
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."
CONFIG_RELOAD: "Konfiguration neu geladen."
MAPSAVE_INPROGRESS: "Weltkarte wird aktuell gespeichert. Versuche es später nochmal."
MAPSAVE_START: "Starte Speichervorgang der Weltkarte"
MAPSAVE_WARNING: "All commands will be disabled whenthe save is in progress. Do not turn off the server."
MAPSAVE_END: "Speichervorgang abgeschlossen."
MAPSAVE_ERROR: "Aktuelle Weltkarte konnte nicht gefunden werden."
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."
WORLDBORDER_POSITION: "Spawn muss mindestens 100 Blöcke vom Zentrum der World Border entfernt sein."
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!"
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."
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_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_COMPLETE: "Alles eingerichtet! Hide and Seek ist spielbereit."
GAME_SPAWN: "Teleport-Position für Spielbeginn festgelegt"
LOBBY_SPAWN: "Teleport-Position für Lobby festgelegt"
EXIT_SPAWN: "Teleport-Position für Spielende festgelegt"
START_MIN_PLAYERS: "Um das Spiel zu starten benötigst du mindestens {AMOUNT} Spieler."
START_INVALID_NAME: "Ungültiger Spieler: {PLAYER}."
START_COUNTDOWN: "Die Hider haben {AMOUNT} Sekunden Zeit sich zu verstecken!"
START: "Los, Seeker! Es ist Zeit, die Hider zu finden."
STOP: "Das Spiel wurde gestoppt."
HIDERS_SUBTITLE: "Verstecke dich gut vor den Seekern!"
SEEKERS_SUBTITLE: "Finde alle Hider!"
type: "de-DE"

View file

@ -0,0 +1,64 @@
#============================================================#
# +--------------------------------------------------------+ #
# | Kenshins Hide and Seek | #
# | English language file | #
# | by KenshinEto | #
# +--------------------------------------------------------+ #
#============================================================#
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."
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."
GAME_GAMEOVER_HIDERS_FOUND: "All hiders have been found."
GAME_GAMEOVER_SEEKERS_QUIT: "All seekers 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_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."
GAME_NOT_INPROGRESS: "There is no game in progress."
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."
CONFIG_RELOAD: "Reloaded the config."
MAPSAVE_INPROGRESS: "Map save is currently in progress. Try again later."
MAPSAVE_START: "Starting map save."
MAPSAVE_WARNING: "All commands will be disabled when the save is in progress. Do not turn off the server."
MAPSAVE_END: "Map save complete."
MAPSAVE_ERROR: "Couldn't find current map."
WORLDBORDER_DISABLE: "Disabled world border."
WORLDBORDER_INVALID_INPUT: "Invalid integer {AMOUNT}."
WORLDBORDER_MIN_SIZE: "World border cannot be smaller than 100 blocks."
WORLDBORDER_POSITION: "Spawn position must be 100 from world border center."
WORLDBORDER_ENABLE: "Set border center to current location, size to {AMOUNT}, and delay to {AMOUNT}."
WORLDBORDER_DECREASING: "World border decreasing by 100 blocks over the next 30s."
TAUNTED: "$c$oOh no! You have been chosen to be taunted."
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"
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_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_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"
EXIT_SPAWN: "Set exit position to current location"
START_MIN_PLAYERS: "You must have at least {AMOUNT} players to start."
START_INVALID_NAME: "Invalid player: {PLAYER}."
START_COUNTDOWN: "Hiders have {AMOUNT} seconds to hide!"
START: "Attention SEEKERS, its time to fin the hiders!"
STOP: "Game has been force stopped."
HIDERS_SUBTITLE: "Hide away from the seekers"
SEEKERS_SUBTITLE: "Eliminate all hiders"
BOUNDS_WRONG_WORLD: "Please run this command in the game world."
BOUNDS: "Successfully set bounds at this position ({AMOUNT}/2)."
NOT_AT_ZERO: "Please do not set at a location containing a coordinate at 0."
type: "en-US"

View file

@ -1,7 +1,7 @@
Localization: Localization:
COMMAND_PLAYER_ONLY: "This command can only be run as a player." COMMAND_PLAYER_ONLY: "This command can only be run as a player."
COMMAND_NOT_ALLOWED: "You are not allowed to run this command." COMMAND_NOT_ALLOWED: "You are not allowed to run this command."
COMMAND_ERROR: "An internal error has occoured." COMMAND_ERROR: "An internal error has occurred."
GAME_PLAYER_DEATH: "&c{PLAYER}&f was killed." GAME_PLAYER_DEATH: "&c{PLAYER}&f was killed."
GAME_PLAYER_FOUND: "&e{PLAYER}&f was found and became a seeker." GAME_PLAYER_FOUND: "&e{PLAYER}&f was found and became a seeker."
GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f was found by &c{PLAYER}&f and became a seeker." GAME_PLAYER_FOUND_BY: "&e{PLAYER}&f was found by &c{PLAYER}&f and became a seeker."
@ -11,32 +11,33 @@ Localization:
GAME_SETUP: "Game is not setup. Run /hs setup to see what you need to do." GAME_SETUP: "Game is not setup. Run /hs setup to see what you need to do."
GAME_INGAME: "You are already in the lobby/game." GAME_INGAME: "You are already in the lobby/game."
GAME_NOT_INGAME: "You are not in a lobby/game." GAME_NOT_INGAME: "You are not in a lobby/game."
GAME_INPROGRESS: "There is currently a game inprogress." GAME_INPROGRESS: "There is currently a game in progress."
GAME_NOT_INPROGRESS: "There is no game inprogress." GAME_NOT_INPROGRESS: "There is no game in progress."
GAME_JOIN: "{PLAYER} has joined the HideAndSeek lobby." GAME_JOIN: "{PLAYER} has joined the HideAndSeek lobby."
GAME_JOIN_SPECTATOR: "You have joined midgame and are now a spectator." GAME_JOIN_SPECTATOR: "You have joined mid game and are now a spectator."
GAME_LEAVE: "{PLAYER} has left the HideAndSeek lobby." GAME_LEAVE: "{PLAYER} has left the HideAndSeek lobby."
CONFIG_RELOAD: "Reloaded the config." CONFIG_RELOAD: "Reloaded the config."
MAPSAVE_INPROGRESS: "Map save is currently in progress. Try again later." MAPSAVE_INPROGRESS: "Map save is currently in progress. Try again later."
MAPSAVE_START: "Starting map save." MAPSAVE_START: "Starting map save."
MAPSAVE_WARNING: "All commands will be disabled whenthe save is in progress. Do not turn off the server." MAPSAVE_WARNING: "All commands will be disabled when the save is in progress. Do not turn off the server."
MAPSAVE_END: "Map save complete." MAPSAVE_END: "Map save complete."
MAPSAVE_ERROR: "Coudnt find current map." MAPSAVE_ERROR: "Couldn't find current map."
WORLDBORDER_DISABLE: "Disabled worldborder." WORLDBORDER_DISABLE: "Disabled world border."
WORLDBORDER_INVALID_INPUT: "Invalid integer {AMOUNT}." WORLDBORDER_INVALID_INPUT: "Invalid integer {AMOUNT}."
WORLDBORDER_MIN_SIZE: "Worldborder cannot be smaller than 100 blocks." WORLDBORDER_MIN_SIZE: "World border cannot be smaller than 100 blocks."
WORLDBORDER_POSITION: "Spawn position must be 100 from worldborder center." WORLDBORDER_POSITION: "Spawn position must be 100 from world border center."
WORLDBORDER_ENABLE: "Set border center to current location, size to {AMOUNT}, and delay to {AMOUNT}." WORLDBORDER_ENABLE: "Set border center to current location, size to {AMOUNT}, and delay to {AMOUNT}."
WORLDBORDER_DECREASING: "Worlderborder decreasing by 100 blocks over the next 30s." WORLDBORDER_DECREASING: "World border decreasing by 100 blocks over the next 30s."
TAUNTED: "$c$oOh no! You have been chosen to be taunted." TAUNTED: "$c$oOh no! You have been chosen to be taunted."
TAUNT: "A random hider will be taunted in the next 30s." TAUNT: "A random hider will be taunted in the next 30s."
TAUNT_ACTIVATE: "Taunt has been activated." TAUNT_ACTIVATE: "Taunt has been activated."
ERROR_GAME_SPAWN: "Please set game spawn location first" ERROR_GAME_SPAWN: "Please set game spawn location first"
SETUP: "&f&lThe following is needed for setup..." SETUP: "&f&lThe following is needed for setup..."
SETUP_GAME: "&c&l- &fGame spawn isnt set, /hs setspawn" SETUP_GAME: "&c&l- &fGame spawn isn't set, /hs setspawn"
SETUP_LOBBY: "&c&l- &fLobby spawn isnt set, /hs setlobby" SETUP_LOBBY: "&c&l- &fLobby spawn isn't set, /hs setlobby"
SETUP_EXIT: "&c&l- &fQuit/exit teleport location isnt set, /hs setexit" SETUP_EXIT: "&c&l- &fQuit/exit teleport location isn't set, /hs setexit"
SETUP_SAVEMAP: "&c&l- &fHide and seek map isnt saved, /hs savemap (after /hs setspawn)" 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_COMPLETE: "Everything is setup and ready to go!" SETUP_COMPLETE: "Everything is setup and ready to go!"
GAME_SPAWN: "Set game spawn position to current location" GAME_SPAWN: "Set game spawn position to current location"
LOBBY_SPAWN: "Set lobby position to current location" LOBBY_SPAWN: "Set lobby position to current location"
@ -44,7 +45,14 @@ Localization:
START_MIN_PLAYERS: "You must have at least {AMOUNT} players to start." START_MIN_PLAYERS: "You must have at least {AMOUNT} players to start."
START_INVALID_NAME: "Invalid player: {PLAYER}." START_INVALID_NAME: "Invalid player: {PLAYER}."
START_COUNTDOWN: "Hiders have {AMOUNT} seconds to hide!" START_COUNTDOWN: "Hiders have {AMOUNT} seconds to hide!"
START: "Attetion SEEKERS, its time to fin the hiders!" START: "Attention SEEKERS, its time to fin the hiders!"
STOP: "Game has been force stopped" STOP: "Game has been force stopped."
HIDERS_SUBTITLE: "Hide away from the seekers" HIDERS_SUBTITLE: "Hide away from the seekers"
SEEKERS_SUBTITLE: "Eliminate all hiders" SEEKERS_SUBTITLE: "Eliminate all hiders"
BOUNDS_WRONG_WORLD: "Please run this command in the game world."
BOUNDS: "Successfully set bounds at this position ({AMOUNT}/2)."
NOT_AT_ZERO: "Please do not set at a location containing a coordinate at 0."
# DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE
version: 2
type: "en-US"

View file

@ -1,6 +1,6 @@
name: HideAndSeek name: HideAndSeek
main: net.tylermurphy.hideAndSeek.Main main: net.tylermurphy.hideAndSeek.Main
version: 1.3.0 version: 1.3.1
author: KenshinEto author: KenshinEto
load: STARTUP load: STARTUP
api-version: 1.17 api-version: 1.17
@ -21,6 +21,7 @@ permissions:
hideandseek.setspawn: true hideandseek.setspawn: true
hideandseek.setlobby: true hideandseek.setlobby: true
hideandseek.setexit: true hideandseek.setexit: true
hideadnseek.setbounds: true
hideandseek.setup: true hideandseek.setup: true
hideandseek.start: true hideandseek.start: true
hideandseek.stop: true hideandseek.stop: true
@ -48,6 +49,9 @@ permissions:
hideandseek.setexit: hideandseek.setexit:
description: Allows you to set the game exit point description: Allows you to set the game exit point
default: op default: op
hideandseek.setbounds:
description: Allows you to set bounds for the game map
default: op
hideandseek.setup: hideandseek.setup:
description: Allows you to see what needs to be setup for the plugin to function description: Allows you to see what needs to be setup for the plugin to function
default: op default: op