From 590ab6c0e8755f5e5fe9293bd5c7ac93bdd02b30 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Wed, 4 May 2022 12:22:23 -0400 Subject: leaveOnEnd added to config file --- src/main/resources/config.yml | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/main/resources/config.yml') diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c163c2d..9a82052 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -44,6 +44,13 @@ autoJoin: false # default: false teleportToExit: false +# Normally when the game ends, players are set back to the lobby to play another game. +# You can disable this, and empty the lobby after the game finishes. This is like everyone +# running /hs leave at the end of the game. Players will leave either to the exit position +# or another server depending what you have `leaveType` set too. +# default: false +leaveOnEnd: false + # What do you want to happen when a player leaves the lobby. If you are running a single server, maybe you want to send # them to the world hub. But if you are running a bungee-cord or velocity server, maybe you want to send them to the servers # hub. -- cgit v1.2.3-freya From 1005d4a8d8eef7aae6598bd4a96eea49f902ea80 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Wed, 4 May 2022 16:30:55 -0400 Subject: custom model data, custom glow item, custom seeker ping --- .../hideAndSeek/configuration/Config.java | 34 +++++++++++++-- .../hideAndSeek/configuration/ConfigManager.java | 9 ++++ .../hideAndSeek/game/EventListener.java | 49 ++++++++++------------ .../net/tylermurphy/hideAndSeek/game/Game.java | 25 ++++------- src/main/resources/config.yml | 18 ++++++-- 5 files changed, 83 insertions(+), 52 deletions(-) (limited to 'src/main/resources/config.yml') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 589d3a2..39bc55f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -21,6 +21,7 @@ package net.tylermurphy.hideAndSeek.configuration; import com.cryptomorin.xseries.XItemStack; import com.cryptomorin.xseries.XMaterial; +import com.cryptomorin.xseries.XSound; import net.tylermurphy.hideAndSeek.util.Version; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -100,6 +101,11 @@ public class Config { lobbyItemLeavePosition, lobbyItemStartPosition; + public static float + seekerPingLeadingVolume, + seekerPingVolume, + seekerPingPitch; + public static List blockedCommands, blockedInteracts; @@ -124,7 +130,12 @@ public class Config { public static ItemStack lobbyLeaveItem, - lobbyStartItem; + lobbyStartItem, + glowPowerupItem; + + public static XSound + ringingSound, + heartbeatSound; public static void loadConfig() { @@ -196,6 +207,16 @@ public class Config { glowLength = Math.max(1, config.getInt("glow.time")); glowStackable = config.getBoolean("glow.stackable"); glowEnabled = config.getBoolean("glow.enabled") && Version.atLeast("1.9"); + if(glowEnabled) { + ConfigurationSection item = new YamlConfiguration().createSection("temp"); + item.set("name", ChatColor.translateAlternateColorCodes('&',config.getString("glow.name"))); + item.set("material", config.getString("glow.material")); + List lore = config.getStringList("glow.lore"); + if (lore != null && !lore.isEmpty()) item.set("lore", lore); + ItemStack temp = null; + try{ temp = XItemStack.deserialize(item); } catch(Exception ignored){} + glowPowerupItem = temp; + } //Lobby minPlayers = Math.max(2, config.getInt("minPlayers")); @@ -210,6 +231,13 @@ public class Config { seekerPingLevel1 = config.getInt("seekerPing.distances.level1"); seekerPingLevel2 = config.getInt("seekerPing.distances.level2"); seekerPingLevel3 = config.getInt("seekerPing.distances.level3"); + seekerPingLeadingVolume = config.getFloat("seekerPing.sounds.leadingVolume"); + seekerPingVolume = config.getFloat("seekerPing.sounds.volume"); + seekerPingPitch = config.getFloat("seekerPing.sounds.pitch"); + Optional heartbeatOptional = XSound.matchXSound(config.getString("seekerPing.sounds.heartbeatNoise")); + heartbeatSound = heartbeatOptional.orElse(XSound.BLOCK_NOTE_BLOCK_BASEDRUM); + Optional ringingOptional = XSound.matchXSound(config.getString("seekerPing.sounds.ringingNoise")); + ringingSound = heartbeatOptional.orElse(XSound.BLOCK_NOTE_BLOCK_PLING); //Other nametagsVisible = config.getBoolean("nametagsVisible"); @@ -259,7 +287,7 @@ public class Config { item.set("name", ChatColor.translateAlternateColorCodes('&',config.getString("lobbyItems.leave.name"))); item.set("material", config.getString("lobbyItems.leave.material")); if(Version.atLeast("1.14")){ - if(config.contains("lobbyItems.leave.model-data")){ + if(config.contains("lobbyItems.leave.model-data") && config.getInt("lobbyItems.leave.model-data") != 0){ config.set("model-data", config.getInt("lobbyItems.leave.model-data")); } } @@ -282,7 +310,7 @@ public class Config { lobbyItemStartAdmin = config.getBoolean("lobbyItems.start.adminOnly"); lobbyItemStartPosition = config.getInt("lobbyItems.start.position"); if(Version.atLeast("1.14")){ - if(config.contains("lobbyItems.start.model-data")){ + if(config.contains("lobbyItems.start.model-data") && config.getInt("lobbyItems.start.model-data") != 0){ config.set("model-data", config.getInt("lobbyItems.start.model-data")); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java index 53a30c2..3546fa8 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java @@ -130,6 +130,15 @@ public class ConfigManager { return defaultConfig.getInt(path); } + public float getFloat(String path){ + float value = (float) config.getDouble(path); + if(value == 0){ + return (float) defaultConfig.getDouble(path); + } else { + return value; + } + } + public String getString(String path){ String value = config.getString(path); if(value == null){ diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java index 5995dbc..e464fba 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java @@ -32,7 +32,6 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.entity.Snowball; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -42,7 +41,6 @@ import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.*; -import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.projectiles.ProjectileSource; @@ -239,24 +237,6 @@ public class EventListener implements Listener { } } - @EventHandler(priority = EventPriority.HIGHEST) - public void onProjectile(ProjectileLaunchEvent event) { - if(Game.status != Status.PLAYING) return; - if(event.getEntity() instanceof Snowball) { - if(!glowEnabled) return; - Snowball snowball = (Snowball) event.getEntity(); - if(snowball.getShooter() instanceof Player) { - Player player = (Player) snowball.getShooter(); - if(Board.isHider(player)) { - Game.glow.onProjectile(); - snowball.remove(); - assert XMaterial.SNOWBALL.parseMaterial() != null; - player.getInventory().remove(XMaterial.SNOWBALL.parseMaterial()); - } - } - } - } - @EventHandler(priority = EventPriority.HIGHEST) public void onFoodLevelChange(FoodLevelChangeEvent event) { if(event.getEntity() instanceof Player) { @@ -297,18 +277,19 @@ public class EventListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerInteract(PlayerInteractEvent event) { if(!Board.isPlayer(event.getPlayer())) return; - if(event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock() != null && blockedInteracts.contains(event.getClickedBlock().getType().name())){ event.setCancelled(true); return; } - - if(Game.status != Status.STANDBY) return; - - ItemStack temp = event.getItem(); if(temp == null) return; + if(Game.status == Status.STANDBY) + onPlayerInteractLobby(temp, event); + if(Game.status == Status.PLAYING) + onPlayerInteractGame(temp, event); + } + private void onPlayerInteractLobby(ItemStack temp, PlayerInteractEvent event){ if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(lobbyLeaveItem.getItemMeta().getDisplayName()) && temp.getType() == lobbyLeaveItem.getType()) { event.setCancelled(true); Game.leave(event.getPlayer()); @@ -330,7 +311,20 @@ public class EventListener implements Listener { } Game.start(); } + } + private void onPlayerInteractGame(ItemStack temp, PlayerInteractEvent event){ + if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(glowPowerupItem.getItemMeta().getDisplayName()) && temp.getType() == glowPowerupItem.getType()) { + if(!glowEnabled) return; + Player player = event.getPlayer(); + if(Board.isHider(player)) { + Game.glow.onProjectile(); + player.getInventory().remove(glowPowerupItem); + assert XMaterial.SNOWBALL.parseMaterial() != null; + player.getInventory().remove(XMaterial.SNOWBALL.parseMaterial()); + event.setCancelled(true); + } + } } @EventHandler(priority = EventPriority.HIGHEST) @@ -344,9 +338,8 @@ public class EventListener implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) - public void onItemDrop(PlayerDropItemEvent event) - { - if(Board.isPlayer(event.getPlayer()) && Game.status == Status.STANDBY){ + public void onItemDrop(PlayerDropItemEvent event) { + if(Board.isPlayer(event.getPlayer())){ event.setCancelled(true); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index c01682b..7488163 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -273,18 +273,7 @@ public class Game { for(PotionEffect effect : Items.HIDER_EFFECTS) player.addPotionEffect(effect); if(glowEnabled) { - assert XMaterial.SNOWBALL.parseMaterial() != null; - ItemStack snowball = new ItemStack(XMaterial.SNOWBALL.parseMaterial(), 1); - ItemMeta snowballMeta = snowball.getItemMeta(); - assert snowballMeta != null; - snowballMeta.setDisplayName("Glow Powerup"); - List snowballLore = new ArrayList<>(); - 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.getInventory().addItem(glowPowerupItem); } } } @@ -391,18 +380,18 @@ public class Game { } if(seekerPing) switch(tick%10) { case 0: - if(distance < seekerPingLevel1) XSound.BLOCK_NOTE_BLOCK_BASEDRUM.play(hider, .5f, 1f); - if(distance < seekerPingLevel3) XSound.BLOCK_NOTE_BLOCK_PLING.play(hider, .3f, 1f); + if(distance < seekerPingLevel1) heartbeatSound.play(hider, seekerPingLeadingVolume, seekerPingPitch); + if(distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; case 3: - if(distance < seekerPingLevel1) XSound.BLOCK_NOTE_BLOCK_BASEDRUM.play(hider, .3f, 1f); - if(distance < seekerPingLevel3) XSound.BLOCK_NOTE_BLOCK_PLING.play(hider, .3f, 1f); + if(distance < seekerPingLevel1) heartbeatSound.play(hider, seekerPingVolume, seekerPingPitch); + if(distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; case 6: - if(distance < seekerPingLevel3) XSound.BLOCK_NOTE_BLOCK_PLING.play(hider, .3f, 1f); + if(distance < seekerPingLevel3) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; case 9: - if(distance < seekerPingLevel2) XSound.BLOCK_NOTE_BLOCK_PLING.play(hider, .3f, 1f); + if(distance < seekerPingLevel2) ringingSound.play(hider, seekerPingVolume, seekerPingPitch); break; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9a82052..8e52343 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -99,6 +99,9 @@ glow: time: 30 stackable: true enabled: true + name: "Glow Powerup" + lore: [ "Throw to make all seekers glow", "Last 30s, all hiders can see it", "Time stacks on multi use" ] + material: SNOWBALL # The message prefixes displayed before messages. The message contents themselves # can be changed in localization.yml. @@ -124,21 +127,24 @@ lobby: # Below are the two items given to you when you join a lobby. A item to click to leave the lobby, and another # to start the game. Each of these items can be toggled separately, but only these items are currently supported. -# You can customize the material, name, lore, and position of the item. And finally, the start item is marked as -# adminOnly be default since the /hs start command is also admin by default. If you set adminOnly to false, only -# the item will become non admin only, not the command. +# You can customize the material, name, lore, and position of the item. You can also change the model data if your +# server is running 1.14 or above. Any earlier version, the model-data tag will be ignored; Model-data 0 is also ignored. +# Finally, the start item is marked as adminOnly be default since the /hs start command is also admin by default. +# If you set adminOnly to false, only the item will become non admin only, not the command. lobbyItems: leave: material: BED name: "&cLeave Lobby" lore: ["Go back to server hub"] position: 8 + model-data: 0 enabled: true start: material: CLOCK name: "&bStart Game" lore: [] position: 0 + model-data: 0 enabled: true adminOnly: true @@ -150,6 +156,12 @@ seekerPing: level1: 30 level2: 20 level3: 10 + sounds: + leadingVolume: 0.5 + volume: 0.3 + pitch: 1 + heartbeatNoise: BLOCK_NOTE_BLOCK_BASEDRUM + ringingNoise: BLOCK_NOTE_BLOCK_PLING enabled: true # Changes the default plugin language. Currently, Supported localizations are: -- cgit v1.2.3-freya From 36027e007e512d54e7e3cd8fb66774cc9c5e43f2 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Thu, 5 May 2022 12:22:04 -0400 Subject: countdown titles, and possible config save for utf8 --- .../hideAndSeek/configuration/Config.java | 11 +++++++ .../hideAndSeek/configuration/ConfigManager.java | 29 +++++++++-------- .../net/tylermurphy/hideAndSeek/game/Game.java | 37 ++++++++++++---------- .../hideAndSeek/util/CountdownDisplay.java | 26 +++++++++++++++ src/main/resources/config.yml | 13 ++++++++ 5 files changed, 87 insertions(+), 29 deletions(-) create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/util/CountdownDisplay.java (limited to 'src/main/resources/config.yml') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 79571fc..ee2f8b6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -22,6 +22,8 @@ package net.tylermurphy.hideAndSeek.configuration; import com.cryptomorin.xseries.XItemStack; import com.cryptomorin.xseries.XMaterial; import com.cryptomorin.xseries.XSound; +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.util.CountdownDisplay; import net.tylermurphy.hideAndSeek.util.Version; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -136,6 +138,9 @@ public class Config { public static XSound ringingSound, heartbeatSound; + + public static CountdownDisplay + countdownDisplay; public static void loadConfig() { @@ -249,6 +254,12 @@ public class Config { locale = config.getString("locale", "local"); blockedCommands = config.getStringList("blockedCommands"); leaveOnEnd = config.getBoolean("leaveOnEnd"); + try { + countdownDisplay = CountdownDisplay.valueOf(config.getString("hideCountdownDisplay")); + } catch (IllegalArgumentException e){ + countdownDisplay = CountdownDisplay.CHAT; + Main.plugin.getLogger().warning("hideCountdownDisplay: "+config.getString("hideCountdownDisplay")+" is not a valid configuration option!"); + } blockedInteracts = new ArrayList<>(); List tempInteracts = config.getStringList("blockedInteracts"); for(String id : tempInteracts){ diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java index 3546fa8..0168dc5 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java @@ -52,16 +52,20 @@ public class ConfigManager { this.config = YamlConfiguration.loadConfiguration(file); - InputStream input = Main.plugin.getResource(file.getName()); - if(input == null){ + FileInputStream input = null; + try{ + input = new FileInputStream(file); + } catch (Exception e){ throw new RuntimeException("Could not create input stream for "+file.getPath()); } - InputStreamReader reader = new InputStreamReader(input); + + InputStreamReader reader = new InputStreamReader(input, StandardCharsets.UTF_8); this.defaultConfig = YamlConfiguration.loadConfiguration(reader); try{ input.close(); reader.close(); - } catch (IOException ignored){} + } catch (IOException ignored){ + } } public ConfigManager(String filename, String defaultFilename){ @@ -221,7 +225,7 @@ public class ConfigManager { while((c = reader.read()) != -1){ textBuilder.append((char) c); } - String yamlString = textBuilder.toString(); + String yamlString = new String(textBuilder.toString().getBytes(), StandardCharsets.UTF_8); Map temp = config.getValues(true); for(Map.Entry entry: temp.entrySet()){ if(entry.getValue() instanceof Integer || entry.getValue() instanceof Double || entry.getValue() instanceof String || entry.getValue() instanceof Boolean || entry.getValue() instanceof List){ @@ -246,26 +250,25 @@ public class ConfigManager { if(entry.getValue() instanceof List){ if(((List) entry.getValue()).isEmpty()) continue; replace = "["; - for(Object o : (List)entry.getValue()){ - replace = replace + o.toString() + ", "; + for(Object o : (List)entry.getValue()){ + replace = replace + new String(o.toString().getBytes(), StandardCharsets.UTF_8) + ", "; } replace = replace.substring(0, replace.length()-2); replace = replace + "]"; } else { - replace = entry.getValue().toString(); + replace = new String(entry.getValue().toString().getBytes(), StandardCharsets.UTF_8); } if(entry.getValue() instanceof String){ replace = "\"" + replace + "\""; } StringBuilder builder = new StringBuilder(yamlString); builder.replace(start+1, end, replace); - yamlString = builder.toString(); + yamlString = new String(builder.toString().getBytes(), StandardCharsets.UTF_8); } } - OutputStream os = new FileOutputStream(file); - PrintWriter out = new PrintWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8), true); - out.print(yamlString); - out.close(); + Writer fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)); + fileWriter.write(yamlString); + fileWriter.close(); } catch (IOException e){ e.printStackTrace(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 992570d..a886247 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -28,9 +28,7 @@ import com.google.common.io.ByteStreams; import net.md_5.bungee.api.ChatColor; import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.database.Database; -import net.tylermurphy.hideAndSeek.util.Status; -import net.tylermurphy.hideAndSeek.util.Version; -import net.tylermurphy.hideAndSeek.util.WinType; +import net.tylermurphy.hideAndSeek.util.*; import net.tylermurphy.hideAndSeek.world.WorldLoader; import org.bukkit.*; import org.bukkit.attribute.Attribute; @@ -41,13 +39,11 @@ import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.util.Packet; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import javax.swing.*; import java.io.File; import java.util.*; import java.util.stream.Collectors; @@ -137,16 +133,18 @@ public class Game { Board.reloadGameBoards(); status = Status.STARTING; int temp = gameId; - broadcastMessage(messagePrefix + message("START_COUNTDOWN").addAmount(30)); - sendDelayedActionbar(messagePrefix + message("START_COUNTDOWN").addAmount(20), gameId, 20 * 10); - sendDelayedActionbar(messagePrefix + message("START_COUNTDOWN").addAmount(10), gameId, 20 * 20); - sendDelayedActionbar(messagePrefix + message("START_COUNTDOWN").addAmount(5), gameId, 20 * 25); - sendDelayedActionbar(messagePrefix + message("START_COUNTDOWN").addAmount(3), gameId, 20 * 27); - sendDelayedActionbar(messagePrefix + message("START_COUNTDOWN").addAmount(2), gameId, 20 * 28); - sendDelayedActionbar(messagePrefix + message("START_COUNTDOWN").addAmount(1), gameId, 20 * 29); + if(countdownDisplay != CountdownDisplay.TITLE) { + sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(30), gameId, 0); + } + sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(20), gameId, 20 * 10); + sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(10), gameId, 20 * 20); + sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(5), gameId, 20 * 25); + sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(3), gameId, 20 * 27); + sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(2), gameId, 20 * 28); + sendHideCountdownMessage(messagePrefix + message("START_COUNTDOWN").addAmount(1), gameId, 20 * 29); Bukkit.getServer().getScheduler().runTaskLater(Main.plugin, () -> { if(temp != gameId) return; - broadcastMessage(messagePrefix + message("START")); + sendHideCountdownMessage(messagePrefix + message("START"), gameId, 0); for(Player player : Board.getPlayers()) resetPlayer(player); status = Status.PLAYING; }, 20 * 30); @@ -422,12 +420,19 @@ public class Game { } } - private static void sendDelayedActionbar(String message, int gameId, int delay) { + private static void sendHideCountdownMessage(String message, int gameId, int delay) { Bukkit.getScheduler().runTaskLaterAsynchronously(Main.plugin, () -> { if(gameId == Game.gameId){ for(Player player : Board.getPlayers()){ - ActionBar.clearActionBar(player); - ActionBar.sendActionBar(player,message); + if(countdownDisplay == CountdownDisplay.CHAT){ + player.sendMessage(message); + } else if(countdownDisplay == CountdownDisplay.ACTIONBAR){ + ActionBar.clearActionBar(player); + ActionBar.sendActionBar(player,message); + } else if(countdownDisplay == CountdownDisplay.TITLE){ + Titles.clearTitle(player); + Titles.sendTitle(player, 10, 71, 10, null, message); + } } } }, delay); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/CountdownDisplay.java b/src/main/java/net/tylermurphy/hideAndSeek/util/CountdownDisplay.java new file mode 100644 index 0000000..477f7ca --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/CountdownDisplay.java @@ -0,0 +1,26 @@ +/* + * This file is part of Kenshins Hide and Seek + * + * Copyright (c) 2022 Tyler Murphy. + * + * Kenshins Hide and Seek free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * he Free Software Foundation version 3. + * + * Kenshins Hide and Seek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package net.tylermurphy.hideAndSeek.util; + +public enum CountdownDisplay { + CHAT, + ACTIONBAR, + TITLE +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 8e52343..cdf88ac 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -14,6 +14,19 @@ gameLength: 1200 # default: true announceMessagesToNonPlayers: true +# When the game is starting, the plugin will state there is x seconds left to hide. +# You change where countdown messages to be displayed: in the chat, action bar, or a title. +# Below you can set CHAT, ACTIONBAR, or TITLE. Any invalid option will revert to CHAT. +# +# CHAT - Messages will be displayed in the chat +# +# ACTIONBAR - Messages will be displayed in the action bar (area above the hotbar) +# +# TITLE - Messages will be displayed as a title +# +# default: CHAT +hideCountdownDisplay: CHAT + # Allow Hiders to see their own teams nametags as well as seekers. Seekers can never see nametags regardless. # default: false nametagsVisible: false -- cgit v1.2.3-freya From 134444243a491a5b22c2cc4219e8fdd361ce2693 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Fri, 6 May 2022 12:22:04 -0400 Subject: option to disable mapsave --- .../tylermurphy/hideAndSeek/command/SaveMap.java | 4 ++++ .../hideAndSeek/command/SetSpawnLocation.java | 2 +- .../net/tylermurphy/hideAndSeek/command/Setup.java | 11 ++++++---- .../hideAndSeek/configuration/Config.java | 4 +++- .../hideAndSeek/game/EventListener.java | 10 ++++----- .../net/tylermurphy/hideAndSeek/game/Game.java | 25 ++++++++++++++-------- src/main/resources/config.yml | 12 +++++++++-- src/main/resources/lang/localization_de-DE.yml | 1 + src/main/resources/lang/localization_en-US.yml | 1 + 9 files changed, 48 insertions(+), 22 deletions(-) (limited to 'src/main/resources/config.yml') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java index c48e1c6..f5e63a5 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java @@ -36,6 +36,10 @@ public class SaveMap implements ICommand { public static boolean runningBackup = false; public void execute(CommandSender sender, String[] args) { + if(!mapSaveEnabled){ + sender.sendMessage(errorPrefix + message("MAPSAVE_DISABLED")); + return; + } if(Game.status != Status.STANDBY) { sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); return; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetSpawnLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetSpawnLocation.java index 7afe861..d5e1cba 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetSpawnLocation.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/SetSpawnLocation.java @@ -56,7 +56,7 @@ public class SetSpawnLocation implements ICommand { if(world == null){ throw new RuntimeException("Unable to get world: " + spawnWorld); } - if(!world.getName().equals(spawnWorld)){ + if(mapSaveEnabled && !world.getName().equals(spawnWorld)){ Game.worldLoader.unloadMap(); Game.worldLoader = new WorldLoader(world.getName()); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java index 74c29bf..14a5d6f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java @@ -19,6 +19,7 @@ package net.tylermurphy.hideAndSeek.command; +import net.tylermurphy.hideAndSeek.game.Game; import org.bukkit.command.CommandSender; import net.tylermurphy.hideAndSeek.Main; @@ -51,10 +52,12 @@ public class Setup implements ICommand { msg = msg + "\n" + message("SETUP_BOUNDS"); count++; } - File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld); - if(!destenation.exists()) { - msg = msg + "\n" + message("SETUP_SAVEMAP"); - count++; + if(mapSaveEnabled) { + File destenation = new File(Main.root + File.separator + Game.getGameWorld()); + if (!destenation.exists()) { + msg = msg + "\n" + message("SETUP_SAVEMAP"); + count++; + } } if(count < 1) { sender.sendMessage(messagePrefix + message("SETUP_COMPLETE")); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 835b03d..ec4e84e 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -78,7 +78,8 @@ public class Config { seekerPing, bungeeLeave, lobbyItemStartAdmin, - leaveOnEnd; + leaveOnEnd, + mapSaveEnabled; public static int minPlayers, @@ -201,6 +202,7 @@ public class Config { saveMinZ = config.getInt("bounds.min.z"); saveMaxX = config.getInt("bounds.max.x"); saveMaxZ = config.getInt("bounds.max.z"); + mapSaveEnabled = config.getBoolean("mapSaveEnabled"); //Taunt tauntEnabled = config.getBoolean("taunt.enabled"); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java index e464fba..35089e4 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java @@ -61,12 +61,12 @@ public class EventListener implements Listener { if(autoJoin){ Game.join(event.getPlayer()); } else if(teleportToExit) { - if (event.getPlayer().getWorld().getName().equals("hideandseek_" + spawnWorld) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) { + if (event.getPlayer().getWorld().getName().equals(Game.getGameWorld()) || 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)) { + if (event.getPlayer().getWorld().getName().equals(Game.getGameWorld())) { if(Game.status != Status.STANDBY){ Game.join(event.getPlayer()); } else { @@ -115,10 +115,10 @@ public class EventListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onMove(PlayerMoveEvent event){ - if(!event.getPlayer().getWorld().getName().equals("hideandseek_" + spawnWorld)) return; + if(!event.getPlayer().getWorld().getName().equals(Game.getGameWorld())) return; if(event.getPlayer().hasPermission("hideandseek.leavebounds")) return; if(event.getTo() == null || event.getTo().getWorld() == null) return; - if(!event.getTo().getWorld().getName().equals("hideandseek_" + spawnWorld)) return; + if(!event.getTo().getWorld().getName().equals(Game.getGameWorld())) return; if(event.getTo().getBlockX() < saveMinX || event.getTo().getBlockX() > saveMaxX || event.getTo().getBlockZ() < saveMinZ || event.getTo().getBlockZ() > saveMaxZ){ event.setCancelled(true); } @@ -211,7 +211,7 @@ public class EventListener implements Listener { } else { player.setHealth(player.getMaxHealth()); } - player.teleport(new Location(Bukkit.getWorld("hideandseek_" + spawnWorld), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); if(Version.atLeast("1.9")){ XSound.ENTITY_PLAYER_DEATH.play(player, 1, 1); } else { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index d61d11f..16caee4 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -89,7 +89,7 @@ public class Game { public static void start(Player seeker){ if(status == Status.STARTING || status == Status.PLAYING) return; - if(worldLoader.getWorld() != null) { + if(mapSaveEnabled && worldLoader.getWorld() != null) { worldLoader.rollback(); } else { worldLoader.loadMap(); @@ -105,7 +105,7 @@ public class Game { for(Player player : Board.getPlayers()) { player.getInventory().clear(); player.setGameMode(GameMode.ADVENTURE); - player.teleport(new Location(Bukkit.getWorld("hideandseek_"+spawnWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); + player.teleport(new Location(Bukkit.getWorld(getGameWorld()), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); for(PotionEffect effect : player.getActivePotionEffects()){ player.removePotionEffect(effect.getType()); } @@ -125,7 +125,7 @@ public class Game { if (glowEnabled) glow = new Glow(); worldBorder = new Border(); - worldBorder.resetWorldborder("hideandseek_"+spawnWorld); + worldBorder.resetWorldborder(getGameWorld()); if(gameLength > 0) timeLeft = gameLength; for(Player player : Board.getPlayers()) @@ -184,7 +184,7 @@ public class Game { winners.add(Board.getFirstSeeker().getUniqueId()); Database.playerInfo.addWins(players, winners, type); } - worldBorder.resetWorldborder("hideandseek_"+spawnWorld); + worldBorder.resetWorldborder(getGameWorld()); for(Player player : Board.getPlayers()) { if(Version.atLeast("1.9")){ for(Player temp : Board.getPlayers()) { @@ -220,7 +220,7 @@ public class Game { } } EventListener.temp_loc.clear(); - worldLoader.unloadMap(); + if(mapSaveEnabled) worldLoader.unloadMap(); Board.reloadLobbyBoards(); } @@ -228,11 +228,18 @@ public class Game { if(spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) return true; if(lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0) return true; if(exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) return true; - File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld); - if(!destenation.exists()) return true; + if(mapSaveEnabled) { + File destenation = new File(Main.root + File.separator + getGameWorld()); + if (!destenation.exists()) return true; + } return saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0; } + public static String getGameWorld(){ + if(mapSaveEnabled) return "hideandseek_"+spawnWorld; + else return spawnWorld; + } + public static void onTick() { if(isNotSetup()) return; if(status == Status.STANDBY) whileWaiting(); @@ -294,7 +301,7 @@ public class Game { player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR")); player.setGameMode(GameMode.SPECTATOR); Board.createGameBoard(player); - player.teleport(new Location(Bukkit.getWorld("hideandseek_"+spawnWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); + player.teleport(new Location(Bukkit.getWorld(getGameWorld()), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); Titles.sendTitle(player, 10, 70, 20, ChatColor.GRAY + "" + ChatColor.BOLD + "SPECTATING", ChatColor.WHITE + message("SPECTATOR_SUBTITLE").toString()); } @@ -601,7 +608,7 @@ class Border { running = true; broadcastMessage(worldborderPrefix + message("WORLDBORDER_DECREASING").addAmount(change)); currentWorldborderSize -= worldborderChange; - World world = Bukkit.getWorld("hideandseek_"+spawnWorld); + World world = Bukkit.getWorld(Game.getGameWorld()); assert world != null; org.bukkit.WorldBorder border = world.getWorldBorder(); border.setSize(border.getSize()-change,30); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cdf88ac..88eab62 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -60,12 +60,12 @@ teleportToExit: false # Normally when the game ends, players are set back to the lobby to play another game. # You can disable this, and empty the lobby after the game finishes. This is like everyone # running /hs leave at the end of the game. Players will leave either to the exit position -# or another server depending what you have `leaveType` set too. +# or another server depending on what you have `leaveType` set too. # default: false leaveOnEnd: false # What do you want to happen when a player leaves the lobby. If you are running a single server, maybe you want to send -# them to the world hub. But if you are running a bungee-cord or velocity server, maybe you want to send them to the servers +# them to the world hub. But if you are running a bungee-cord or velocity server, maybe you want to send them to the servers' # hub. # # EXIT - Sends the player to the specified exit position set by /hs setexit @@ -79,6 +79,14 @@ leaveType: EXIT # players too. leaveServer: hub +# By default, the plugin forces you to use a map save to protect from changes to a map thought a game play though. It copies your +# hide-and-seek world to a separate world, and loads the game there to contain the game in an isolated and backed up map This allows you to +# not worry about your hide-and-seek map from changing, as all changes are made are in a separate world file that doesn't get saved. Once the game +# ends, it unloads the map and doesn't save. Then reloads the duplicate to the original state, rolling back the map for the next game. +# It is highly recommended that you keep this set to true unless you have other means of protecting your hide-and-seek map. +# default: true +mapSaveEnabled: true + # 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. diff --git a/src/main/resources/lang/localization_de-DE.yml b/src/main/resources/lang/localization_de-DE.yml index d560d24..5fd80d6 100644 --- a/src/main/resources/lang/localization_de-DE.yml +++ b/src/main/resources/lang/localization_de-DE.yml @@ -30,6 +30,7 @@ Localization: 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." + MAPSAVE_DISABLED: "Mapsave ist in config.yml deaktiviert." 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." diff --git a/src/main/resources/lang/localization_en-US.yml b/src/main/resources/lang/localization_en-US.yml index 1757877..b047bdb 100644 --- a/src/main/resources/lang/localization_en-US.yml +++ b/src/main/resources/lang/localization_en-US.yml @@ -30,6 +30,7 @@ Localization: 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." + MAPSAVE_DISABLED: "Mapsave is disabled in config.yml." WORLDBORDER_DISABLE: "Disabled world border." WORLDBORDER_INVALID_INPUT: "Invalid integer {AMOUNT}." WORLDBORDER_MIN_SIZE: "World border cannot be smaller than 100 blocks." -- cgit v1.2.3-freya From e89e5f932c77034038c1fe166d1dfe2151a258f2 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Sat, 7 May 2022 23:54:48 -0400 Subject: rewrite database and damage event, add placeholders --- pom.xml | 10 ++ .../java/net/tylermurphy/hideAndSeek/Main.java | 5 + .../net/tylermurphy/hideAndSeek/command/Wins.java | 4 +- .../hideAndSeek/configuration/Config.java | 4 +- .../tylermurphy/hideAndSeek/database/Database.java | 8 -- .../hideAndSeek/database/PlayerInfo.java | 13 +- .../hideAndSeek/database/PlayerInfoTable.java | 124 +++++++++++------ .../net/tylermurphy/hideAndSeek/game/Board.java | 36 +++++ .../hideAndSeek/game/EventListener.java | 151 +++++++++------------ .../net/tylermurphy/hideAndSeek/game/Game.java | 4 +- .../hideAndSeek/util/PAPIExpansion.java | 128 +++++++++++++++++ src/main/resources/config.yml | 7 + 12 files changed, 351 insertions(+), 143 deletions(-) create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java (limited to 'src/main/resources/config.yml') diff --git a/pom.xml b/pom.xml index 4f73ae1..8073d7a 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,10 @@ dmulloy2-repo https://repo.dmulloy2.net/repository/public/ + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + @@ -103,5 +107,11 @@ XSeries 8.7.1 + + me.clip + placeholderapi + 2.11.1 + provided + \ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java index ac6c2d5..cf73757 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java @@ -23,6 +23,7 @@ import java.io.File; import java.util.List; import net.tylermurphy.hideAndSeek.database.Database; +import net.tylermurphy.hideAndSeek.util.PAPIExpansion; import net.tylermurphy.hideAndSeek.util.UUIDFetcher; import org.bukkit.Bukkit; @@ -74,6 +75,10 @@ public class Main extends JavaPlugin implements Listener { },0,1).getTaskId(); Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + + if(Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + new PAPIExpansion().register(); + } } public void onDisable() { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java index dfa5338..9140f49 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java @@ -66,8 +66,8 @@ public class Wins implements ICommand { message = message + message("INFORMATION_FOR").addPlayer(name) + "\n"; message = message + "==============================\n"; message = message + String.format("%sTOTAL WINS: %s%s\n%sHIDER WINS: %s%s\n%sSEEKER WINS: %s%s\n%sGAMES PLAYED: %s", - ChatColor.YELLOW, ChatColor.WHITE, info.wins, ChatColor.GOLD, ChatColor.WHITE, info.hider_wins, - ChatColor.RED, ChatColor.WHITE, info.seeker_wins, ChatColor.WHITE, info.games_played); + ChatColor.YELLOW, ChatColor.WHITE, info.seeker_wins+info.hider_wins, ChatColor.GOLD, ChatColor.WHITE, info.hider_wins, + ChatColor.RED, ChatColor.WHITE, info.seeker_wins, ChatColor.WHITE, info.seeker_games+info.hider_games); message = message + ChatColor.WHITE + "" + ChatColor.BOLD + "\n=============================="; sender.sendMessage(message); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index ec4e84e..f94ba0b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -79,7 +79,8 @@ public class Config { bungeeLeave, lobbyItemStartAdmin, leaveOnEnd, - mapSaveEnabled; + mapSaveEnabled, + allowNaturalCauses; public static int minPlayers, @@ -251,6 +252,7 @@ public class Config { permissionsRequired = config.getBoolean("permissionsRequired"); gameLength = config.getInt("gameLength"); pvpEnabled = config.getBoolean("pvp"); + allowNaturalCauses = config.getBoolean("allowNaturalCauses"); autoJoin = config.getBoolean("autoJoin"); teleportToExit = config.getBoolean("teleportToExit"); locale = config.getString("locale", "local"); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java index 25a4171..fe5ac5b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java @@ -55,14 +55,6 @@ public class Database { return conn; } - protected static InputStream convertUniqueId(UUID uuid) { - byte[] bytes = new byte[16]; - ByteBuffer.wrap(bytes) - .putLong(uuid.getMostSignificantBits()) - .putLong(uuid.getLeastSignificantBits()); - return new ByteArrayInputStream(bytes); - } - protected static UUID convertBinaryStream(InputStream stream) { ByteBuffer buffer = ByteBuffer.allocate(16); try { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfo.java b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfo.java index 8464b54..5fbb96b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfo.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfo.java @@ -24,14 +24,17 @@ import java.util.UUID; public class PlayerInfo { public UUID uuid; - public int wins, hider_wins, seeker_wins, games_played; + public int hider_wins, seeker_wins, hider_games, seeker_games, hider_kills, seeker_kills, hider_deaths, seeker_deaths; - public PlayerInfo(UUID uuid, int wins, int hider_wins, int seeker_wins, int games_played){ + public PlayerInfo(UUID uuid, int hider_wins, int seeker_wins, int hider_games, int seeker_games, int hider_kills, int seeker_kills, int hider_deaths, int seeker_deaths) { this.uuid = uuid; - this.wins = wins; this.hider_wins = hider_wins; this.seeker_wins = seeker_wins; - this.games_played = games_played; + this.hider_games = hider_games; + this.seeker_games = seeker_games; + this.hider_kills = hider_kills; + this.seeker_kills = seeker_kills; + this.hider_deaths = hider_deaths; + this.seeker_deaths = seeker_deaths; } - } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java index 142c263..06c036d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java @@ -19,28 +19,37 @@ package net.tylermurphy.hideAndSeek.database; +import com.google.common.io.ByteStreams; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.configuration.Config; +import net.tylermurphy.hideAndSeek.game.Board; import net.tylermurphy.hideAndSeek.util.WinType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; import java.sql.*; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; public class PlayerInfoTable { + private static final Map CACHE = new HashMap<>(); + protected PlayerInfoTable(){ - String sql = "CREATE TABLE IF NOT EXISTS player_info (\n" + String sql = "CREATE TABLE IF NOT EXISTS hs_data (\n" + " uuid BINARY(16) PRIMARY KEY,\n" - + " wins int NOT NULL,\n" - + " seeker_wins int NOT NULL,\n" + " hider_wins int NOT NULL,\n" - + " games_played int NOT NULL\n" + + " seeker_wins int NOT NULL,\n" + + " hider_games int NOT NULL\n" + + " seeker_games int NOT NULL\n" + + " hider_kills int NOT NULL\n" + + " seeker_kills int NOT NULL\n" + + " hider_deaths int NOT NULL\n" + + " seeker_deaths int NOT NULL\n" + ");"; try(Connection connection = Database.connect(); Statement statement = connection.createStatement()){ @@ -51,52 +60,87 @@ public class PlayerInfoTable { } } + private byte[] encodeUUID(UUID uuid){ + try { + byte[] bytes = new byte[16]; + ByteBuffer.wrap(bytes) + .putLong(uuid.getMostSignificantBits()) + .putLong(uuid.getLeastSignificantBits()); + InputStream is = new ByteArrayInputStream(bytes); + byte[] result = new byte[is.available()]; + if (is.read(result) == -1) { + Main.plugin.getLogger().severe("IO Error: Failed to read bytes from input stream"); + return new byte[0]; + } + return result; + } catch (IOException e){ + Main.plugin.getLogger().severe("IO Error: " + e.getMessage()); + return new byte[0]; + } + } + + private UUID decodeUUID(byte[] bytes){ + InputStream is = new ByteArrayInputStream(bytes); + ByteBuffer buffer = ByteBuffer.allocate(16); + try { + buffer.put(ByteStreams.toByteArray(is)); + buffer.flip(); + return new UUID(buffer.getLong(), buffer.getLong()); + } catch (IOException e) { + Main.plugin.getLogger().severe("IO Error: " + e.getMessage()); + } + return null; + } + + @NotNull public PlayerInfo getInfo(UUID uuid){ - String sql = "SELECT * FROM player_info WHERE uuid = ?;"; + String sql = "SELECT * FROM hs_data WHERE uuid = ?;"; try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ - InputStream is = Database.convertUniqueId(uuid); - byte[] bytes = new byte[is.available()]; - if(is.read(bytes) == -1){ - throw new IOException("Failed to read bytes from input stream"); - } - statement.setBytes(1, bytes); + statement.setBytes(1, encodeUUID(uuid)); ResultSet rs = statement.executeQuery(); if(rs.next()){ PlayerInfo info = new PlayerInfo( uuid, - rs.getInt("wins"), - rs.getInt("seeker_wins"), rs.getInt("hider_wins"), - rs.getInt("games_played") + rs.getInt("seeker_wins"), + rs.getInt("hider_games"), + rs.getInt("seeker_games"), + rs.getInt("hider_kills"), + rs.getInt("seeker_kills"), + rs.getInt("hider_deaths"), + rs.getInt("seeker_deaths") ); rs.close(); connection.close(); + CACHE.put(uuid, info); return info; } rs.close(); } catch (SQLException e){ Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); e.printStackTrace(); - } catch (IOException e) { - Main.plugin.getLogger().severe("IO Error: " + e.getMessage()); - e.printStackTrace(); } - return new PlayerInfo(uuid, 0, 0, 0, 0); + return new PlayerInfo(uuid, 0, 0, 0, 0, 0, 0, 0, 0); } + @Nullable public List getInfoPage(int page){ - String sql = "SELECT * FROM player_info ORDER BY wins DESC LIMIT 10 OFFSET ?;"; + String sql = "SELECT * FROM hs_data ORDER BY (hider_wins + seeker_wins) DESC LIMIT 10 OFFSET ?;"; try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ statement.setInt(1, (page-1)*10); ResultSet rs = statement.executeQuery(); List infoList = new ArrayList<>(); while(rs.next()){ PlayerInfo info = new PlayerInfo( - Database.convertBinaryStream(new ByteArrayInputStream(rs.getBytes("uuid"))), - rs.getInt("wins"), - rs.getInt("seeker_wins"), + decodeUUID(rs.getBytes("uuid")), rs.getInt("hider_wins"), - rs.getInt("games_played") + rs.getInt("seeker_wins"), + rs.getInt("hider_games"), + rs.getInt("seeker_games"), + rs.getInt("hider_kills"), + rs.getInt("seeker_kills"), + rs.getInt("hider_deaths"), + rs.getInt("seeker_deaths") ); infoList.add(info); } @@ -110,31 +154,31 @@ public class PlayerInfoTable { return null; } - public void addWins(List uuids, List winners, WinType type){ + public void addWins(List uuids, List winners, Map kills, Map deaths, WinType type){ for(UUID uuid : uuids){ - String sql = "INSERT OR REPLACE INTO player_info (uuid, wins, seeker_wins, hider_wins, games_played) VALUES (?,?,?,?,?)"; + String sql = "INSERT OR REPLACE INTO hs_data (uuid, hider_wins, seeker_wins, hider_games, seeker_games, hider_kills, seeker_kills, hider_deaths, seeker_deaths) VALUES (?,?,?,?,?,?,?,?,?)"; PlayerInfo info = getInfo(uuid); try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ - InputStream is = Database.convertUniqueId(uuid); - byte[] bytes = new byte[is.available()]; - if(is.read(bytes) == -1){ - throw new IOException("Failed to read bytes from input stream"); - } - statement.setBytes(1, bytes); - statement.setInt(2, info.wins + (winners.contains(uuid) ? 1 : 0)); + statement.setBytes(1, encodeUUID(uuid)); + statement.setInt(2, info.hider_wins + (winners.contains(uuid) && type == WinType.HIDER_WIN ? 1 : 0)); statement.setInt(3, info.seeker_wins + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0)); - statement.setInt(4, info.hider_wins + (winners.contains(uuid) && type == WinType.HIDER_WIN ? 1 : 0)); - statement.setInt(5, info.games_played + 1); + statement.setInt(4, info.hider_games + (Board.isHider(uuid) ? 1 : 0)); + statement.setInt(5, info.seeker_games + (Board.isSeeker(uuid) ? 1 : 0)); + statement.setInt(6, info.hider_kills + (Board.isHider(uuid) ? kills.get(uuid.toString()) : 0)); + statement.setInt(7, info.seeker_kills + (Board.isSeeker(uuid) ? kills.get(uuid.toString()) : 0)); + statement.setInt(8, info.hider_deaths + (Board.isHider(uuid) ? deaths.get(uuid.toString()) : 0)); + statement.setInt(9, info.seeker_deaths + (Board.isSeeker(uuid) ? deaths.get(uuid.toString()) : 0)); statement.execute(); } catch (SQLException e){ Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); e.printStackTrace(); return; - } catch (IOException e) { - Main.plugin.getLogger().severe("IO Error: " + e.getMessage()); - e.printStackTrace(); + } finally { + CACHE.remove(uuid); } } } + + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index c08b779..86711ab 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -38,6 +38,8 @@ public class Board { private static final List Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>(); private static final Map playerList = new HashMap<>(); private static final Map customBoards = new HashMap<>(); + private static final Map kills = new HashMap<>(); + private static final Map deaths = new HashMap<>(); public static boolean isPlayer(Player player) { return playerList.containsKey(player.getUniqueId().toString()); @@ -51,10 +53,18 @@ public class Board { return Hider.contains(player.getUniqueId().toString()); } + public static boolean isHider(UUID uuid){ + return Hider.contains(uuid.toString()); + } + public static boolean isSeeker(Player player) { return Seeker.contains(player.getUniqueId().toString()); } + public static boolean isSeeker(UUID uuid){ + return Seeker.contains(uuid.toString()); + } + public static boolean isSpectator(Player player) { return Spectator.contains(player.getUniqueId().toString()); } @@ -133,6 +143,32 @@ public class Board { Hider.clear(); Seeker.clear(); Spectator.clear(); + kills.clear(); + deaths.clear(); + } + + public static void addKill(UUID uuid){ + if(kills.containsKey(uuid.toString())){ + kills.put(uuid.toString(), kills.get(uuid.toString())+1); + } else { + kills.put(uuid.toString(), 1); + } + } + + public static void addDeath(UUID uuid){ + if(deaths.containsKey(uuid.toString())){ + deaths.put(uuid.toString(), deaths.get(uuid.toString())+1); + } else { + deaths.put(uuid.toString(), 1); + } + } + + public static Map getKills(){ + return new HashMap<>(kills); + } + + public static Map getDeaths(){ + return new HashMap<>(deaths); } public static void createLobbyBoard(Player player) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java index 35089e4..7d83217 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EventListener.java @@ -32,6 +32,7 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -148,93 +149,73 @@ public class EventListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onEntityDamage(EntityDamageEvent event) { - try { - if (event.getEntity() instanceof Player) { - Player player = (Player) event.getEntity(); - if (!Board.isPlayer(player)) { - if (event instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) event).getDamager(); - if (damager instanceof Player) { - if(Board.isPlayer(damager)){ - event.setCancelled(true); - return; - } - } - } - return; - } - if (Game.status != Status.PLAYING) { - event.setCancelled(true); - return; - } - Player attacker = null; - if (event instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) event).getDamager(); - if (damager instanceof Player) { - attacker = (Player) damager; - if (!Board.isPlayer(attacker)) event.setCancelled(true); - if (Board.onSameTeam(player, attacker)) event.setCancelled(true); - if (Board.isSpectator(player)) event.setCancelled(true); - } else if(damager instanceof Arrow){ - ProjectileSource source = ((Arrow) damager).getShooter(); - if(source instanceof Player){ - attacker = (Player) source; - if (!Board.isPlayer(attacker)) event.setCancelled(true); - if (Board.onSameTeam(player, attacker)) event.setCancelled(true); - if (Board.isSpectator(player)) event.setCancelled(true); - } - } - } - if(event.isCancelled()) return; - if (player.getHealth() - event.getFinalDamage() < 0.5 || !pvpEnabled) { - if (event instanceof EntityDamageByEntityEvent && !pvpEnabled) { - Entity damager = ((EntityDamageByEntityEvent) event).getDamager(); - if (damager instanceof Player) { - Player atacker = (Player) damager; - if(!Board.isSeeker(atacker)){ - event.setCancelled(true); - return; - } - } else { - event.setCancelled(true); - return; - } - } else if(!pvpEnabled) { - event.setCancelled(true); - return; - } - if (spawnPosition == null) return; - event.setCancelled(true); - if(Version.atLeast("1.9")) { - AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); - if (attribute != null) player.setHealth(attribute.getValue()); - } else { - player.setHealth(player.getMaxHealth()); - } - player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); - if(Version.atLeast("1.9")){ - XSound.ENTITY_PLAYER_DEATH.play(player, 1, 1); - } else { - XSound.ENTITY_PLAYER_HURT.play(player, 1, 1); - } - if (Board.isSeeker(player)) { - Game.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(player).toString()); - } - if (Board.isHider(player)) { - if (attacker == null) { - Game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); - } else { - Game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); - } - Board.addSeeker(player); - } - Game.resetPlayer(player); - Board.reloadBoardTeams(); - } + // If you are not a player, get out of here + if(!(event.getEntity() instanceof Player)) return; + // Define variables + Player player = (Player) event.getEntity(); + Player attacker = null; + // If player pvp is enabled, and player doesn't die, we do not care + if(pvpEnabled && player.getHealth() - event.getFinalDamage() >= 0.5){ return; } + // If no spawn position, we won't be able to manage their death :o + if(spawnPosition == null){ return; } + // If there is an attacker, find them + if (event instanceof EntityDamageByEntityEvent) { + if(((EntityDamageByEntityEvent) event).getDamager() instanceof Player) + attacker = (Player) ((EntityDamageByEntityEvent) event).getDamager(); + else if(((EntityDamageByEntityEvent) event).getDamager() instanceof Projectile) + if(((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter() instanceof Player) + attacker = (Player) ((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter(); + } + // Makes sure that if there was an attacking player, that the event is allowed for the game + if(attacker != null){ + // Cancel if one player is in the game but other isn't + if((Board.isPlayer(player) && !Board.isPlayer(attacker)) || (!Board.isPlayer(player) && Board.isPlayer(attacker))){ + event.setCancelled(true); + return; + // Ignore event if neither player are in the game + } else if(!Board.isPlayer(player) && !Board.isPlayer(attacker)){ + return; + // Ignore event if players are on the same team, or one of them is a spectator + } else if(Board.onSameTeam(player, attacker) || Board.isSpectator(player) || Board.isSpectator(attacker)){ + event.setCancelled(true); + return; + // Ignore the event if pvp is disabled, and a hider is trying to attack a seeker + } else if(!pvpEnabled && Board.isHider(attacker) && Board.isSeeker(player)){ + event.setCancelled(true); + return; + } + // If there is no attacker, it must of been by natural causes. If pvp is disabled, and config doesn't allow natural causes, cancel event. + } else if(!pvpEnabled && !allowNaturalCauses){ + event.setCancelled(true); + return; + } + // Handle death event + event.setCancelled(true); + // Reset health and play death effect + if(Version.atLeast("1.9")) { + AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); + if (attribute != null) player.setHealth(attribute.getValue()); + XSound.ENTITY_PLAYER_DEATH.play(player, 1, 1); + } else { + player.setHealth(player.getMaxHealth()); + XSound.ENTITY_PLAYER_HURT.play(player, 1, 1); + } + // Teleport player to seeker spawn + player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + // Broadcast player death message + if (Board.isSeeker(player)) { + Game.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(player).toString()); + } else if (Board.isHider(player)) { + if (attacker == null) { + Game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); + } else { + Game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); } - } catch (Exception e){ - Main.plugin.getLogger().severe("Entity Damage Event Error: " + e.getMessage()); + Board.addSeeker(player); } + // Add leaderboard stats + Board.addDeath(player.getUniqueId()); + if(attacker != null){ Board.addKill(attacker.getUniqueId()); } } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 16caee4..fb91a2f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -178,11 +178,11 @@ public class Game { List players = Board.getPlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList()); if(type == WinType.HIDER_WIN){ List winners = Board.getHiders().stream().map(Entity::getUniqueId).collect(Collectors.toList()); - Database.playerInfo.addWins(players, winners, type); + Database.playerInfo.addWins(players, winners, Board.getKills(), Board.getDeaths(), type); } else if(type == WinType.SEEKER_WIN){ List winners = new ArrayList<>(); winners.add(Board.getFirstSeeker().getUniqueId()); - Database.playerInfo.addWins(players, winners, type); + Database.playerInfo.addWins(players, winners, Board.getKills(), Board.getDeaths(), type); } worldBorder.resetWorldborder(getGameWorld()); for(Player player : Board.getPlayers()) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java new file mode 100644 index 0000000..c5d70bc --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java @@ -0,0 +1,128 @@ +package net.tylermurphy.hideAndSeek.util; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.tylermurphy.hideAndSeek.database.Database; +import net.tylermurphy.hideAndSeek.database.PlayerInfo; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Method; +import java.util.Locale; +import java.util.UUID; + +public class PAPIExpansion extends PlaceholderExpansion { + + @Override + public @NotNull String getIdentifier() { + return "kenshinshideandseek"; + } + + @Override + public @NotNull String getAuthor() { + return "KenshinEto"; + } + + @Override + public @NotNull String getVersion() { + return "1.4.3"; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public String onRequest(OfflinePlayer player, @NotNull String params) { + switch (params.toLowerCase(Locale.ROOT)) { + case "hs_stats_total-wins": + return hs_stats_total_wins(player.getUniqueId()); + case "hs_stats_hider-wins": + return hs_stats_hider_wins(player.getUniqueId()); + case "hs_stats_seeker-wins": + return hs_stats_seeker_wins(player.getUniqueId()); + case "hs_stats_total-games": + return hs_stats_total_games(player.getUniqueId()); + case "hs_stats_hider-games": + return hs_stats_hider_games(player.getUniqueId()); + case "hs_stats_seeker-games": + return hs_stats_seeker_games(player.getUniqueId()); + case "hs_stats_total-kills": + return hs_stats_total_kills(player.getUniqueId()); + case "hs_stats_hider-kills": + return hs_stats_hider_kills(player.getUniqueId()); + case "hs_stats_seeker-kills": + return hs_stats_seeker_kills(player.getUniqueId()); + case "hs_stats_total-deaths": + return hs_stats_total_deaths(player.getUniqueId()); + case "hs_stats_hider-deaths": + return hs_stats_hider_deaths(player.getUniqueId()); + case "hs_stats_seeker-deaths": + return hs_stats_seeker_deaths(player.getUniqueId()); + default: + return null; + } + } + + private String hs_stats_total_wins(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_wins + info.seeker_wins); + } + + private String hs_stats_hider_wins(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_wins); + } + + private String hs_stats_seeker_wins(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.seeker_wins); + } + + private String hs_stats_total_games(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_games + info.seeker_games); + } + + private String hs_stats_hider_games(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_games); + } + + private String hs_stats_seeker_games(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.seeker_games); + } + + private String hs_stats_total_kills(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_kills + info.seeker_kills); + } + + private String hs_stats_hider_kills(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_kills); + } + + private String hs_stats_seeker_kills(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.seeker_kills); + } + + private String hs_stats_total_deaths(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_deaths + info.seeker_deaths); + } + + private String hs_stats_hider_deaths(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.hider_deaths); + } + + private String hs_stats_seeker_deaths(UUID uuid){ + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return String.valueOf(info.seeker_deaths); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 88eab62..45261a3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -46,6 +46,13 @@ minPlayers: 2 # default: true pvp: true +# !! Only effects the game at all if pvp is set to false !! +# By default, If you disable pvp, Hiders and Seekers can no longer take damage from natural causes such as +# falling or projectiles. If you want, you can keep pvp disabled so that Seekers only have to tag Hiders, but +# all players can still take fall damage or any other damage that's not from another player. +# deafult: false +allowNaturalCauses: false + # Players that join the server will automatically be placed into the lobby. # default: false autoJoin: false -- cgit v1.2.3-freya From 5086fb4a007925e4edc236d80211f4a0288dfa82 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Mon, 9 May 2022 16:19:24 -0400 Subject: refactor placeholders --- .../hideAndSeek/configuration/Config.java | 6 +- .../hideAndSeek/database/PlayerInfoTable.java | 42 ++++- .../hideAndSeek/util/PAPIExpansion.java | 174 ++++++++++----------- .../tylermurphy/hideAndSeek/util/UUIDFetcher.java | 16 +- src/main/resources/config.yml | 6 + 5 files changed, 150 insertions(+), 94 deletions(-) (limited to 'src/main/resources/config.yml') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index f94ba0b..4a2ae3a 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -53,7 +53,9 @@ public class Config { exitWorld, lobbyWorld, locale, - leaveServer; + leaveServer, + placeholderError, + placeholderNoData; public static Vector spawnPosition, @@ -258,6 +260,8 @@ public class Config { locale = config.getString("locale", "local"); blockedCommands = config.getStringList("blockedCommands"); leaveOnEnd = config.getBoolean("leaveOnEnd"); + placeholderError = config.getString("placeholder.incorrect"); + placeholderNoData = config.getString("placeholder.noData"); try { countdownDisplay = CountdownDisplay.valueOf(config.getString("hideCountdownDisplay")); } catch (IllegalArgumentException e){ diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java index 06c036d..6948134 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java @@ -44,11 +44,11 @@ public class PlayerInfoTable { + " uuid BINARY(16) PRIMARY KEY,\n" + " hider_wins int NOT NULL,\n" + " seeker_wins int NOT NULL,\n" - + " hider_games int NOT NULL\n" - + " seeker_games int NOT NULL\n" - + " hider_kills int NOT NULL\n" - + " seeker_kills int NOT NULL\n" - + " hider_deaths int NOT NULL\n" + + " hider_games int NOT NULL,\n" + + " seeker_games int NOT NULL,\n" + + " hider_kills int NOT NULL,\n" + + " seeker_kills int NOT NULL,\n" + + " hider_deaths int NOT NULL,\n" + " seeker_deaths int NOT NULL\n" + ");"; @@ -123,6 +123,38 @@ public class PlayerInfoTable { return new PlayerInfo(uuid, 0, 0, 0, 0, 0, 0, 0, 0); } + @Nullable + public PlayerInfo getInfoRanking(String order, int place){ + String sql = "SELECT * FROM hs_data ORDER BY "+order+" DESC LIMIT 1 OFFSET ?;"; + try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ + statement.setInt(1, place-1); + ResultSet rs = statement.executeQuery(); + if(rs.next()){ + UUID uuid = decodeUUID(rs.getBytes("uuid")); + PlayerInfo info = new PlayerInfo( + uuid, + rs.getInt("hider_wins"), + rs.getInt("seeker_wins"), + rs.getInt("hider_games"), + rs.getInt("seeker_games"), + rs.getInt("hider_kills"), + rs.getInt("seeker_kills"), + rs.getInt("hider_deaths"), + rs.getInt("seeker_deaths") + ); + rs.close(); + connection.close(); + CACHE.put(uuid, info); + return info; + } + rs.close(); + } catch (SQLException e){ + Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); + e.printStackTrace(); + } + return null; + } + @Nullable public List getInfoPage(int page){ String sql = "SELECT * FROM hs_data ORDER BY (hider_wins + seeker_wins) DESC LIMIT 10 OFFSET ?;"; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java index c5d70bc..90f6432 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java @@ -1,21 +1,20 @@ package net.tylermurphy.hideAndSeek.util; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; + import me.clip.placeholderapi.expansion.PlaceholderExpansion; import net.tylermurphy.hideAndSeek.database.Database; import net.tylermurphy.hideAndSeek.database.PlayerInfo; import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.lang.reflect.Method; -import java.util.Locale; import java.util.UUID; public class PAPIExpansion extends PlaceholderExpansion { @Override public @NotNull String getIdentifier() { - return "kenshinshideandseek"; + return "hs"; } @Override @@ -35,94 +34,95 @@ public class PAPIExpansion extends PlaceholderExpansion { @Override public String onRequest(OfflinePlayer player, @NotNull String params) { - switch (params.toLowerCase(Locale.ROOT)) { - case "hs_stats_total-wins": - return hs_stats_total_wins(player.getUniqueId()); - case "hs_stats_hider-wins": - return hs_stats_hider_wins(player.getUniqueId()); - case "hs_stats_seeker-wins": - return hs_stats_seeker_wins(player.getUniqueId()); - case "hs_stats_total-games": - return hs_stats_total_games(player.getUniqueId()); - case "hs_stats_hider-games": - return hs_stats_hider_games(player.getUniqueId()); - case "hs_stats_seeker-games": - return hs_stats_seeker_games(player.getUniqueId()); - case "hs_stats_total-kills": - return hs_stats_total_kills(player.getUniqueId()); - case "hs_stats_hider-kills": - return hs_stats_hider_kills(player.getUniqueId()); - case "hs_stats_seeker-kills": - return hs_stats_seeker_kills(player.getUniqueId()); - case "hs_stats_total-deaths": - return hs_stats_total_deaths(player.getUniqueId()); - case "hs_stats_hider-deaths": - return hs_stats_hider_deaths(player.getUniqueId()); - case "hs_stats_seeker-deaths": - return hs_stats_seeker_deaths(player.getUniqueId()); + String[] args = params.split("_"); + System.out.println(); + if(args.length < 1) return null; + if(args[0].equals("stats") && args.length == 2){ + PlayerInfo info = Database.playerInfo.getInfo(player.getUniqueId()); + return getValue(info, args[1]); + } else if(args[0].equals("stats") && args.length == 3){ + UUID uuid; + try { uuid = UUIDFetcher.getUUID(args[2]); } catch (Exception e) { return placeholderError; } + PlayerInfo info = Database.playerInfo.getInfo(uuid); + return getValue(info, args[1]); + } else if(args[0].equals("rank") && args.length == 3){ + int place; + try { place = Integer.parseInt(args[2]); } catch (NumberFormatException e) { return placeholderError; } + if(place < 1) { return placeholderError; } + if(getRanking(args[1]) == null) { return placeholderError; } + PlayerInfo info = Database.playerInfo.getInfoRanking(getRanking(args[1]), place); + if(info == null) return placeholderNoData; + if(args[0].equals("rankStat")){ + return getValue(info, args[1]); + } else { + return UUIDFetcher.getPlayer(info.uuid).getName(); + } + } + return null; + } + + private String getValue(PlayerInfo info, String query){ + if(query == null) return null; + switch (query) { + case "total-wins": + return String.valueOf(info.hider_wins + info.seeker_wins); + case "hider-wins": + return String.valueOf(info.hider_wins); + case "seeker-wins": + return String.valueOf(info.seeker_wins); + case "total-games": + return String.valueOf(info.hider_games + info.seeker_games); + case "hider-games": + return String.valueOf(info.hider_games); + case "seeker-games": + return String.valueOf(info.seeker_games); + case "total-kills": + return String.valueOf(info.hider_kills + info.seeker_kills); + case "hider-kills": + return String.valueOf(info.hider_kills); + case "seeker-kills": + return String.valueOf(info.seeker_kills); + case "total-deaths": + return String.valueOf(info.hider_deaths + info.seeker_deaths); + case "hider-deaths": + return String.valueOf(info.hider_deaths); + case "seeker-deaths": + return String.valueOf(info.seeker_deaths); default: return null; } } - private String hs_stats_total_wins(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_wins + info.seeker_wins); - } - - private String hs_stats_hider_wins(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_wins); - } - - private String hs_stats_seeker_wins(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.seeker_wins); - } - - private String hs_stats_total_games(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_games + info.seeker_games); - } - - private String hs_stats_hider_games(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_games); - } - - private String hs_stats_seeker_games(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.seeker_games); - } - - private String hs_stats_total_kills(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_kills + info.seeker_kills); - } - - private String hs_stats_hider_kills(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_kills); - } - - private String hs_stats_seeker_kills(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.seeker_kills); - } - - private String hs_stats_total_deaths(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_deaths + info.seeker_deaths); - } - - private String hs_stats_hider_deaths(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.hider_deaths); - } - - private String hs_stats_seeker_deaths(UUID uuid){ - PlayerInfo info = Database.playerInfo.getInfo(uuid); - return String.valueOf(info.seeker_deaths); + private String getRanking(String query){ + if(query == null) return null; + switch (query) { + case "total-wins": + return "(hider_wins + seeker_wins)"; + case "hider-wins": + return "hider_wins"; + case "seeker-wins": + return "seeker_wins"; + case "total-games": + return "(hider_games + seeker_games)"; + case "hider-games": + return "hider_games"; + case "seeker-games": + return "seeker_games"; + case "total-kills": + return "(hider_kills + seeker_kills)"; + case "hider-kills": + return "hider_kills"; + case "seeker-kills": + return "seeker_kills"; + case "total-deaths": + return "(hider_deaths + seeker_deaths)"; + case "hider-deaths": + return "hider_deaths"; + case "seeker-deaths": + return "seeker_deaths"; + default: + return null; + } } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/UUIDFetcher.java b/src/main/java/net/tylermurphy/hideAndSeek/util/UUIDFetcher.java index ef65af3..4ab883d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/UUIDFetcher.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/UUIDFetcher.java @@ -20,6 +20,9 @@ package net.tylermurphy.hideAndSeek.util; import net.tylermurphy.hideAndSeek.Main; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -33,12 +36,16 @@ import java.util.UUID; public final class UUIDFetcher { private static final Map CACHE = new HashMap<>(); + private static final Map PLAYER_CACHE = new HashMap<>(); private static final String UUID_URL = "https://api.mojang.com/users/profiles/minecraft/"; private static int cacheTask; public static void init(){ - cacheTask = Main.plugin.getServer().getScheduler().scheduleSyncRepeatingTask(Main.plugin, CACHE::clear,600*20, 600*20); + cacheTask = Main.plugin.getServer().getScheduler().scheduleSyncRepeatingTask(Main.plugin, () -> { + CACHE.clear(); + PLAYER_CACHE.clear(); + }, 600 * 20, 600 * 20); } public static void cleanup(){ @@ -66,6 +73,13 @@ public final class UUIDFetcher { return UUID.fromString(uuid.toString()); } + public static OfflinePlayer getPlayer(UUID uuid){ + if(PLAYER_CACHE.containsKey(uuid)) return PLAYER_CACHE.get(uuid); + OfflinePlayer temp = Bukkit.getOfflinePlayer(uuid); + PLAYER_CACHE.put(uuid, temp); + return temp; + } + private static void readData(String toRead, StringBuilder result) { for (int i = toRead.length() - 3; i >= 0; i--) { if (toRead.charAt(i) != '"') { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 45261a3..75658b6 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -142,6 +142,12 @@ prefix: gameover: '&aGame Over > &f' warning: '&cWarning > &f' +# This plugin has support for custom placeholders with PlaceholderAPI. If you make a mistake when creating a placeholder, +# the plugin may tell you an error. Below you can change what could appear as an error message. +placeholder: + incorrect: "{Error}" + noData: "{No Data}" + # This is the section if you want a standard "waiting for players" lobby. You can specify # the standard countdown length under [countdown] (min 10 seconds). Then once the lobby gets to a size specified # by [changeCountdown], the timer will automatically go to 10 seconds. [min] is the minimum players -- cgit v1.2.3-freya From 99c1ea8eb34093f27c37d315e2bc447f93998287 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Fri, 13 May 2022 23:11:35 -0400 Subject: better spectator flight and teleporting --- .../hideAndSeek/configuration/Config.java | 70 ++++++++++----------- .../net/tylermurphy/hideAndSeek/game/Game.java | 2 +- .../hideAndSeek/game/listener/ChatHandler.java | 8 --- .../hideAndSeek/game/listener/DamageHandler.java | 4 +- .../hideAndSeek/game/listener/InteractHandler.java | 73 +++++++++++++++++++++- .../hideAndSeek/game/listener/MovementHandler.java | 35 ++++++++++- .../hideAndSeek/game/listener/PlayerHandler.java | 13 ---- .../hideAndSeek/game/util/PlayerUtil.java | 2 + src/main/resources/config.yml | 18 ++++++ src/main/resources/lang/localization_de-DE.yml | 2 + src/main/resources/lang/localization_en-US.yml | 2 + 11 files changed, 164 insertions(+), 65 deletions(-) (limited to 'src/main/resources/config.yml') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index afd1729..9fdaaa6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -31,6 +31,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -105,7 +106,9 @@ public class Config { seekerPingLevel2, seekerPingLevel3, lobbyItemLeavePosition, - lobbyItemStartPosition; + lobbyItemStartPosition, + flightToggleItemPosition, + teleportItemPosition; public static float seekerPingLeadingVolume, @@ -137,7 +140,9 @@ public class Config { public static ItemStack lobbyLeaveItem, lobbyStartItem, - glowPowerupItem; + glowPowerupItem, + flightToggleItem, + teleportItem; public static XSound ringingSound, @@ -218,14 +223,7 @@ public class Config { glowStackable = config.getBoolean("glow.stackable"); glowEnabled = config.getBoolean("glow.enabled") && Version.atLeast("1.9"); if (glowEnabled) { - ConfigurationSection item = new YamlConfiguration().createSection("temp"); - item.set("name", ChatColor.translateAlternateColorCodes('&',config.getString("glow.name"))); - item.set("material", config.getString("glow.material")); - List lore = config.getStringList("glow.lore"); - if (lore != null && !lore.isEmpty()) item.set("lore", lore); - ItemStack temp = null; - try{ temp = XItemStack.deserialize(item); } catch(Exception ignored) {} - glowPowerupItem = temp; + glowPowerupItem = createItemStack("glow"); } //Lobby @@ -302,38 +300,21 @@ public class Config { //Lobby Items if (config.getBoolean("lobbyItems.leave.enabled")) { - ConfigurationSection item = new YamlConfiguration().createSection("temp"); - item.set("name", ChatColor.translateAlternateColorCodes('&',config.getString("lobbyItems.leave.name"))); - item.set("material", config.getString("lobbyItems.leave.material")); - if (Version.atLeast("1.14")) { - if (config.contains("lobbyItems.leave.model-data") && config.getInt("lobbyItems.leave.model-data") != 0) { - item.set("model-data", config.getInt("lobbyItems.leave.model-data")); - } - } - List lore = config.getStringList("lobbyItems.leave.lore"); - if (lore != null && !lore.isEmpty()) item.set("lore", lore); - ItemStack temp = null; - try{ temp = XItemStack.deserialize(item); } catch(Exception ignored) {} - lobbyLeaveItem = temp; + lobbyLeaveItem = createItemStack("lobbyItems.leave"); lobbyItemLeavePosition = config.getInt("lobbyItems.leave.position"); } if (config.getBoolean("lobbyItems.start.enabled")) { - ConfigurationSection item = new YamlConfiguration().createSection("temp"); - item.set("name", ChatColor.translateAlternateColorCodes('&',config.getString("lobbyItems.start.name"))); - item.set("material", config.getString("lobbyItems.start.material")); - List lore = config.getStringList("lobbyItems.start.lore"); - if (lore != null && !lore.isEmpty()) item.set("lore", lore); - ItemStack temp = null; - try{ temp = XItemStack.deserialize(item); } catch(Exception ignored) {} - lobbyStartItem = temp; + lobbyStartItem = createItemStack("lobbyItems.start"); lobbyItemStartAdmin = config.getBoolean("lobbyItems.start.adminOnly"); lobbyItemStartPosition = config.getInt("lobbyItems.start.position"); - if (Version.atLeast("1.14")) { - if (config.contains("lobbyItems.start.model-data") && config.getInt("lobbyItems.start.model-data") != 0) { - item.set("model-data", config.getInt("lobbyItems.start.model-data")); - } - } } + + //Spectator Items + flightToggleItem = createItemStack("spectatorItems.flight"); + flightToggleItemPosition = config.getInt("spectatorItems.flight.position"); + + teleportItem = createItemStack("spectatorItems.teleport"); + teleportItemPosition = config.getInt("spectatorItems.teleport.position"); } public static void addToConfig(String path, Object value) { @@ -343,5 +324,22 @@ public class Config { public static void saveConfig() { config.saveConfig(); } + + @Nullable + private static ItemStack createItemStack(String path){ + ConfigurationSection item = new YamlConfiguration().createSection("temp"); + item.set("name", ChatColor.translateAlternateColorCodes('&',config.getString(path+".name"))); + item.set("material", config.getString(path+".material")); + if (Version.atLeast("1.14")) { + if (config.contains(path+".model-data") && config.getInt(path+".model-data") != 0) { + item.set("model-data", config.getInt(path+".model-data")); + } + } + List lore = config.getStringList(path+".lore"); + if (lore != null && !lore.isEmpty()) item.set("lore", lore); + ItemStack temp = null; + try{ temp = XItemStack.deserialize(item); } catch(Exception ignored) {} + return temp; + } } \ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index e33e503..15341c0 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -265,7 +265,6 @@ public class Game { } startingTimer--; } - checkWinConditions(); } @@ -308,6 +307,7 @@ public class Game { if (tauntEnabled) taunt.update(); if (glowEnabled) glow.update(); } + board.getSpectators().forEach(spectator -> spectator.setFlying(spectator.getAllowFlight())); checkWinConditions(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java index 07014b7..27a6235 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java @@ -11,14 +11,6 @@ public class ChatHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onChat(AsyncPlayerChatEvent event) { - if (event.getMessage().equals("fly")) { - event.getPlayer().setAllowFlight(true); - event.getPlayer().setFlying(true); - } - if (event.getMessage().equals("no fly")) { - event.getPlayer().setAllowFlight(false); - event.getPlayer().setFlying(false); - } if (Main.getInstance().getBoard().isSeeker(event.getPlayer())) { event.setCancelled(true); Main.getInstance().getBoard().getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage())); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java index aabbd92..ee63cc2 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java @@ -34,8 +34,6 @@ public class DamageHandler implements Listener { // Define variables Player player = (Player) event.getEntity(); Player attacker = null; - // If player pvp is enabled, and player doesn't die, we do not care - if (pvpEnabled && player.getHealth() - event.getFinalDamage() >= 0.5) { return; } // If no spawn position, we won't be able to manage their death :o if (spawnPosition == null) { return; } // If there is an attacker, find them @@ -84,6 +82,8 @@ public class DamageHandler implements Listener { event.setCancelled(true); return; } + // Check if player dies (pvp mode) + if(pvpEnabled && player.getHealth() - event.getFinalDamage() >= 0.5) return; // Handle death event event.setCancelled(true); // Play death effect diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java index bd2c7fe..7fe924f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java @@ -1,15 +1,23 @@ package net.tylermurphy.hideAndSeek.game.listener; import com.cryptomorin.xseries.XMaterial; +import com.cryptomorin.xseries.messages.ActionBar; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.ArrayList; +import java.util.List; import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.glowPowerupItem; @@ -30,15 +38,17 @@ public class InteractHandler implements Listener { onPlayerInteractLobby(temp, event); if (Main.getInstance().getGame().getStatus() == Status.PLAYING) onPlayerInteractGame(temp, event); + if (Main.getInstance().getBoard().isSpectator(event.getPlayer())) + onSpectatorInteract(temp, event); } private void onPlayerInteractLobby(ItemStack temp, PlayerInteractEvent event) { - if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(lobbyLeaveItem.getItemMeta().getDisplayName()) && temp.getType() == lobbyLeaveItem.getType()) { + if (temp.isSimilar(lobbyLeaveItem)) { event.setCancelled(true); Main.getInstance().getGame().leave(event.getPlayer()); } - if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(lobbyStartItem.getItemMeta().getDisplayName()) && temp.getType() == lobbyStartItem.getType() && event.getPlayer().hasPermission("hideandseek.start")) { + if (temp.isSimilar(lobbyStartItem) && event.getPlayer().hasPermission("hideandseek.start")) { event.setCancelled(true); if (Main.getInstance().getGame().isNotSetup()) { event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP")); @@ -57,7 +67,7 @@ public class InteractHandler implements Listener { } private void onPlayerInteractGame(ItemStack temp, PlayerInteractEvent event) { - if (temp.getItemMeta().getDisplayName().equalsIgnoreCase(glowPowerupItem.getItemMeta().getDisplayName()) && temp.getType() == glowPowerupItem.getType()) { + if (temp.isSimilar(glowPowerupItem)) { if (!glowEnabled) return; Player player = event.getPlayer(); if (Main.getInstance().getBoard().isHider(player)) { @@ -70,4 +80,61 @@ public class InteractHandler implements Listener { } } + private void onSpectatorInteract(ItemStack temp, PlayerInteractEvent event){ + if(temp.isSimilar(flightToggleItem)){ + boolean isFlying = event.getPlayer().getAllowFlight(); + event.getPlayer().setAllowFlight(!isFlying); + event.getPlayer().setFlying(!isFlying); + ActionBar.clearActionBar(event.getPlayer()); + if(!isFlying){ + ActionBar.sendActionBar(event.getPlayer(), message("FLYING_ENABLED").toString()); + } else { + ActionBar.sendActionBar(event.getPlayer(), message("FLYING_DISABLED").toString()); + } + return; + } + if(temp.isSimilar(teleportItem)){ + int amount = Main.getInstance().getBoard().getHiders().size() + Main.getInstance().getBoard().getSeekers().size(); + Inventory teleportMenu = Main.getInstance().getServer().createInventory(null, 9*(((amount-1)/9)+1), ChatColor.stripColor(teleportItem.getItemMeta().getDisplayName())); + List hider_lore = new ArrayList<>(); hider_lore.add(message("HIDER_TEAM_NAME").toString()); + Main.getInstance().getBoard().getHiders().forEach(hider -> { + teleportMenu.addItem(getSkull(hider, hider_lore)); + }); + List seeker_lore = new ArrayList<>(); seeker_lore.add(message("SEEKER_TEAM_NAME").toString()); + Main.getInstance().getBoard().getSeekers().forEach(seeker -> { + teleportMenu.addItem(getSkull(seeker, seeker_lore)); + }); + event.getPlayer().openInventory(teleportMenu); + } + } + + private ItemStack getSkull(Player player, List lore){ + assert XMaterial.PLAYER_HEAD.parseMaterial() != null; + ItemStack playerhead = new ItemStack(XMaterial.PLAYER_HEAD.parseMaterial(), 1); + SkullMeta playerheadmeta = (SkullMeta) playerhead.getItemMeta(); + playerheadmeta.setOwner(player.getName()); + playerheadmeta.setDisplayName(player.getName()); + playerheadmeta.setLore(lore); + playerhead.setItemMeta(playerheadmeta); + return playerhead; + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInventoryClick(InventoryClickEvent event) { + if (event.getWhoClicked() instanceof Player) { + Player player = (Player) event.getWhoClicked(); + if (Main.getInstance().getBoard().contains(player) && Main.getInstance().getGame().getStatus() == Status.STANDBY) { + event.setCancelled(true); + } + if (Main.getInstance().getBoard().isSpectator(player) && event.getCurrentItem().getType() == XMaterial.PLAYER_HEAD.parseMaterial()) { + event.setCancelled(true); + player.closeInventory(); + String name = event.getCurrentItem().getItemMeta().getDisplayName(); + Player clicked = Main.getInstance().getServer().getPlayer(name); + if(clicked == null) return; + player.teleport(clicked); + } + } + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java index 10872ad..aafc529 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java @@ -1,23 +1,54 @@ package net.tylermurphy.hideAndSeek.game.listener; +import com.comphenix.protocol.PacketType; +import com.google.common.collect.Sets; import net.tylermurphy.hideAndSeek.Main; +import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; +import java.util.Set; +import java.util.UUID; + import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.saveMaxZ; public class MovementHandler implements Listener { + private final Set prevPlayersOnGround = Sets.newHashSet(); + @EventHandler(priority = EventPriority.HIGHEST) public void onMove(PlayerMoveEvent event) { + if (event.getTo() == null || event.getTo().getWorld() == null) return; + + checkJumping(event); + checkBounds(event); + } + + private void checkJumping(PlayerMoveEvent event){ + if (!Main.getInstance().getBoard().isSpectator(event.getPlayer())) return; + if (event.getPlayer().getVelocity().getY() > 0) { + if (event.getPlayer().getLocation().getBlock().getType() != Material.LADDER && prevPlayersOnGround.contains(event.getPlayer().getUniqueId())) { + if (!event.getPlayer().isOnGround()) { + // JUMPING :o + if(event.getPlayer().getAllowFlight()) event.getPlayer().setFlying(true); + } + } + } + if (event.getPlayer().isOnGround()) { + prevPlayersOnGround.add(event.getPlayer().getUniqueId()); + } else { + prevPlayersOnGround.remove(event.getPlayer().getUniqueId()); + } + } + + private void checkBounds(PlayerMoveEvent event){ if (!Main.getInstance().getBoard().contains(event.getPlayer())) return; if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) return; - if (event.getPlayer().hasPermission("hideandseek.leavebounds")) return; - if (event.getTo() == null || event.getTo().getWorld() == null) return; if (!event.getTo().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) return; + if (event.getPlayer().hasPermission("hideandseek.leavebounds")) return; if (event.getTo().getBlockX() < saveMinX || event.getTo().getBlockX() > saveMaxX || event.getTo().getBlockZ() < saveMinZ || event.getTo().getBlockZ() > saveMaxZ) { event.setCancelled(true); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java index b63d982..d8790fd 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java @@ -1,15 +1,12 @@ package net.tylermurphy.hideAndSeek.game.listener; import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.game.Game; -import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; -import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerDropItemEvent; public class PlayerHandler implements Listener { @@ -32,16 +29,6 @@ public class PlayerHandler implements Listener { } } - @EventHandler(priority = EventPriority.HIGHEST) - public void onInventoryClick(InventoryClickEvent event) { - if (event.getWhoClicked() instanceof Player) { - Player player = (Player) event.getWhoClicked(); - if (Main.getInstance().getBoard().contains(player) && Main.getInstance().getGame().getStatus() == Status.STANDBY) { - event.setCancelled(true); - } - } - } - @EventHandler(priority = EventPriority.HIGHEST) public void onItemDrop(PlayerDropItemEvent event) { if (Main.getInstance().getBoard().contains(event.getPlayer())) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java index 61d2b0e..59c7b73 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/PlayerUtil.java @@ -43,6 +43,8 @@ public class PlayerUtil { player.setAllowFlight(true); player.setFlying(true); player.setFallDistance(0.0F); + player.getInventory().setItem(flightToggleItemPosition, flightToggleItem); + player.getInventory().setItem(teleportItemPosition, teleportItem); Main.getInstance().getBoard().getPlayers().forEach(otherPlayer -> { otherPlayer.hidePlayer(player); }); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 75658b6..c509200 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -130,6 +130,7 @@ glow: name: "Glow Powerup" lore: [ "Throw to make all seekers glow", "Last 30s, all hiders can see it", "Time stacks on multi use" ] material: SNOWBALL + model-data: 0 # The message prefixes displayed before messages. The message contents themselves # can be changed in localization.yml. @@ -182,6 +183,23 @@ lobbyItems: enabled: true adminOnly: true +# Below are the two items given to you when you join the game as a spectator. One toggles flight mode, and the other +# opens a gui to teleport to other players! Just like the lobby items, you can customize the material, name, lore, +# and position of the item. You can also change the model data if your server is running 1.14 or above. +spectatorItems: + flight: + material: FEATHER + name: "&bToggle Flight" + lore: [ "Turns flying on and off" ] + position: 3 + model-data: 0 + teleport: + material: COMPASS + name: "&bTeleport to Others" + lore: [ "Allows you to teleport to all other players in game" ] + position: 5 + model-data: 0 + # As a hider, the closer a seeker gets to you, the louder and faster a pining noise will play. # There are 3 separate distances (in blocks) you can set to the 3 different levels for the noise. # The higher the level, the closer the seeker. diff --git a/src/main/resources/lang/localization_de-DE.yml b/src/main/resources/lang/localization_de-DE.yml index fec12ba..84ada18 100644 --- a/src/main/resources/lang/localization_de-DE.yml +++ b/src/main/resources/lang/localization_de-DE.yml @@ -70,6 +70,8 @@ Localization: NO_GAME_INFO: "Keine Informationen zum Gameplay für diesen Spieler vorhanden." INFORMATION_FOR: "Gewinninformationen für {PLAYER}:" BLOCKED_COMMAND: "Command blocked by Kenshin's Hide And Seek" + FLYING_ENABLED: "Fliegen aktiviert" + FLYING_DISABLED: "Fliegen deaktiviert" # DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE version: 3 diff --git a/src/main/resources/lang/localization_en-US.yml b/src/main/resources/lang/localization_en-US.yml index 1115fc4..07d547b 100644 --- a/src/main/resources/lang/localization_en-US.yml +++ b/src/main/resources/lang/localization_en-US.yml @@ -71,6 +71,8 @@ Localization: NO_GAME_INFO: "Player has no gameplay information." INFORMATION_FOR: "Win information for {PLAYER}:" BLOCKED_COMMAND: "Command blocked by Hide And Seek plugin." + FLYING_ENABLED: "&l&bFlying Enabled" + FLYING_DISABLED: "&l&bFlying Disabled" # DO NOT EDIT IT OR IT MAY BREAK OR RESET FILE version: 3 -- cgit v1.2.3-freya From 99d31ff71cecb0de3eac175384d9b55312a8a619 Mon Sep 17 00:00:00 2001 From: bobby29831 Date: Sat, 14 May 2022 08:47:54 -0500 Subject: refactor: clean up typos, improperly named variables --- .github/workflows/beta.yml | 2 +- .../tylermurphy/hideAndSeek/command/SetBorder.java | 32 ++++++++++---------- .../command/location/SetSpawnLocation.java | 2 +- .../hideAndSeek/configuration/Config.java | 34 +++++++++++----------- .../net/tylermurphy/hideAndSeek/game/Board.java | 6 ++-- .../net/tylermurphy/hideAndSeek/game/Game.java | 14 ++++----- .../hideAndSeek/game/events/Border.java | 28 +++++++++--------- .../hideAndSeek/util/CommandHandler.java | 2 +- src/main/resources/config.yml | 4 +-- src/main/resources/plugin.yml | 2 +- 10 files changed, 63 insertions(+), 63 deletions(-) (limited to 'src/main/resources/config.yml') diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index 5cf7218..80db5b7 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -30,7 +30,7 @@ jobs: key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-m2 - - name: Upload artificats + - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: artifacts-beta diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java index 8114838..3286c74 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java @@ -40,7 +40,7 @@ public class SetBorder implements ICommand { return; } if (args.length < 3) { - worldborderEnabled = false; + worldBorderEnabled = false; addToConfig("worldBorder.enabled",false); saveConfig(); sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE")); @@ -68,26 +68,26 @@ public class SetBorder implements ICommand { sender.sendMessage(errorPrefix + message("WORLDBORDER_CHANGE_SIZE")); return; } - Vector newWorldborderPosition = new Vector(); + Vector vec = new Vector(); Player player = (Player) sender; - newWorldborderPosition.setX(player.getLocation().getBlockX()); - newWorldborderPosition.setY(0); - newWorldborderPosition.setZ(player.getLocation().getBlockZ()); - if (spawnPosition.distance(newWorldborderPosition) > 100) { + vec.setX(player.getLocation().getBlockX()); + vec.setY(0); + vec.setZ(player.getLocation().getBlockZ()); + if (spawnPosition.distance(vec) > 100) { sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION")); return; } - worldborderPosition = newWorldborderPosition; - worldborderSize = num; - worldborderDelay = delay; - worldborderChange = change; - worldborderEnabled = true; - addToConfig("worldBorder.x", worldborderPosition.getBlockX()); - addToConfig("worldBorder.z", worldborderPosition.getBlockZ()); - addToConfig("worldBorder.delay", worldborderDelay); - addToConfig("worldBorder.size", worldborderSize); + worldBorderPosition = vec; + worldBorderSize = num; + worldBorderDelay = delay; + worldBorderChange = change; + worldBorderEnabled = true; + addToConfig("worldBorder.x", worldBorderPosition.getBlockX()); + addToConfig("worldBorder.z", worldBorderPosition.getBlockZ()); + addToConfig("worldBorder.delay", worldBorderDelay); + addToConfig("worldBorder.size", worldBorderSize); addToConfig("worldBorder.enabled", true); - addToConfig("worldBorder.move", worldborderChange); + addToConfig("worldBorder.move", worldBorderChange); sender.sendMessage(messagePrefix + message("WORLDBORDER_ENABLE").addAmount(num).addAmount(delay)); saveConfig(); Main.getInstance().getGame().getBorder().resetWorldBorder(spawnWorld); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java index d96252d..1f454d6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java @@ -36,7 +36,7 @@ public class SetSpawnLocation implements ICommand { Player player = (Player) sender; LocationUtils.setLocation(player, Locations.GAME, vector -> { - if (worldborderEnabled && vector.distance(worldborderPosition) > 100) { + if (worldBorderEnabled && vector.distance(worldBorderPosition) > 100) { sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION")); throw new RuntimeException("World border not enabled or not in valid position!"); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 9fdaaa6..7ed8454 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -46,9 +46,9 @@ public class Config { messagePrefix, errorPrefix, tauntPrefix, - worldborderPrefix, + worldBorderPrefix, abortPrefix, - gameoverPrefix, + gameOverPrefix, warningPrefix, spawnWorld, exitWorld, @@ -62,13 +62,13 @@ public class Config { spawnPosition, lobbyPosition, exitPosition, - worldborderPosition; + worldBorderPosition; - public static boolean - nametagsVisible, + public static boolean + nameTagsVisible, permissionsRequired, announceMessagesToNonPlayers, - worldborderEnabled, + worldBorderEnabled, tauntEnabled, tauntCountdown, tauntLast, @@ -87,10 +87,10 @@ public class Config { public static int minPlayers, - worldborderSize, - worldborderDelay, + worldBorderSize, + worldBorderDelay, currentWorldborderSize, - worldborderChange, + worldBorderChange, gameLength, saveMinX, saveMinZ, @@ -183,15 +183,15 @@ public class Config { exitWorld = config.getString("spawns.exit.world"); //World border - worldborderPosition = new Vector( + worldBorderPosition = new Vector( config.getInt("worldBorder.x"), 0, config.getInt("worldBorder.z") ); - worldborderSize = Math.max(100, config.getInt("worldBorder.size")); - worldborderDelay = Math.max(1, config.getInt("worldBorder.delay")); - worldborderEnabled = config.getBoolean("worldBorder.enabled"); - worldborderChange = config.getInt("worldBorder.moveAmount"); + worldBorderSize = Math.max(100, config.getInt("worldBorder.size")); + worldBorderDelay = Math.max(1, config.getInt("worldBorder.delay")); + worldBorderEnabled = config.getBoolean("worldBorder.enabled"); + worldBorderChange = config.getInt("worldBorder.moveAmount"); //Prefix char SYMBOLE = '\u00A7'; @@ -200,9 +200,9 @@ public class Config { messagePrefix = config.getString("prefix.default").replace("&", SYMBOLE_STRING); errorPrefix = config.getString("prefix.error").replace("&", SYMBOLE_STRING); tauntPrefix = config.getString("prefix.taunt").replace("&", SYMBOLE_STRING); - worldborderPrefix = config.getString("prefix.border").replace("&", SYMBOLE_STRING); + worldBorderPrefix = config.getString("prefix.border").replace("&", SYMBOLE_STRING); abortPrefix = config.getString("prefix.abort").replace("&", SYMBOLE_STRING); - gameoverPrefix = config.getString("prefix.gameover").replace("&", SYMBOLE_STRING); + gameOverPrefix = config.getString("prefix.gameover").replace("&", SYMBOLE_STRING); warningPrefix = config.getString("prefix.warning").replace("&", SYMBOLE_STRING); //Map Bounds @@ -248,7 +248,7 @@ public class Config { ringingSound = ringingOptional.orElse(XSound.BLOCK_NOTE_BLOCK_PLING); //Other - nametagsVisible = config.getBoolean("nametagsVisible"); + nameTagsVisible = config.getBoolean("nametagsVisible"); permissionsRequired = config.getBoolean("permissionsRequired"); gameLength = config.getInt("gameLength"); pvpEnabled = config.getBoolean("pvp"); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index 41950a1..876cb42 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -265,7 +265,7 @@ public class Board { String value = getTeam(player); board.setLine(String.valueOf(i), line.replace("{TEAM}", value)); } else if (line.contains("{BORDER}")) { - if (!worldborderEnabled) continue; + if (!worldBorderEnabled) continue; if (worldBorder == null || status == Status.STARTING) { board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replace("{AMOUNT}", "0"))); } else if (!worldBorder.isRunning()) { @@ -401,7 +401,7 @@ class CustomBoard { for(Player player : Main.getInstance().getBoard().getSeekers()) seekerTeam.addEntry(player.getName()); if (Version.atLeast("1.9")) { - if (nametagsVisible) { + 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 { @@ -409,7 +409,7 @@ class CustomBoard { seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER); } } else { - if (nametagsVisible) { + if (nameTagsVisible) { hiderTeam.setNameTagVisibility(NameTagVisibility.HIDE_FOR_OTHER_TEAMS); seekerTeam.setNameTagVisibility(NameTagVisibility.HIDE_FOR_OWN_TEAM); } else { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 15341c0..e81d0e5 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -303,7 +303,7 @@ public class Game { board.reloadGameBoards(); gameTimer--; } - if (worldborderEnabled) worldBorder.update(); + if (worldBorderEnabled) worldBorder.update(); if (tauntEnabled) taunt.update(); if (glowEnabled) glow.update(); } @@ -336,12 +336,12 @@ public class Game { private void checkWinConditions() { if (board.sizeHider() < 1) { if (hiderLeft) { - if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); - else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); + else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_QUIT")); stop(WinType.NONE); } else { - if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); - else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); + else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_HIDERS_FOUND")); stop(WinType.SEEKER_WIN); } } else if (board.sizeSeeker() < 1) { @@ -349,8 +349,8 @@ public class Game { else broadcastMessage(abortPrefix + message("GAME_GAMEOVER_SEEKERS_QUIT")); stop(WinType.NONE); } else if (gameTimer < 1) { - if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_TIME")); - else broadcastMessage(gameoverPrefix + message("GAME_GAMEOVER_TIME")); + if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_TIME")); + else broadcastMessage(gameOverPrefix + message("GAME_GAMEOVER_TIME")); stop(WinType.HIDER_WIN); } hiderLeft = false; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java index aa6beca..647c4b6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java @@ -13,31 +13,31 @@ public class Border { private boolean running; public Border() { - delay = 60 * worldborderDelay; + delay = 60 * worldBorderDelay; } public void update() { if (delay == 30 && !running) { - Main.getInstance().getGame().broadcastMessage(worldborderPrefix + message("WORLDBORDER_WARN")); + Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_WARN")); } else if (delay == 0) { if (running) { - delay = 60 * worldborderDelay; + delay = 60 * worldBorderDelay; running = false; } - else decreaceWorldborder(); + else decreaseWorldBorder(); } delay--; } - private void decreaceWorldborder() { + private void decreaseWorldBorder() { if (currentWorldborderSize == 100) return; - int change = worldborderChange; - if (currentWorldborderSize-worldborderChange < 100) { + int change = worldBorderChange; + if (currentWorldborderSize-worldBorderChange < 100) { change = currentWorldborderSize-100; } running = true; - Main.getInstance().getGame().broadcastMessage(worldborderPrefix + message("WORLDBORDER_DECREASING").addAmount(change)); - currentWorldborderSize -= worldborderChange; + Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_DECREASING").addAmount(change)); + currentWorldborderSize -= worldBorderChange; World world = Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()); assert world != null; org.bukkit.WorldBorder border = world.getWorldBorder(); @@ -49,15 +49,15 @@ public class Border { World world = Bukkit.getWorld(worldName); assert world != null; org.bukkit.WorldBorder border = world.getWorldBorder(); - if (worldborderEnabled) { - border.setSize(worldborderSize); - border.setCenter(worldborderPosition.getX(), worldborderPosition.getZ()); - currentWorldborderSize = worldborderSize; + if (worldBorderEnabled) { + border.setSize(worldBorderSize); + border.setCenter(worldBorderPosition.getX(), worldBorderPosition.getZ()); + currentWorldborderSize = worldBorderSize; } else { border.setSize(30000000); border.setCenter(0, 0); } - delay = 60 * worldborderDelay; + delay = 60 * worldBorderDelay; } public int getDelay() { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java index 3a05ee5..6034607 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java @@ -82,7 +82,7 @@ public class CommandHandler { try { COMMAND_REGISTER.get(args[0].toLowerCase()).execute(sender,Arrays.copyOfRange(args, 1, args.length)); } catch (Exception e) { - sender.sendMessage(errorPrefix + "An error has occured."); + sender.sendMessage(errorPrefix + "An error has occurred."); e.printStackTrace(); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c509200..2d76b4a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -94,8 +94,8 @@ leaveServer: hub # default: true mapSaveEnabled: true -# The worldborder closes every interval, which is evey [delay] in minutes. -# Thw worldborder starts at [size], and decreases 100 blocks every interval. +# The world border closes every interval, which is evey [delay] in minutes. +# Thw world border starts at [size], and decreases 100 blocks every interval. # x & z are the center location. [enabled] is whenever the border is enabled. # You can choose if Hiders are warned 30 seconds before the border moves. worldBorder: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 93fec0d..b9ad408 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -42,7 +42,7 @@ permissions: description: Allows you to reload the config default: op hideandseek.setborder: - description: Allows you to set the game worldborder + description: Allows you to set the game world border default: op hideandseek.setspawn: description: Allows you to set the game spawn point -- cgit v1.2.3-freya From 13e6b38aa97f59e5a432f2d88ea15738358df019 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Tue, 17 May 2022 19:26:00 -0400 Subject: mysql support, always glow, countdown_last, kill stat change, game board null fix --- pom.xml | 6 ++-- .../net/tylermurphy/hideAndSeek/command/Top.java | 9 ++++- .../net/tylermurphy/hideAndSeek/command/Wins.java | 20 +++++------ .../hideAndSeek/configuration/Config.java | 25 +++++++++++-- .../hideAndSeek/configuration/ConfigManager.java | 4 +++ .../hideAndSeek/configuration/Localization.java | 24 +++++++++---- .../tylermurphy/hideAndSeek/database/Database.java | 9 ++++- .../database/connections/MySQLConnection.java | 16 ++++----- .../net/tylermurphy/hideAndSeek/game/Board.java | 6 ++-- .../net/tylermurphy/hideAndSeek/game/Game.java | 6 ++-- .../tylermurphy/hideAndSeek/game/events/Glow.java | 7 ++-- .../hideAndSeek/game/listener/DamageHandler.java | 11 +++--- .../game/listener/JoinLeaveHandler.java | 4 +-- .../hideAndSeek/util/PAPIExpansion.java | 37 ++++++++++--------- src/main/resources/config.yml | 28 +++++++++++++++ src/main/resources/lang/localization_de-DE.yml | 1 + src/main/resources/lang/localization_en-US.yml | 1 + src/test/java/MainTest.java | 42 ---------------------- 18 files changed, 146 insertions(+), 110 deletions(-) delete mode 100644 src/test/java/MainTest.java (limited to 'src/main/resources/config.yml') diff --git a/pom.xml b/pom.xml index fff9f6c..b72260d 100644 --- a/pom.xml +++ b/pom.xml @@ -41,8 +41,10 @@ *:* META-INF/*.MF - META-INF/*.md - META-INF + META-INF/*.MD + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA sqlite-jdbc.properties diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java index caa751b..9b55c9f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java @@ -22,6 +22,7 @@ package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.database.util.PlayerInfo; import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import java.util.List; @@ -54,7 +55,13 @@ public class Top implements ICommand { return; } for(PlayerInfo info : infos) { - String name = Main.getInstance().getServer().getOfflinePlayer(info.getUniqueId()).getName(); + OfflinePlayer temp = Main.getInstance().getServer().getOfflinePlayer(info.getUniqueId()); + String name; + if(temp == null){ + name = Main.getInstance().getDatabase().getNameData().getName(info.getUniqueId()); + } else { + name = temp.getName(); + } ChatColor color; switch (i) { case 1: color = ChatColor.YELLOW; break; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java index 8a0b6dc..491c9a4 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java @@ -37,23 +37,21 @@ public class Wins implements ICommand { UUID uuid; String name; if (args.length == 0) { - Player player = Main.getInstance().getServer().getPlayer(sender.getName()); - if (player == null) { - sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(sender.getName())); - return; - } - uuid = player.getUniqueId(); + uuid = sender.getUniqueId(); name = sender.getName(); } else { - try { - name = args[0]; + name = args[0]; + if(Main.getInstance().getServer().getOfflinePlayer(args[0]) == null){ + uuid = Main.getInstance().getDatabase().getNameData().getUUID(args[0]); + } else { uuid = Main.getInstance().getServer().getOfflinePlayer(args[0]).getUniqueId(); - } catch (Exception e) { - sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(args[0])); - return; } } + if(uuid == null){ + sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(args[0])); + return; + } PlayerInfo info = Main.getInstance().getDatabase().getGameData().getInfo(uuid); if (info == null) { sender.sendMessage(errorPrefix + message("NO_GAME_INFO")); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 03d7504..4aeac68 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -55,7 +55,13 @@ public class Config { locale, leaveServer, placeholderError, - placeholderNoData; + placeholderNoData, + databaseType, + databaseHost, + databasePort, + databaseUser, + databasePass, + databaseName; public static Vector spawnPosition, @@ -71,6 +77,7 @@ public class Config { tauntEnabled, tauntCountdown, tauntLast, + alwaysGlow, glowEnabled, glowStackable, pvpEnabled, @@ -218,9 +225,10 @@ public class Config { tauntLast = config.getBoolean("taunt.whenLastPerson"); //Glow + alwaysGlow = config.getBoolean("alwaysGlow") && Main.getInstance().supports(9); glowLength = Math.max(1, config.getInt("glow.time")); glowStackable = config.getBoolean("glow.stackable"); - glowEnabled = config.getBoolean("glow.enabled") && Main.getInstance().supports(9); + glowEnabled = config.getBoolean("glow.enabled") && Main.getInstance().supports(9) && !alwaysGlow; if (glowEnabled) { glowPowerupItem = createItemStack("glow"); } @@ -314,6 +322,19 @@ public class Config { teleportItem = createItemStack("spectatorItems.teleport"); teleportItemPosition = config.getInt("spectatorItems.teleport.position"); + + //Database + databaseHost = config.getString("databaseHost"); + databasePort = config.getString("databasePort"); + databaseUser = config.getString("databaseUser"); + databasePass = config.getString("databasePass"); + databaseName = config.getString("databaseName"); + + databaseType = config.getString("databaseType").toUpperCase(); + if(!databaseType.equals("SQLITE") && !databaseType.equals("MYSQL")){ + Main.getInstance().getLogger().warning("databaseType: "+databaseType+" is not a valid configuration option!"); + databaseType = "SQLITE"; + } } public static void addToConfig(String path, Object value) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java index f02eaba..381a41c 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java @@ -205,6 +205,10 @@ public class ConfigManager { } } + public ConfigurationSection getDefaultConfigurationSection(String path) { + return defaultConfig.getConfigurationSection(path); + } + public void set(String path, Object value) { config.set(path, value); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java index be60b61..9418414 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java @@ -28,6 +28,7 @@ import java.util.Map; public class Localization { public static final Map LOCAL = new HashMap<>(); + public static final Map DEFAULT_LOCAL = new HashMap<>(); private static final Map CHANGES = new HashMap() {{ put("en-US", new String[][]{{"WORLDBORDER_DECREASING"},{"START","TAUNTED"}}); @@ -61,17 +62,28 @@ public class Localization { for(String key : manager.getConfigurationSection("Localization").getKeys(false)) { LOCAL.put( - key, + key, new LocalizationString( ChatColor.translateAlternateColorCodes('&', manager.getString("Localization."+key) ) ) - ); + ); + } + + for(String key : manager.getDefaultConfigurationSection("Localization").getKeys(false)) { + DEFAULT_LOCAL.put( + key, + new LocalizationString( ChatColor.translateAlternateColorCodes('&', manager.getString("Localization."+key) ) ) + ); } } public static LocalizationString message(String key) { - LocalizationString temp = LOCAL.get(key); - if (temp == null) { - return new LocalizationString(ChatColor.RED + "" + ChatColor.ITALIC + key + " is not found in localization.yml. This is a plugin issue, please report it."); + LocalizationString message = LOCAL.get(key); + if (message == null) { + LocalizationString defaultMessage = DEFAULT_LOCAL.get(key); + if(defaultMessage == null) { + 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(defaultMessage.toString()); } - return new LocalizationString(temp.toString()); + return new LocalizationString(message.toString()); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java index 0eceb98..0489b5d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java @@ -22,6 +22,7 @@ package net.tylermurphy.hideAndSeek.database; import com.google.common.io.ByteStreams; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.database.connections.DatabaseConnection; +import net.tylermurphy.hideAndSeek.database.connections.MySQLConnection; import net.tylermurphy.hideAndSeek.database.connections.SQLiteConnection; import java.io.ByteArrayInputStream; @@ -32,6 +33,8 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.UUID; +import static net.tylermurphy.hideAndSeek.configuration.Config.databaseType; + public class Database { private final GameDataTable playerInfo; @@ -40,7 +43,11 @@ public class Database { public Database(){ - connection = new SQLiteConnection(); + if(databaseType.equals("SQLITE")) { + connection = new SQLiteConnection(); + } else { + connection = new MySQLConnection(); + } playerInfo = new GameDataTable(this); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java index c29d1b3..b7c1b1d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java @@ -25,26 +25,22 @@ import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.SQLException; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; + public class MySQLConnection implements DatabaseConnection { - private final HikariConfig config; private final HikariDataSource ds; public MySQLConnection(){ - String host = "to be implemented"; - String port = "to be implemented"; - String user = "to be implemented"; - String pass = "to be implemented"; - - config = new HikariConfig(); + HikariConfig config = new HikariConfig(); - config.setJdbcUrl("jdbc:mariadb://"+host+":"+port+"/kenbot"); + config.setJdbcUrl("jdbc:mariadb://"+databaseHost+":"+databasePort+"/"+databaseName); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - config.addDataSourceProperty("user", user); - config.addDataSourceProperty("password",pass); + config.addDataSourceProperty("user", databaseUser); + config.addDataSourceProperty("password",databasePass); config.addDataSourceProperty("autoCommit", "true"); config.setAutoCommit(true); config.setMaximumPoolSize(20); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index 04b0d37..a8e41c7 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -153,7 +153,7 @@ public class Board { } else { hider_kills.put(uuid.toString(), 1); } - } else if (getFirstSeeker().getUniqueId().equals(uuid)) { + } else if (Seeker.contains(uuid.toString())) { if (seeker_kills.containsKey(uuid.toString())) { seeker_kills.put(uuid.toString(), seeker_kills.get(uuid.toString())+1); } else { @@ -169,7 +169,7 @@ public class Board { } else { hider_deaths.put(uuid.toString(), 1); } - } else if (getFirstSeeker().getUniqueId().equals(uuid)) { + } else if (Seeker.contains(uuid.toString())) { if (seeker_deaths.containsKey(uuid.toString())) { seeker_deaths.put(uuid.toString(), seeker_deaths.get(uuid.toString())+1); } else { @@ -234,7 +234,7 @@ public class Board { private void createGameBoard(Player player, boolean recreate) { CustomBoard board = customBoards.get(player.getUniqueId().toString()); - if (recreate) { + if (recreate || board == null) { board = new CustomBoard(player, GAME_TITLE); board.updateTeams(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index c261b52..cb3ad1f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -242,12 +242,14 @@ public class Game { private void whileStarting() { if(gameTick % 20 == 0) { - if (startingTimer % 5 == 0 || startingTimer < 4) { + if (startingTimer % 5 == 0 || startingTimer < 5) { String message; if (startingTimer == 0) { message = message("START").toString(); status = Status.PLAYING; board.getPlayers().forEach(player -> PlayerLoader.resetPlayer(player, board)); + } else if (startingTimer == 1){ + message = message("START_COUNTDOWN_LAST").addAmount(startingTimer).toString(); } else { message = message("START_COUNTDOWN").addAmount(startingTimer).toString(); } @@ -305,7 +307,7 @@ public class Game { } if (worldBorderEnabled) worldBorder.update(); if (tauntEnabled) taunt.update(); - if (glowEnabled) glow.update(); + if (glowEnabled || alwaysGlow) glow.update(); } board.getSpectators().forEach(spectator -> spectator.setFlying(spectator.getAllowFlight())); checkWinConditions(); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java index a1d7295..8631ef5 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java @@ -10,8 +10,7 @@ import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; -import static net.tylermurphy.hideAndSeek.configuration.Config.glowLength; -import static net.tylermurphy.hideAndSeek.configuration.Config.glowStackable; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; public class Glow { @@ -37,6 +36,10 @@ public class Glow { } public void update() { + if(alwaysGlow){ + sendPackets(); + return; + } if (running) { sendPackets(); glowTime--; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java index 701f446..3b90d39 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java @@ -96,21 +96,18 @@ public class DamageHandler implements Listener { // Broadcast player death message if (board.isSeeker(player)) { game.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(player).toString()); - if (board.getFirstSeeker().getName().equals(player.getName())) { - board.addDeath(player.getUniqueId()); - } } else if (board.isHider(player)) { if (attacker == null) { game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); } else { game.broadcastMessage(message("GAME_PLAYER_FOUND_BY").addPlayer(player).addPlayer(attacker).toString()); } - board.addDeath(player.getUniqueId()); board.addSeeker(player); } - // Add leaderboard kills if attacker - if (attacker != null && ( board.isHider(attacker) || board.getFirstSeeker().getName().equals(attacker.getName()) ) ) - board.addKill(attacker.getUniqueId()); + // Add leaderboard stats + board.addDeath(player.getUniqueId()); + if (attacker != null) board.addKill(attacker.getUniqueId()); + //Reload player PlayerLoader.resetPlayer(player, board); board.reloadBoardTeams(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java index 094ff68..7ac4f85 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java @@ -23,8 +23,8 @@ public class JoinLeaveHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerJoin(PlayerJoinEvent event) { - if(!Main.getInstance().getDatabase().getNameData().update(event.getPlayer().getUniqueId(), event.getPlayer().getDisplayName())){ - Main.getInstance().getLogger().warning("Failed to save name data for user: " + event.getPlayer().getDisplayName()); + if(!Main.getInstance().getDatabase().getNameData().update(event.getPlayer().getUniqueId(), event.getPlayer().getName())){ + Main.getInstance().getLogger().warning("Failed to save name data for user: " + event.getPlayer().getName()); } Main.getInstance().getBoard().remove(event.getPlayer()); removeItems(event.getPlayer()); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java index 72d1f4d..7823fe9 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java @@ -39,15 +39,17 @@ public class PAPIExpansion extends PlaceholderExpansion { Database database = Main.getInstance().getDatabase(); String[] args = params.split("_"); if (args.length < 1) return null; - if (args[0].equals("stats") && args.length == 2) { - PlayerInfo info = database.getGameData().getInfo(player.getUniqueId()); + if (args[0].equals("stats") && (args.length == 2 || args.length == 3)) { + PlayerInfo info = null; + if(args.length == 2) { + database.getGameData().getInfo(player.getUniqueId()); + } else { + UUID uuid; + try { uuid = Main.getInstance().getServer().getOfflinePlayer(args[2]).getUniqueId(); } catch (Exception e) { return placeholderError; } + info = database.getGameData().getInfo(uuid); + } if (info == null) return placeholderNoData; return getValue(info, args[1]); - } else if (args[0].equals("stats") && args.length == 3) { - UUID uuid; - try { uuid = Main.getInstance().getServer().getOfflinePlayer(args[2]).getUniqueId(); } catch (Exception e) { return placeholderError; } - PlayerInfo info = database.getGameData().getInfo(uuid); - return getValue(info, args[1]); } else if ((args[0].equals("rank-score") || args[0].equals("rank-name") ) && args.length == 3) { int place; try { place = Integer.parseInt(args[2]); } catch (NumberFormatException e) { return placeholderError; } @@ -60,24 +62,21 @@ public class PAPIExpansion extends PlaceholderExpansion { } else { return Main.getInstance().getServer().getOfflinePlayer(info.getUniqueId()).getName(); } - } else if (args[0].equals("rank-place") && args.length == 2) { + } else if (args[0].equals("rank-place") && (args.length == 2 || args.length == 3)) { if (getRanking(args[1]) == null) { return placeholderError; } - PlayerInfo info = database.getGameData().getInfo(player.getUniqueId()); + PlayerInfo info = null; + if(args.length == 2){ + database.getGameData().getInfo(player.getUniqueId()); + } else { + UUID uuid; + try { uuid = Main.getInstance().getServer().getOfflinePlayer(args[2]).getUniqueId(); } catch (Exception e) { return placeholderError; } + info = database.getGameData().getInfo(uuid); + } if (info == null) return placeholderNoData; if (getValue(info, args[1]).equals("0")) { return "-"; } Integer count = database.getGameData().getRanking(getRanking(args[1]), player.getUniqueId()); if (count == null) { return placeholderNoData; } return count.toString(); - } else if (args[0].equals("rank-place") && args.length == 3) { - UUID uuid; - try { uuid = Main.getInstance().getServer().getOfflinePlayer(args[2]).getUniqueId(); } catch (Exception e) { return placeholderError; } - if (getRanking(args[1]) == null) { return placeholderError; } - PlayerInfo info = database.getGameData().getInfo(player.getUniqueId()); - if (info == null) return placeholderNoData; - if (getValue(info, args[1]).equals("0")) { return "-"; } - Integer count = database.getGameData().getRanking(getRanking(args[1]), uuid); - if (count == null) { return placeholderNoData; } - return count.toString(); } return null; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2d76b4a..6153c46 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -94,6 +94,26 @@ leaveServer: hub # default: true mapSaveEnabled: true +# How you want to store game data. If you are running a single server, sqlite is fine, as no setup is necessary. +# But if you want the data to go across multiple servers, you can switch it to mysql. +# WARNING: Data is not saved across databases. You have to migrate the data yourself! +# +# SQLITE - A single database.db file in the plugin folder, good for a single server. +# +# MYSQL - Uses a mysql server to store data, good for multi-server setups or large servers. +# +# default: SQLITE +databaseType: SQLITE + +# The following settings are used for MYSQL databases ONLY. If you are running SQLITE, these +# will be ignored. If you are running MYSQL, you need to provide the database host url, database +# host port (usually 3306), database username, and database password. +databaseHost: localhost +databasePort: 3306 +databaseUser: root +databasePass: +databaseName: hideandseek + # The world border closes every interval, which is evey [delay] in minutes. # Thw world border starts at [size], and decreases 100 blocks every interval. # x & z are the center location. [enabled] is whenever the border is enabled. @@ -132,6 +152,14 @@ glow: material: SNOWBALL model-data: 0 +# This has the same glow effect as the glow powerup in that all seekers positions get +# shown to hiders. But enabling this force disables the powerup, and instead always shows +# the seekers positions to the hiders. Good for small maps. Since the glow effect wasn't added +# until Minecraft 1.9, any server running 1.8 will have this disabled regardless of the +# options below. +# default: false +alwaysGlow: false + # The message prefixes displayed before messages. The message contents themselves # can be changed in localization.yml. prefix: diff --git a/src/main/resources/lang/localization_de-DE.yml b/src/main/resources/lang/localization_de-DE.yml index 84ada18..a1a6eea 100644 --- a/src/main/resources/lang/localization_de-DE.yml +++ b/src/main/resources/lang/localization_de-DE.yml @@ -56,6 +56,7 @@ Localization: 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_COUNTDOWN_LAST: "Die Hider haben {AMOUNT} Sekunde Zeit sich zu verstecken!" START: "Los, Seeker! Es ist Zeit, die Hider zu finden." STOP: "Das Spiel wurde gestoppt." HIDER_TEAM_NAME: "&6&lHIDER" diff --git a/src/main/resources/lang/localization_en-US.yml b/src/main/resources/lang/localization_en-US.yml index 07d547b..96ccf7a 100644 --- a/src/main/resources/lang/localization_en-US.yml +++ b/src/main/resources/lang/localization_en-US.yml @@ -57,6 +57,7 @@ Localization: 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_COUNTDOWN_LAST: "Hiders have {AMOUNT} second to hide!" START: "Attention SEEKERS, its time to find the hiders!" STOP: "Game has been force stopped." HIDER_TEAM_NAME: "&6&lHIDER" diff --git a/src/test/java/MainTest.java b/src/test/java/MainTest.java deleted file mode 100644 index 9997e04..0000000 --- a/src/test/java/MainTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2022 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -import be.seeseemelk.mockbukkit.MockBukkit; -import be.seeseemelk.mockbukkit.ServerMock; -import net.tylermurphy.hideAndSeek.Main; -import org.junit.After; -import org.junit.Before; - -public class MainTest { - - private ServerMock server; - private Main plugin; - - @Before - public void setUp() { - server = MockBukkit.mock(); - plugin = MockBukkit.load(Main.class); - } - - @After - public void tearDown() { - MockBukkit.unmock(); - } - -} -- cgit v1.2.3-freya