From e4abbae6af086e4ea71bb20e25d29b3ed646ae83 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Wed, 27 Jul 2022 18:20:11 -0400 Subject: blockhunt start --- .../java/net/tylermurphy/hideAndSeek/Main.java | 8 +++ .../net/tylermurphy/hideAndSeek/command/About.java | 2 +- .../net/tylermurphy/hideAndSeek/command/Debug.java | 6 ++- .../hideAndSeek/configuration/Config.java | 18 ++++++- .../tylermurphy/hideAndSeek/game/Disguiser.java | 62 ++++++++++++++++++++++ .../tylermurphy/hideAndSeek/game/PlayerLoader.java | 14 +++++ .../hideAndSeek/game/listener/DamageHandler.java | 8 +++ .../hideAndSeek/game/listener/DisguiseHandler.java | 46 ++++++++++++++++ .../game/listener/InventoryHandler.java | 41 +++++++++++++- 9 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java (limited to 'src/main/java/net/tylermurphy') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java index 69619f1..dc36752 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java @@ -24,6 +24,7 @@ import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.configuration.Localization; import net.tylermurphy.hideAndSeek.database.Database; import net.tylermurphy.hideAndSeek.game.Board; +import net.tylermurphy.hideAndSeek.game.Disguiser; import net.tylermurphy.hideAndSeek.game.PlayerLoader; import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.util.CommandHandler; @@ -56,6 +57,7 @@ public class Main extends JavaPlugin implements Listener { private final Database database; private final Board board; + private final Disguiser disguiser; private Game game; @@ -64,6 +66,7 @@ public class Main extends JavaPlugin implements Listener { onConstructed(); board = new Board(); database = new Database(); + disguiser = new Disguiser(); } protected Main(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { @@ -71,6 +74,7 @@ public class Main extends JavaPlugin implements Listener { onConstructed(); board = new Board(); database = new Database(); + disguiser = new Disguiser(); } private void onConstructed(){ @@ -123,12 +127,14 @@ public class Main extends JavaPlugin implements Listener { private void onTick() { if(game.getStatus() == Status.ENDED) game = new Game(board); game.onTick(); + disguiser.check(); } private void registerListeners() { getServer().getPluginManager().registerEvents(new BlockedCommandHandler(), this); getServer().getPluginManager().registerEvents(new ChatHandler(), this); getServer().getPluginManager().registerEvents(new DamageHandler(), this); + getServer().getPluginManager().registerEvents(new DisguiseHandler(), this); getServer().getPluginManager().registerEvents(new InteractHandler(), this); getServer().getPluginManager().registerEvents(new InventoryHandler(), this); getServer().getPluginManager().registerEvents(new JoinLeaveHandler(), this); @@ -165,6 +171,8 @@ public class Main extends JavaPlugin implements Listener { return game; } + public Disguiser getDisguiser() { return disguiser; } + public boolean supports(int v){ return version >= v; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/About.java b/src/main/java/net/tylermurphy/hideAndSeek/command/About.java index e36ee84..a4eca9f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/About.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/About.java @@ -26,7 +26,7 @@ public class About implements ICommand { public void execute(Player sender, String[] args) { sender.sendMessage( - String.format("%s%sHide and Seek %s(%s1.5.1%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY,ChatColor.WHITE,ChatColor.GRAY) + + String.format("%s%sHide and Seek %s(%s1.6.0%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY,ChatColor.WHITE,ChatColor.GRAY) + String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) + String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE) ); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java index 1275ceb..7ddc72c 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java @@ -31,7 +31,7 @@ public class Debug implements ICommand { } private void createMenu(){ - debugMenu = Main.getInstance().getServer().createInventory(null, 9, "Debug Menu"); + debugMenu = Main.getInstance().getServer().createInventory(null, 18, "Debug Menu"); debugMenu.setItem(0, createOption(0, XMaterial.LEATHER_CHESTPLATE.parseMaterial(), "&6Become a &lHider", 1, player -> { if(mapSaveEnabled) { if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap(); @@ -79,6 +79,10 @@ public class Debug implements ICommand { debugMenu.setItem(8, createOption(8, Material.ENDER_PEARL, "&d&lTeleport: &fExit", 3, player -> { player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); })); + debugMenu.setItem(9, createOption(9, XMaterial.GLASS.parseMaterial(), "&dEnable Disguise", 1, PlayerLoader::openBlockHuntPicker)); + debugMenu.setItem(10, createOption(10, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> { + Main.getInstance().getDisguiser().reveal(player); + })); } private ItemStack createOption(int slow, Material material, String name, int amount, Consumer callback){ diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 123432d..f988d5a 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -90,7 +90,8 @@ public class Config { leaveOnEnd, mapSaveEnabled, allowNaturalCauses, - saveInventory; + saveInventory, + blockhuntEnabled; public static int minPlayers, @@ -126,6 +127,9 @@ public class Config { blockedCommands, blockedInteracts; + public static List + blockhuntBlocks; + public static String LOBBY_TITLE, GAME_TITLE, @@ -288,6 +292,18 @@ public class Config { } bungeeLeave = config.getString("leaveType") == null || config.getString("leaveType").equalsIgnoreCase("proxy"); leaveServer = config.getString("leaveServer"); + blockhuntEnabled = config.getBoolean("blockhunt.enabled"); + blockhuntBlocks = new ArrayList<>(); + tempInteracts = config.getStringList("blockhunt.blocks"); + for(String id : tempInteracts) { + Optional optional_mat = XMaterial.matchXMaterial(id); + if (optional_mat.isPresent()) { + Material mat = optional_mat.get().parseMaterial(); + if (mat != null) { + blockhuntBlocks.add(mat); + } + } + } //Leaderboard LOBBY_TITLE = leaderboard.getString("lobby.title"); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java new file mode 100644 index 0000000..b4f70ad --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java @@ -0,0 +1,62 @@ +package net.tylermurphy.hideAndSeek.game; + +import org.bukkit.Material; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashMap; +import java.util.Map; + +public class Disguiser { + + private final Map blocks; + + public Disguiser(){ + this.blocks = new HashMap<>(); + } + + public FallingBlock getBlock(Player player){ + return blocks.get(player); + } + + public boolean contains(FallingBlock block) { return blocks.containsValue(block); } + + public boolean disguised(Player player) { return blocks.containsKey(player); } + + public void check(){ + for(Map.Entry set : blocks.entrySet()){ + Player player = set.getKey(); + FallingBlock block = set.getValue(); + if(block.isDead()){ + block.remove(); + FallingBlock replacement = player.getLocation().getWorld().spawnFallingBlock(player.getLocation(), block.getMaterial(), (byte)0); + replacement.setGravity(false); + replacement.setDropItem(false); + blocks.put(player, replacement); + } + } + } + + public void disguise(Player player, Material material){ + if(blocks.containsKey(player)){ + FallingBlock block = blocks.get(player); + block.remove(); + } + FallingBlock block = player.getLocation().getWorld().spawnFallingBlock(player.getLocation(), material, (byte)0); + block.setGravity(false); + block.setDropItem(false); + blocks.put(player, block); + player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000, 0,false, false)); + } + + public void reveal(Player player){ + if(!blocks.containsKey(player)) return; + FallingBlock block = blocks.get(player); + block.remove(); + blocks.remove(player); + player.removePotionEffect(PotionEffectType.INVISIBILITY); + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java index bd2a965..2ddfeca 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java @@ -27,9 +27,11 @@ import net.tylermurphy.hideAndSeek.configuration.Items; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -45,6 +47,9 @@ public class PlayerLoader { loadPlayer(player); player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,1000000,5,false,false)); Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("HIDER_TEAM_NAME"), ChatColor.WHITE + message("HIDERS_SUBTITLE").toString()); + if(blockhuntEnabled){ + openBlockHuntPicker(player); + } } public static void loadSeeker(Player player, String gameWorld){ @@ -141,4 +146,13 @@ public class PlayerLoader { } } + public static void openBlockHuntPicker(Player player){ + int slots = ((blockhuntBlocks.size()-1)/9)*9+9; + Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block"); + for(int i=0;i { + teleportEntity(player, block, event.getPlayer().getLocation()); + }); + } + + private void teleportEntity(Player player, FallingBlock block, Location location) { + PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_TELEPORT); + packet.getModifier().writeDefaults(); + packet.getIntegers().write(0, block.getEntityId()); + packet.getDoubles().write(0, location.getX()); + packet.getDoubles().write(1, location.getY()); + packet.getDoubles().write(2, location.getZ()); + try { + protocolManager.sendServerPacket(player, packet); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java index f0fb4f9..e72bea0 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java @@ -19,26 +19,29 @@ package net.tylermurphy.hideAndSeek.game.listener; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; + import com.cryptomorin.xseries.XMaterial; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.command.Debug; import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; public class InventoryHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onInventoryClick(InventoryClickEvent event) { if (!(event.getWhoClicked() instanceof Player)) return; - - Player player = (Player) event.getWhoClicked(); checkForInventoryMove(event); checkForSpectatorTeleportMenu(event); checkForDebugMenu(event); + checkForBlockHuntMenu(event); } private void checkForInventoryMove(InventoryClickEvent event){ @@ -74,4 +77,38 @@ public class InventoryHandler implements Listener { } } + private void checkForBlockHuntMenu(InventoryClickEvent event){ + boolean test; + if(Main.getInstance().supports(14)){ + test = event.getView().getTitle().equals("Select a Block"); + } else { + test = event.getInventory().getName().equals("Select a Block"); + } + if(!test) return; + event.setCancelled(true); + Material mat = blockhuntBlocks.get(event.getRawSlot()); + if(mat == null) return; + Player player = (Player) event.getWhoClicked(); + Main.getInstance().getDisguiser().disguise(player, mat); + player.closeInventory(); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInventoryClose(InventoryCloseEvent event){ + if (!(event.getPlayer() instanceof Player)) return; + boolean test; + if(Main.getInstance().supports(14)){ + test = event.getView().getTitle().equals("Select a Block"); + } else { + test = event.getInventory().getName().equals("Select a Block"); + } + if(!test) return; + Material mat = blockhuntBlocks.get(0); + if(mat == null) return; + Player player = (Player) event.getPlayer(); + if(Main.getInstance().getDisguiser().disguised(player)) return; + Main.getInstance().getDisguiser().disguise(player, mat); + player.closeInventory(); + } + } -- cgit v1.2.3-freya From aa159314100c701c4a76f01c7ae8f57e86fbcab2 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Wed, 27 Jul 2022 21:15:48 -0400 Subject: block snapping --- .../hideAndSeek/game/listener/DisguiseHandler.java | 42 +++++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'src/main/java/net/tylermurphy') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java index 9bc6504..e3eb341 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java @@ -15,27 +15,59 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import java.lang.reflect.InvocationTargetException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; public class DisguiseHandler implements Listener { private static final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + private final Map locations = new HashMap<>(); + private final Map times = new HashMap<>(); + @EventHandler(priority = EventPriority.HIGHEST) public void onMove(PlayerMoveEvent event) { + checkStandingStill(event.getPlayer()); FallingBlock block = Main.getInstance().getDisguiser().getBlock(event.getPlayer()); if(block == null) return; + UUID uuid = event.getPlayer().getUniqueId(); + boolean finalFixLocation = times.containsKey(uuid) && new Date().getTime()-times.get(uuid) > 1000; Bukkit.getOnlinePlayers().forEach(player -> { - teleportEntity(player, block, event.getPlayer().getLocation()); + teleportEntity(player, block, event.getPlayer().getLocation(), finalFixLocation); }); } - private void teleportEntity(Player player, FallingBlock block, Location location) { + private void checkStandingStill(Player player){ + UUID uuid = player.getUniqueId(); + Location lastLoc = locations.get(uuid); + Location currentLoc = player.getLocation(); + if(lastLoc == null) lastLoc = currentLoc; + double distance = lastLoc.distance(currentLoc); + if(distance < .05){ + if(!times.containsKey(uuid)) + times.put(uuid, new Date().getTime()); + } else { + times.remove(uuid); + } + locations.put(uuid, currentLoc); + } + + private void teleportEntity(Player player, FallingBlock block, Location location, boolean fixLocation) { PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_TELEPORT); packet.getModifier().writeDefaults(); packet.getIntegers().write(0, block.getEntityId()); - packet.getDoubles().write(0, location.getX()); - packet.getDoubles().write(1, location.getY()); - packet.getDoubles().write(2, location.getZ()); + if(fixLocation){ + packet.getDoubles().write(0, Math.round(location.getX()+.5)-.5); + packet.getDoubles().write(1, (double)Math.round(location.getY())); + packet.getDoubles().write(2, Math.round(location.getZ()+.5)-.5); + } else { + packet.getDoubles().write(0, location.getX()); + packet.getDoubles().write(1, location.getY()); + packet.getDoubles().write(2, location.getZ()); + } + try { protocolManager.sendServerPacket(player, packet); } catch (InvocationTargetException e) { -- cgit v1.2.3-freya From 361b97d4146efd6cdc5b06612e2dc499cccfce1d Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Thu, 28 Jul 2022 21:57:49 -0400 Subject: added ability to attack block in solid form, blocks now go solid --- .../java/net/tylermurphy/hideAndSeek/Main.java | 61 ++--- .../net/tylermurphy/hideAndSeek/game/Board.java | 2 + .../tylermurphy/hideAndSeek/game/Disguiser.java | 67 ++--- .../tylermurphy/hideAndSeek/game/EntityHider.java | 282 +++++++++++++++++++++ .../tylermurphy/hideAndSeek/game/PlayerLoader.java | 3 + .../hideAndSeek/game/listener/DamageHandler.java | 3 +- .../hideAndSeek/game/listener/DisguiseHandler.java | 212 ++++++++++++---- .../hideAndSeek/game/util/Disguise.java | 143 +++++++++++ 8 files changed, 658 insertions(+), 115 deletions(-) create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java (limited to 'src/main/java/net/tylermurphy') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java index dc36752..9a589ae 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java @@ -23,12 +23,9 @@ import net.tylermurphy.hideAndSeek.configuration.Config; import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.configuration.Localization; import net.tylermurphy.hideAndSeek.database.Database; -import net.tylermurphy.hideAndSeek.game.Board; -import net.tylermurphy.hideAndSeek.game.Disguiser; -import net.tylermurphy.hideAndSeek.game.PlayerLoader; +import net.tylermurphy.hideAndSeek.game.*; import net.tylermurphy.hideAndSeek.game.util.Status; import net.tylermurphy.hideAndSeek.util.CommandHandler; -import net.tylermurphy.hideAndSeek.game.Game; import net.tylermurphy.hideAndSeek.game.listener.*; import net.tylermurphy.hideAndSeek.util.PAPIExpansion; import net.tylermurphy.hideAndSeek.util.TabCompleter; @@ -55,46 +52,23 @@ public class Main extends JavaPlugin implements Listener { private static Main instance; private static int version; - private final Database database; - private final Board board; - private final Disguiser disguiser; - + private Database database; + private Board board; + private Disguiser disguiser; + private EntityHider entityHider; private Game game; - public Main() { - super(); - onConstructed(); - board = new Board(); - database = new Database(); - disguiser = new Disguiser(); - } - - protected Main(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { - super(loader, description, dataFolder, file); - onConstructed(); - board = new Board(); - database = new Database(); - disguiser = new Disguiser(); - } - - private void onConstructed(){ - - instance = this; - - Matcher matcher = Pattern.compile("MC: \\d\\.(\\d+)").matcher(Bukkit.getVersion()); - if (matcher.find()) { - version = Integer.parseInt(matcher.group(1)); - } else { - throw new IllegalArgumentException("Failed to parse server version from: " + Bukkit.getVersion()); - } - + public void onEnable() { + Main.instance = this; Config.loadConfig(); Localization.loadLocalization(); Items.loadItems(); - } - - public void onEnable() { + this.updateVersion(); + this.board = new Board(); + this.database = new Database(); + this.disguiser = new Disguiser(); + this.entityHider = new EntityHider(this, EntityHider.Policy.BLACKLIST); this.registerListeners(); CommandHandler.registerCommands(); @@ -142,6 +116,15 @@ public class Main extends JavaPlugin implements Listener { getServer().getPluginManager().registerEvents(new PlayerHandler(), this); getServer().getPluginManager().registerEvents(new RespawnHandler(), this); } + + private void updateVersion(){ + Matcher matcher = Pattern.compile("MC: \\d\\.(\\d+)").matcher(Bukkit.getVersion()); + if (matcher.find()) { + version = Integer.parseInt(matcher.group(1)); + } else { + throw new IllegalArgumentException("Failed to parse server version from: " + Bukkit.getVersion()); + } + } public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { return CommandHandler.handleCommand(sender, args); @@ -173,6 +156,8 @@ public class Main extends JavaPlugin implements Listener { public Disguiser getDisguiser() { return disguiser; } + public EntityHider getEntityHider() { return entityHider; } + public boolean supports(int v){ return version >= v; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index c6aaaf5..050faa8 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -401,6 +401,8 @@ class CustomBoard { hiderTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER); seekerTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER); } + hiderTeam.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER); + seekerTeam.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER); } else { if (nameTagsVisible) { hiderTeam.setNameTagVisibility(NameTagVisibility.HIDE_FOR_OTHER_TEAMS); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java index b4f70ad..a8ac441 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java @@ -1,62 +1,69 @@ package net.tylermurphy.hideAndSeek.game; +import net.tylermurphy.hideAndSeek.game.util.Disguise; +import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.BlockVector; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +import java.util.Vector; public class Disguiser { - private final Map blocks; + private final Map disguises; public Disguiser(){ - this.blocks = new HashMap<>(); + this.disguises = new HashMap<>(); } - public FallingBlock getBlock(Player player){ - return blocks.get(player); + public Disguise getDisguise(Player player){ + return disguises.get(player); } - public boolean contains(FallingBlock block) { return blocks.containsValue(block); } + public boolean disguised(Player player) { return disguises.containsKey(player); } - public boolean disguised(Player player) { return blocks.containsKey(player); } + @Nullable + public Disguise getByEntityID(int ID){ + return disguises.values().stream().filter(disguise -> disguise.getEntityID() == ID).findFirst().orElse(null); + } + + @Nullable + public Disguise getByBlockLocation(BlockVector loc){ + return disguises.values().stream().filter(disguise -> { + if(disguise.getSolidLocation() == null) return false; + return disguise.getSolidLocation().toVector().toBlockVector() == loc; + }).findFirst().orElse(null); + } public void check(){ - for(Map.Entry set : blocks.entrySet()){ + for(Map.Entry set : disguises.entrySet()){ + Disguise disguise = set.getValue(); Player player = set.getKey(); - FallingBlock block = set.getValue(); - if(block.isDead()){ - block.remove(); - FallingBlock replacement = player.getLocation().getWorld().spawnFallingBlock(player.getLocation(), block.getMaterial(), (byte)0); - replacement.setGravity(false); - replacement.setDropItem(false); - blocks.put(player, replacement); + if(!player.isOnline()) { + disguise.remove(); + disguises.remove(player); + } else { + disguise.update(); } } } public void disguise(Player player, Material material){ - if(blocks.containsKey(player)){ - FallingBlock block = blocks.get(player); - block.remove(); + if(disguises.containsKey(player)){ + disguises.get(player).remove(); } - FallingBlock block = player.getLocation().getWorld().spawnFallingBlock(player.getLocation(), material, (byte)0); - block.setGravity(false); - block.setDropItem(false); - blocks.put(player, block); - player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000, 0,false, false)); + Disguise disguise = new Disguise(player, material); + disguises.put(player, disguise); } public void reveal(Player player){ - if(!blocks.containsKey(player)) return; - FallingBlock block = blocks.get(player); - block.remove(); - blocks.remove(player); - player.removePotionEffect(PotionEffectType.INVISIBILITY); + if(disguises.containsKey(player)) + disguises.get(player).remove(); + disguises.remove(player); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java new file mode 100644 index 0000000..9dcb0ab --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java @@ -0,0 +1,282 @@ +package net.tylermurphy.hideAndSeek.game; + +import static com.comphenix.protocol.PacketType.Play.Server.*; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.Map; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.plugin.Plugin; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.google.common.base.Preconditions; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; + +public class EntityHider implements Listener { + protected Table observerEntityMap = HashBasedTable.create(); + + private static final PacketType[] ENTITY_PACKETS = { + ENTITY_EQUIPMENT, BED, ANIMATION, NAMED_ENTITY_SPAWN, + COLLECT, SPAWN_ENTITY, SPAWN_ENTITY_LIVING, SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_EXPERIENCE_ORB, + ENTITY_VELOCITY, REL_ENTITY_MOVE, ENTITY_LOOK, ENTITY_MOVE_LOOK, ENTITY_MOVE_LOOK, + ENTITY_TELEPORT, ENTITY_HEAD_ROTATION, ENTITY_STATUS, ATTACH_ENTITY, ENTITY_METADATA, + ENTITY_EFFECT, REMOVE_ENTITY_EFFECT, BLOCK_BREAK_ANIMATION + }; + + public enum Policy { + WHITELIST, + BLACKLIST, + } + + private ProtocolManager manager; + + private final Listener bukkitListener; + private final PacketAdapter protocolListener; + + protected final Policy policy; + + public EntityHider(Plugin plugin, Policy policy) { + Preconditions.checkNotNull(plugin, "plugin cannot be NULL."); + + // Save policy + this.policy = policy; + this.manager = ProtocolLibrary.getProtocolManager(); + + // Register events and packet listener + plugin.getServer().getPluginManager().registerEvents( + bukkitListener = constructBukkit(), plugin); + manager.addPacketListener( + protocolListener = constructProtocol(plugin)); + } + + /** + * Set the visibility status of a given entity for a particular observer. + * @param observer - the observer player. + * @param entityID - ID of the entity that will be hidden or made visible. + * @param visible - TRUE if the entity should be made visible, FALSE if not. + * @return TRUE if the entity was visible before this method call, FALSE otherwise. + */ + protected boolean setVisibility(Player observer, int entityID, boolean visible) { + switch (policy) { + case BLACKLIST: + // Non-membership means they are visible + return !setMembership(observer, entityID, !visible); + case WHITELIST: + return setMembership(observer, entityID, visible); + default : + throw new IllegalArgumentException("Unknown policy: " + policy); + } + } + + /** + * Add or remove the given entity and observer entry from the table. + * @param observer - the player observer. + * @param entityID - ID of the entity. + * @param member - TRUE if they should be present in the table, FALSE otherwise. + * @return TRUE if they already were present, FALSE otherwise. + */ + protected boolean setMembership(Player observer, int entityID, boolean member) { + if (member) { + return observerEntityMap.put(observer.getEntityId(), entityID, true) != null; + } else { + return observerEntityMap.remove(observer.getEntityId(), entityID) != null; + } + } + + /** + * Determine if the given entity and observer is present in the table. + * @param observer - the player observer. + * @param entityID - ID of the entity. + * @return TRUE if they are present, FALSE otherwise. + */ + protected boolean getMembership(Player observer, int entityID) { + return observerEntityMap.contains(observer.getEntityId(), entityID); + } + + /** + * Determine if a given entity is visible for a particular observer. + * @param observer - the observer player. + * @param entityID - ID of the entity that we are testing for visibility. + * @return TRUE if the entity is visible, FALSE otherwise. + */ + protected boolean isVisible(Player observer, int entityID) { + // If we are using a whitelist, presence means visibility - if not, the opposite is the case + boolean presence = getMembership(observer, entityID); + + return (policy == Policy.WHITELIST) == presence; + } + + /** + * Remove the given entity from the underlying map. + * @param entity - the entity to remove. + */ + protected void removeEntity(Entity entity) { + int entityID = entity.getEntityId(); + + for (Map maps : observerEntityMap.rowMap().values()) { + maps.remove(entityID); + } + } + + /** + * Invoked when a player logs out. + * @param player - the player that jused logged out. + */ + protected void removePlayer(Player player) { + // Cleanup + observerEntityMap.rowMap().remove(player.getEntityId()); + } + + /** + * Construct the Bukkit event listener. + * @return Our listener. + */ + private Listener constructBukkit() { + return new Listener() { + @EventHandler + public void onEntityDeath(EntityDeathEvent e) { + removeEntity(e.getEntity()); + } + + @EventHandler + public void onChunkUnload(ChunkUnloadEvent e) { + for (Entity entity : e.getChunk().getEntities()) { + removeEntity(entity); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent e) { + removePlayer(e.getPlayer()); + } + }; + } + + /** + * Construct the packet listener that will be used to intercept every entity-related packet. + * @param plugin - the parent plugin. + * @return The packet listener. + */ + private PacketAdapter constructProtocol(Plugin plugin) { + return new PacketAdapter(plugin, ENTITY_PACKETS) { + @Override + public void onPacketSending(PacketEvent event) { + int entityID = event.getPacket().getIntegers().read(0); + + // See if this packet should be cancelled + if (!isVisible(event.getPlayer(), entityID)) { + event.setCancelled(true); + } + } + }; + } + + /** + * Toggle the visibility status of an entity for a player. + *

+ * If the entity is visible, it will be hidden. If it is hidden, it will become visible. + * @param observer - the player observer. + * @param entity - the entity to toggle. + * @return TRUE if the entity was visible before, FALSE otherwise. + */ + public final boolean toggleEntity(Player observer, Entity entity) { + if (isVisible(observer, entity.getEntityId())) { + return hideEntity(observer, entity); + } else { + return !showEntity(observer, entity); + } + } + + /** + * Allow the observer to see an entity that was previously hidden. + * @param observer - the observer. + * @param entity - the entity to show. + * @return TRUE if the entity was hidden before, FALSE otherwise. + */ + public final boolean showEntity(Player observer, Entity entity) { + validate(observer, entity); + boolean hiddenBefore = !setVisibility(observer, entity.getEntityId(), true); + + // Resend packets + if (manager != null && hiddenBefore) { + manager.updateEntity(entity, Arrays.asList(observer)); + } + return hiddenBefore; + } + + /** + * Prevent the observer from seeing a given entity. + * @param observer - the player observer. + * @param entity - the entity to hide. + * @return TRUE if the entity was previously visible, FALSE otherwise. + */ + public final boolean hideEntity(Player observer, Entity entity) { + validate(observer, entity); + boolean visibleBefore = setVisibility(observer, entity.getEntityId(), false); + + if (visibleBefore) { + PacketContainer destroyEntity = new PacketContainer(ENTITY_DESTROY); + try { + destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()}); + } catch (Exception e){ return false; } + // Make the entity disappear + try { + manager.sendServerPacket(observer, destroyEntity); + } catch (InvocationTargetException e) { + throw new RuntimeException("Cannot send server packet.", e); + } + } + return visibleBefore; + } + + /** + * Determine if the given entity has been hidden from an observer. + *

+ * Note that the entity may very well be occluded or out of range from the perspective + * of the observer. This method simply checks if an entity has been completely hidden + * for that observer. + * @param observer - the observer. + * @param entity - the entity that may be hidden. + * @return TRUE if the player may see the entity, FALSE if the entity has been hidden. + */ + public final boolean canSee(Player observer, Entity entity) { + validate(observer, entity); + + return isVisible(observer, entity.getEntityId()); + } + + private void validate(Player observer, Entity entity) { + Preconditions.checkNotNull(observer, "observer cannot be NULL."); + Preconditions.checkNotNull(entity, "entity cannot be NULL."); + } + + /** + * Retrieve the current visibility policy. + * @return The current visibility policy. + */ + public Policy getPolicy() { + return policy; + } + + public void close() { + if (manager != null) { + HandlerList.unregisterAll(bukkitListener); + manager.removePacketListener(protocolListener); + manager = null; + } + } +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java index 2ddfeca..0447111 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java @@ -99,6 +99,7 @@ public class PlayerLoader { public static void unloadPlayer(Player player){ player.setGameMode(GameMode.ADVENTURE); player.getInventory().clear(); + Main.getInstance().getDisguiser().reveal(player); for(PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } @@ -135,6 +136,8 @@ public class PlayerLoader { player.setGameMode(GameMode.ADVENTURE); player.getInventory().clear(); for(PotionEffect effect : player.getActivePotionEffects()) { + Main.getInstance().getLogger().severe(player.getName() + " " + effect.getType()); + if(effect.getType().getName().equals("INVISIBILITY") && Main.getInstance().getDisguiser().disguised(player)) continue; player.removePotionEffect(effect.getType()); } player.setFoodLevel(20); 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 f09e112..cb4cba5 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java @@ -25,10 +25,8 @@ public class DamageHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onEntityDamage(EntityDamageEvent event) { - Board board = Main.getInstance().getBoard(); Game game = Main.getInstance().getGame(); - // If you are not a player, get out of here if (!(event.getEntity() instanceof Player)) return; // Define variables @@ -46,6 +44,7 @@ public class DamageHandler implements Listener { } // Makes sure that if there was an attacking player, that the event is allowed for the game if (attacker != null) { + System.out.println(event.getFinalDamage() + " " + player.getDisplayName() + " " + attacker.getDisplayName()); // Cancel if one player is in the game but other isn't if ((board.contains(player) && !board.contains(attacker)) || (!board.contains(player) && board.contains(attacker))) { event.setCancelled(true); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java index e3eb341..af58f91 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java @@ -1,78 +1,200 @@ package net.tylermurphy.hideAndSeek.game.listener; -import com.comphenix.protocol.PacketType; +import static com.comphenix.protocol.PacketType.Play.Client.*; + import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.wrappers.BlockPosition; +import com.cryptomorin.xseries.XMaterial; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.util.Disguise; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.entity.FallingBlock; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.enchantments.Enchantment; 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.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.BlockVector; -import java.lang.reflect.InvocationTargetException; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.ArrayList; +import java.util.List; public class DisguiseHandler implements Listener { private static final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + private final PacketAdapter packetListener; - private final Map locations = new HashMap<>(); - private final Map times = new HashMap<>(); + public DisguiseHandler(){ + packetListener = createProtocol(); + protocolManager.addPacketListener(packetListener); + } @EventHandler(priority = EventPriority.HIGHEST) public void onMove(PlayerMoveEvent event) { - checkStandingStill(event.getPlayer()); - FallingBlock block = Main.getInstance().getDisguiser().getBlock(event.getPlayer()); - if(block == null) return; - UUID uuid = event.getPlayer().getUniqueId(); - boolean finalFixLocation = times.containsKey(uuid) && new Date().getTime()-times.get(uuid) > 1000; - Bukkit.getOnlinePlayers().forEach(player -> { - teleportEntity(player, block, event.getPlayer().getLocation(), finalFixLocation); - }); + final Disguise disguise = Main.getInstance().getDisguiser().getDisguise(event.getPlayer()); + if(disguise == null) return; + final Location lastLocation = event.getPlayer().getLocation(); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { + final Location currentLocation = event.getPlayer().getLocation(); + if(lastLocation.getWorld() != currentLocation.getWorld()) return; + double distance = lastLocation.distance(currentLocation); + disguise.setSolidify(distance < .1); + }, 40L); + if(event.getFrom().distance(event.getTo()) > .1) + disguise.setSolidify(false); + } + +// @EventHandler(priority = EventPriority.MONITOR) +// public void onInteract(PlayerInteractEvent event) { +// Action action = event.getAction(); +// Player player = event.getPlayer(); +// Block block = event. +// } + + private PacketAdapter createProtocol(){ + return new PacketAdapter(Main.getInstance(), USE_ITEM, USE_ENTITY) { + + @Override + public void onPacketReceiving(PacketEvent event){ + PacketContainer packet = event.getPacket(); + Player player = event.getPlayer(); +// if(!Main.getInstance().getBoard().isSeeker(player)) return; + if(packet.getType() == USE_ITEM) { + System.out.print("\nUse Item: "); + BlockPosition data; + try { data = packet.getBlockPositionModifier().read(0); } + catch (Exception e) { return; } + System.out.print(data + " "); + BlockVector loc = new BlockVector(data.getX(), data.getY(), data.getZ()); + System.out.print(loc + " "); + Disguise disguise = Main.getInstance().getDisguiser().getByBlockLocation(loc); + System.out.print("FOUND"); + handleAttack(disguise, player); + } else if(packet.getType() == USE_ENTITY) { + System.out.print("\nUse Entity: "); + int id = packet.getIntegers().read(0); + System.out.print(id + " "); + Disguise disguise = Main.getInstance().getDisguiser().getByEntityID(id); + System.out.print("FOUND"); + handleAttack(disguise, player); + } + } + + }; } - private void checkStandingStill(Player player){ - UUID uuid = player.getUniqueId(); - Location lastLoc = locations.get(uuid); - Location currentLoc = player.getLocation(); - if(lastLoc == null) lastLoc = currentLoc; - double distance = lastLoc.distance(currentLoc); - if(distance < .05){ - if(!times.containsKey(uuid)) - times.put(uuid, new Date().getTime()); + private final List debounce = new ArrayList<>(); + + private void handleAttack(Disguise disguise, Player seeker){ + + double amount; + if(Main.getInstance().supports(9)) { + amount = seeker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE).getValue(); } else { - times.remove(uuid); + amount = getItemDamageValue(seeker.getItemInHand(), disguise.getPlayer(), seeker); } - locations.put(uuid, currentLoc); + + if(disguise == null) return; + disguise.setSolidify(false); + if(debounce.contains(disguise.getPlayer())) return; + debounce.add(disguise.getPlayer()); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { + EntityDamageByEntityEvent event = + new EntityDamageByEntityEvent(seeker, disguise.getPlayer(), EntityDamageEvent.DamageCause.ENTITY_ATTACK, amount); + event.setDamage(amount); + disguise.getPlayer().setLastDamageCause(event); + Main.getInstance().getServer().getPluginManager().callEvent(event); + if(!event.isCancelled()){ + disguise.getPlayer().damage(amount); + disguise.getPlayer().setVelocity(seeker.getLocation().getDirection().setY(.2).multiply(1)); + } + + }, 0); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> debounce.remove(disguise.getPlayer()), 10); } - private void teleportEntity(Player player, FallingBlock block, Location location, boolean fixLocation) { - PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_TELEPORT); - packet.getModifier().writeDefaults(); - packet.getIntegers().write(0, block.getEntityId()); - if(fixLocation){ - packet.getDoubles().write(0, Math.round(location.getX()+.5)-.5); - packet.getDoubles().write(1, (double)Math.round(location.getY())); - packet.getDoubles().write(2, Math.round(location.getZ()+.5)-.5); - } else { - packet.getDoubles().write(0, location.getX()); - packet.getDoubles().write(1, location.getY()); - packet.getDoubles().write(2, location.getZ()); + private int getItemDamageValue(ItemStack is, Player damaged, Player attacker) { + double damageValue = 0; + if (is != null) { + if (is.getType() == XMaterial.WOODEN_SWORD.parseMaterial()) { + damageValue = 5; + } else if (is.getType() == Material.STONE_SWORD) { + damageValue = 6; + } else if (is.getType() == Material.IRON_SWORD) { + damageValue = 7; + } else if (is.getType() == Material.DIAMOND_SWORD) { + damageValue = 8; + } else { + damageValue = 1; + } + damageValue += is.getEnchantmentLevel(Enchantment.DAMAGE_ALL); } - try { - protocolManager.sendServerPacket(player, packet); - } catch (InvocationTargetException e) { - e.printStackTrace(); + if (damaged != null) { + Inventory i = damaged.getInventory(); + Material helmet = i.getItem(39).getType(); + Material chestplate = i.getItem(40).getType(); + Material leggings = i.getItem(41).getType(); + Material boots = i.getItem(42).getType(); + if (helmet == Material.LEATHER_HELMET) + damageValue -= (0.5 / 1.5); + // value shown at bar above the health bar / 1.5 + else if (helmet == Material.CHAINMAIL_HELMET + || helmet == Material.IRON_HELMET + || helmet == Material.DIAMOND_HELMET + || helmet == XMaterial.GOLDEN_HELMET.parseMaterial()) + damageValue -= (1 / 1.5); + + if (chestplate == Material.LEATHER_CHESTPLATE) + damageValue -= (1.0); + else if (chestplate == Material.CHAINMAIL_CHESTPLATE + || chestplate == XMaterial.GOLDEN_CHESTPLATE.parseMaterial()) + damageValue -= (2.5 / 1.5); + else if (chestplate == Material.IRON_CHESTPLATE) + damageValue -= (3 / 1.5); + else if (chestplate == Material.DIAMOND_CHESTPLATE) + damageValue -= (4 / 1.5); + + if (leggings == Material.LEATHER_LEGGINGS) + damageValue -= (1 / 1.5); + else if (leggings == XMaterial.GOLDEN_LEGGINGS.parseMaterial()) + damageValue -= (1.0); + else if (leggings == Material.CHAINMAIL_LEGGINGS) + damageValue -= (2 / 1.5); + else if (leggings == Material.IRON_LEGGINGS) + damageValue -= (2.5 / 1.5); + else if (leggings == Material.DIAMOND_LEGGINGS) + damageValue -= (3 / 1.5); + + if (boots == Material.LEATHER_BOOTS + || boots == XMaterial.GOLDEN_BOOTS.parseMaterial() + || boots == Material.CHAINMAIL_BOOTS) + damageValue -= (0.5 / 1.5); + else if (boots == Material.IRON_BOOTS) + damageValue -= (1 / 1.5); + else if (boots == Material.DIAMOND_BOOTS) + damageValue -= (1.0); + } + + for (PotionEffect effect : attacker.getActivePotionEffects()){ + if (effect.getType() == PotionEffectType.HARM) { + damageValue += effect.getAmplifier()*1.5; + } } - } + return (int) Math.round(Math.max(damageValue, 0.0)); + } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java new file mode 100644 index 0000000..691037b --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java @@ -0,0 +1,143 @@ +package net.tylermurphy.hideAndSeek.game.util; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.BlockPosition; +import com.comphenix.protocol.wrappers.WrappedBlockData; +import net.tylermurphy.hideAndSeek.Main; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.InvocationTargetException; + +public class Disguise { + + private static final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + + final Player hider; + final Material material; + FallingBlock entity; + Location solidLocation; + boolean solid, solidify; + + public Disguise(Player player, Material material){ + this.hider = player; + this.material = material; + this.solid = false; + respawnEntity(); + player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000, 0,false, false)); + } + + public void remove(){ + if(entity != null) + entity.remove(); + if(solid) + sendBlockUpdate(Material.AIR); + hider.removePotionEffect(PotionEffectType.INVISIBILITY); + } + + @Nullable + public Location getSolidLocation() { + return solidLocation; + } + + public int getEntityID() { + if(entity == null) return -1; + return entity.getEntityId(); + } + + public Player getPlayer() { + return hider; + } + + public boolean isSolid(){ + return solid; + } + + public void update(){ + + if(entity == null || entity.isDead()){ + if(entity != null) entity.remove(); + respawnEntity(); + } + + if(solidify){ + if(!solid) + solidLocation = hider.getLocation().getBlock().getLocation(); + solid = true; + sendBlockUpdate(material); + } else if(solid){ + solid = false; + sendBlockUpdate(Material.AIR); + } + sendToggleFallingBlock(!solid); + sendFallingBlockUpdate(); + } + + public void setSolidify(boolean value){ + this.solidify = value; + } + + private void sendBlockUpdate(Material material){ + final PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.BLOCK_CHANGE); + packet.getModifier().writeDefaults(); + packet.getBlockPositionModifier().write(0, new BlockPosition(solidLocation.toVector())); + packet.getBlockData().write(0, WrappedBlockData.createData(material)); + Bukkit.getOnlinePlayers().forEach(receiver -> { + if(receiver == hider) return; + try { + protocolManager.sendServerPacket(receiver, packet); + } catch (InvocationTargetException ignored) {} + }); + } + + private void sendFallingBlockUpdate() { + if(entity == null || entity.isDead()){ + if(entity != null) entity.remove(); + respawnEntity(); + } + final PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_TELEPORT); + Location location = hider.getLocation(); + packet.getModifier().writeDefaults(); + packet.getIntegers().write(0, entity.getEntityId()); + if(solid){ + packet.getDoubles().write(0, Math.round(location.getX()+.5)-.5); + packet.getDoubles().write(1, (double)Math.round(location.getY())); + packet.getDoubles().write(2, Math.round(location.getZ()+.5)-.5); + } else { + packet.getDoubles().write(0, location.getX()); + packet.getDoubles().write(1, location.getY()); + packet.getDoubles().write(2, location.getZ()); + } + Bukkit.getOnlinePlayers().forEach(receiver -> { + try { + protocolManager.sendServerPacket(receiver, packet); + } catch (InvocationTargetException ignored) {} + }); + } + + private void sendToggleFallingBlock(boolean show){ + Bukkit.getOnlinePlayers().forEach(receiver -> { + if(receiver == hider) return; + if(show) + Main.getInstance().getEntityHider().showEntity(receiver, entity); + else + Main.getInstance().getEntityHider().hideEntity(receiver, entity); + }); + } + + private void respawnEntity(){ + entity = hider.getLocation().getWorld().spawnFallingBlock(hider.getLocation(), material, (byte)0); + entity.setGravity(false); + entity.setDropItem(false); + } + +} \ No newline at end of file -- cgit v1.2.3-freya From 4d737afc4f7a40e417aea6e046d61c2590a586a7 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Thu, 28 Jul 2022 22:00:31 -0400 Subject: stop kicking from standing ontop of hidden block --- .../net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main/java/net/tylermurphy') 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 5233d2e..82369c8 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java @@ -56,6 +56,10 @@ public class JoinLeaveHandler implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onKick(PlayerKickEvent event) { + if(event.getReason().equals("Flying is not enabled on this server!")){ + event.setCancelled(true); + return; + } handleLeave(event.getPlayer()); } -- cgit v1.2.3-freya From 055abc11bd0818c80d4c7be36f35cabd7becbebd Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Fri, 29 Jul 2022 21:49:43 -0400 Subject: better hitboxes for blockhunt --- .../java/net/tylermurphy/hideAndSeek/Main.java | 1 + .../net/tylermurphy/hideAndSeek/game/Board.java | 12 +++ .../tylermurphy/hideAndSeek/game/Disguiser.java | 15 ++- .../hideAndSeek/game/listener/DisguiseHandler.java | 32 ++---- .../hideAndSeek/game/listener/MovementHandler.java | 1 + .../hideAndSeek/game/util/Disguise.java | 113 ++++++++++++++------- 6 files changed, 108 insertions(+), 66 deletions(-) (limited to 'src/main/java/net/tylermurphy') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java index 9a589ae..c4666df 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java @@ -96,6 +96,7 @@ public class Main extends JavaPlugin implements Listener { Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(this); board.cleanup(); + disguiser.cleanUp(); } private void onTick() { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index 050faa8..cf91c23 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -103,6 +103,9 @@ public class Board { } public void addHider(Player player) { + if(!Main.getInstance().supports(9)){ + player.spigot().setCollidesWithEntities(false); + } Hider.add(player.getUniqueId().toString()); Seeker.remove(player.getUniqueId().toString()); Spectator.remove(player.getUniqueId().toString()); @@ -110,6 +113,9 @@ public class Board { } public void addSeeker(Player player) { + if(!Main.getInstance().supports(9)){ + player.spigot().setCollidesWithEntities(false); + } Hider.remove(player.getUniqueId().toString()); Seeker.add(player.getUniqueId().toString()); Spectator.remove(player.getUniqueId().toString()); @@ -117,6 +123,9 @@ public class Board { } public void addSpectator(Player player) { + if(!Main.getInstance().supports(9)){ + player.spigot().setCollidesWithEntities(false); + } Hider.remove(player.getUniqueId().toString()); Seeker.remove(player.getUniqueId().toString()); Spectator.add(player.getUniqueId().toString()); @@ -124,6 +133,9 @@ public class Board { } public void remove(Player player) { + if(!Main.getInstance().supports(9)){ + player.spigot().setCollidesWithEntities(true); + } Hider.remove(player.getUniqueId().toString()); Seeker.remove(player.getUniqueId().toString()); Spectator.remove(player.getUniqueId().toString()); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java index a8ac441..a14827b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java @@ -1,16 +1,12 @@ package net.tylermurphy.hideAndSeek.game; import net.tylermurphy.hideAndSeek.game.util.Disguise; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.util.BlockVector; import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; -import java.util.Optional; -import java.util.Vector; public class Disguiser { @@ -32,11 +28,8 @@ public class Disguiser { } @Nullable - public Disguise getByBlockLocation(BlockVector loc){ - return disguises.values().stream().filter(disguise -> { - if(disguise.getSolidLocation() == null) return false; - return disguise.getSolidLocation().toVector().toBlockVector() == loc; - }).findFirst().orElse(null); + public Disguise getByHitBoxID(int ID){ + return disguises.values().stream().filter(disguise -> disguise.getHitBoxID() == ID).findFirst().orElse(null); } public void check(){ @@ -66,4 +59,8 @@ public class Disguiser { disguises.remove(player); } + public void cleanUp() { + disguises.values().forEach(Disguise::remove); + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java index af58f91..587fab9 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java @@ -65,34 +65,20 @@ public class DisguiseHandler implements Listener { // } private PacketAdapter createProtocol(){ - return new PacketAdapter(Main.getInstance(), USE_ITEM, USE_ENTITY) { + return new PacketAdapter(Main.getInstance(), USE_ENTITY) { @Override public void onPacketReceiving(PacketEvent event){ PacketContainer packet = event.getPacket(); Player player = event.getPlayer(); // if(!Main.getInstance().getBoard().isSeeker(player)) return; - if(packet.getType() == USE_ITEM) { - System.out.print("\nUse Item: "); - BlockPosition data; - try { data = packet.getBlockPositionModifier().read(0); } - catch (Exception e) { return; } - System.out.print(data + " "); - BlockVector loc = new BlockVector(data.getX(), data.getY(), data.getZ()); - System.out.print(loc + " "); - Disguise disguise = Main.getInstance().getDisguiser().getByBlockLocation(loc); - System.out.print("FOUND"); - handleAttack(disguise, player); - } else if(packet.getType() == USE_ENTITY) { - System.out.print("\nUse Entity: "); - int id = packet.getIntegers().read(0); - System.out.print(id + " "); - Disguise disguise = Main.getInstance().getDisguiser().getByEntityID(id); - System.out.print("FOUND"); - handleAttack(disguise, player); - } + int id = packet.getIntegers().read(0); + Disguise disguise = Main.getInstance().getDisguiser().getByEntityID(id); + if(disguise == null) disguise = Main.getInstance().getDisguiser().getByHitBoxID(id); + if(disguise == null) return; + event.setCancelled(true); + handleAttack(disguise, player); } - }; } @@ -100,6 +86,8 @@ public class DisguiseHandler implements Listener { private void handleAttack(Disguise disguise, Player seeker){ + if(disguise.getPlayer() == seeker) return; + double amount; if(Main.getInstance().supports(9)) { amount = seeker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE).getValue(); @@ -107,7 +95,6 @@ public class DisguiseHandler implements Listener { amount = getItemDamageValue(seeker.getItemInHand(), disguise.getPlayer(), seeker); } - if(disguise == null) return; disguise.setSolidify(false); if(debounce.contains(disguise.getPlayer())) return; debounce.add(disguise.getPlayer()); @@ -197,4 +184,5 @@ public class DisguiseHandler implements Listener { return (int) Math.round(Math.max(damageValue, 0.0)); } + } 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 7a7e8ae..d38c512 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java @@ -22,6 +22,7 @@ public class MovementHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onMove(PlayerMoveEvent event) { + if (event.getTo() == null || event.getTo().getWorld() == null) return; checkJumping(event); checkBounds(event); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java index 691037b..330aefe 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java @@ -10,11 +10,11 @@ import net.tylermurphy.hideAndSeek.Main; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.FallingBlock; -import org.bukkit.entity.Player; +import org.bukkit.entity.*; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import org.jetbrains.annotations.Nullable; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; import java.lang.reflect.InvocationTargetException; @@ -24,62 +24,94 @@ public class Disguise { final Player hider; final Material material; - FallingBlock entity; + FallingBlock block; + Horse hitBox; Location solidLocation; boolean solid, solidify; + static Team hidden; + + static { + if(Main.getInstance().supports(9)) { + Scoreboard board = Bukkit.getScoreboardManager().getMainScoreboard(); + hidden = board.getTeam("KenshinHideAndSeek_CollisionGroup"); + if (hidden == null) { + hidden = board.registerNewTeam("KenshinHideAndSeek_CollisionGroup"); + } + hidden.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER); + hidden.setCanSeeFriendlyInvisibles(false); + } + } public Disguise(Player player, Material material){ this.hider = player; this.material = material; this.solid = false; - respawnEntity(); + respawnFallingBlock(); player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000, 0,false, false)); + if(Main.getInstance().supports(9)) { + hidden.addEntry(player.getName()); + } else { + hider.spigot().setCollidesWithEntities(false); + } } public void remove(){ - if(entity != null) - entity.remove(); + if(block != null) + block.remove(); + if(hitBox != null){ + if(Main.getInstance().supports(9)) + hidden.removeEntry(hitBox.getUniqueId().toString()); + hitBox.remove(); + } if(solid) sendBlockUpdate(Material.AIR); hider.removePotionEffect(PotionEffectType.INVISIBILITY); + if(Main.getInstance().supports(9)) { + hidden.removeEntry(hider.getName()); + } else { + hider.spigot().setCollidesWithEntities(true); + } } - @Nullable - public Location getSolidLocation() { - return solidLocation; + public int getEntityID() { + if(block == null) return -1; + return block.getEntityId(); } - public int getEntityID() { - if(entity == null) return -1; - return entity.getEntityId(); + public int getHitBoxID() { + if(hitBox == null) return -1; + return hitBox.getEntityId(); } public Player getPlayer() { return hider; } - public boolean isSolid(){ - return solid; - } - public void update(){ - if(entity == null || entity.isDead()){ - if(entity != null) entity.remove(); - respawnEntity(); + if(block == null || block.isDead()){ + if(block != null) block.remove(); + respawnFallingBlock(); } if(solidify){ - if(!solid) + if(!solid) { + solid = true; solidLocation = hider.getLocation().getBlock().getLocation(); - solid = true; + respawnHotbox(); + teleportEntity(hitBox, false); + } sendBlockUpdate(material); } else if(solid){ solid = false; + if(Main.getInstance().supports(9)) + hidden.removeEntry(hitBox.getUniqueId().toString()); + hitBox.remove(); + hitBox = null; sendBlockUpdate(Material.AIR); } - sendToggleFallingBlock(!solid); - sendFallingBlockUpdate(); + toggleEntityVisibility(block, !solid); + teleportEntity(block, solid); } public void setSolidify(boolean value){ @@ -99,16 +131,12 @@ public class Disguise { }); } - private void sendFallingBlockUpdate() { - if(entity == null || entity.isDead()){ - if(entity != null) entity.remove(); - respawnEntity(); - } + private void teleportEntity(Entity entity, boolean center) { final PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_TELEPORT); Location location = hider.getLocation(); packet.getModifier().writeDefaults(); packet.getIntegers().write(0, entity.getEntityId()); - if(solid){ + if(center){ packet.getDoubles().write(0, Math.round(location.getX()+.5)-.5); packet.getDoubles().write(1, (double)Math.round(location.getY())); packet.getDoubles().write(2, Math.round(location.getZ()+.5)-.5); @@ -124,7 +152,8 @@ public class Disguise { }); } - private void sendToggleFallingBlock(boolean show){ + private void toggleEntityVisibility(Entity entity, boolean show){ + if(entity == null) return; Bukkit.getOnlinePlayers().forEach(receiver -> { if(receiver == hider) return; if(show) @@ -134,10 +163,24 @@ public class Disguise { }); } - private void respawnEntity(){ - entity = hider.getLocation().getWorld().spawnFallingBlock(hider.getLocation(), material, (byte)0); - entity.setGravity(false); - entity.setDropItem(false); + private void respawnFallingBlock(){ + block = hider.getLocation().getWorld().spawnFallingBlock(hider.getLocation(), material, (byte)0); + block.setGravity(false); + block.setDropItem(false); + block.setInvulnerable(true); + } + + private void respawnHotbox(){ + hitBox = (Horse) hider.getLocation().getWorld().spawnEntity(hider.getLocation().add(0, 1000, 0), EntityType.HORSE); + hitBox.setAI(false); + hitBox.setGravity(false); + hitBox.setInvulnerable(true); + hitBox.setCanPickupItems(false); + hitBox.setCollidable(false); + hitBox.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000, 0,false, false)); + if(Main.getInstance().supports(9)){ + hidden.addEntry(hitBox.getUniqueId().toString()); + } } } \ No newline at end of file -- cgit v1.2.3-freya From a353e29246f2d86ccd771734791f525420c1cf34 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Sat, 30 Jul 2022 18:49:18 -0400 Subject: refactoring and blockhunt disguise bug fixes --- pom.xml | 117 ++++++++++++--------- .../java/net/tylermurphy/hideAndSeek/Main.java | 2 - .../net/tylermurphy/hideAndSeek/command/Debug.java | 12 +-- .../tylermurphy/hideAndSeek/command/SetBorder.java | 5 +- .../tylermurphy/hideAndSeek/command/SetBounds.java | 33 +++--- .../net/tylermurphy/hideAndSeek/command/Top.java | 2 - .../tylermurphy/hideAndSeek/database/Database.java | 1 + .../hideAndSeek/database/GameDataTable.java | 7 +- .../hideAndSeek/database/InventoryTable.java | 5 +- .../hideAndSeek/database/LegacyTable.java | 3 - .../hideAndSeek/database/NameDataTable.java | 4 +- .../database/util/LegacyPlayerInfo.java | 8 +- .../net/tylermurphy/hideAndSeek/game/Board.java | 2 + .../tylermurphy/hideAndSeek/game/EntityHider.java | 12 ++- .../net/tylermurphy/hideAndSeek/game/Game.java | 4 +- .../tylermurphy/hideAndSeek/game/PlayerLoader.java | 7 +- .../hideAndSeek/game/listener/DisguiseHandler.java | 7 +- .../hideAndSeek/game/listener/InteractHandler.java | 23 ++-- .../game/listener/JoinLeaveHandler.java | 1 - .../hideAndSeek/game/listener/MovementHandler.java | 1 - .../hideAndSeek/game/util/Disguise.java | 74 ++++++------- .../hideAndSeek/util/PAPIExpansion.java | 1 + .../hideAndSeek/util/packet/AbstractPacket.java | 31 ++++++ .../hideAndSeek/util/packet/BlockChangePacket.java | 24 +++++ .../util/packet/EntityTeleportPacket.java | 29 +++++ .../hideAndSeek/world/VoidGenerator.java | 4 +- 26 files changed, 241 insertions(+), 178 deletions(-) create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/util/packet/BlockChangePacket.java create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityTeleportPacket.java (limited to 'src/main/java/net/tylermurphy') diff --git a/pom.xml b/pom.xml index cb6097e..e6ff5de 100644 --- a/pom.xml +++ b/pom.xml @@ -3,71 +3,84 @@ KenshinsHideAndSeek 1.6.0 Hide and Seek Plugin - - UTF-8 - + + clean install + src/main/java + - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 8 - 8 - - org.apache.maven.plugins maven-shade-plugin 3.2.4 - - false - - - com.cryptomorin.xseries - net.tylermurphy.dependencies.xseries - - - - - com.github.cryptomorin:XSeries - org.xerial:sqlite-jdbc - org.mariadb.jdbc:mariadb-java-client - com.zaxxer:HikariCP - - - - - *:* - - META-INF/*.MF - META-INF/*.MD - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - sqlite-jdbc.properties - - - - - - META-INF/services/java.sql.Driver - - - true - package shade + + false + + + com.cryptomorin.xseries + net.tylermurphy.dependencies.xseries + + + com.zaxxer.hikari + net.tylermurphy.dependencies.hikari + + + org.ibex.nestedvm + net.tylermurphy.dependencies.nestedvm + + + org.sqlite + net.tylermurphy.dependencies.sqlite + + + + + com.github.cryptomorin:XSeries + org.xerial:sqlite-jdbc + org.mariadb.jdbc:mariadb-java-client + com.zaxxer:HikariCP + + + + + *:* + + META-INF/** + sqlite-jdbc.properties + mariadb.properties + + + + + + META-INF/services/java.sql.Driver + + + true + + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + + spigot-repo @@ -87,8 +100,14 @@ org.spigotmc spigot-api 1.13-R0.1-SNAPSHOT - jar provided + + + junit + * + + + jar com.comphenix.protocol diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java index c4666df..08f1d3e 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java @@ -34,9 +34,7 @@ import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.event.Listener; -import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.plugin.java.JavaPluginLoader; import org.jetbrains.annotations.NotNull; import java.io.File; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java index 7ddc72c..61d0c46 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java @@ -73,16 +73,10 @@ public class Debug implements ICommand { } player.teleport(new Location(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); })); - debugMenu.setItem(7, createOption(7, Material.ENDER_PEARL, "&d&lTeleport: &fLobby", 2, player -> { - player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(), lobbyPosition.getY(), lobbyPosition.getZ())); - })); - debugMenu.setItem(8, createOption(8, Material.ENDER_PEARL, "&d&lTeleport: &fExit", 3, player -> { - player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); - })); + debugMenu.setItem(7, createOption(7, Material.ENDER_PEARL, "&d&lTeleport: &fLobby", 2, player -> player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(), lobbyPosition.getY(), lobbyPosition.getZ())))); + debugMenu.setItem(8, createOption(8, Material.ENDER_PEARL, "&d&lTeleport: &fExit", 3, player -> player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())))); debugMenu.setItem(9, createOption(9, XMaterial.GLASS.parseMaterial(), "&dEnable Disguise", 1, PlayerLoader::openBlockHuntPicker)); - debugMenu.setItem(10, createOption(10, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> { - Main.getInstance().getDisguiser().reveal(player); - })); + debugMenu.setItem(10, createOption(10, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> Main.getInstance().getDisguiser().reveal(player))); } private ItemStack createOption(int slow, Material material, String name, int amount, Consumer callback){ diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java index 45e66b9..b456e6a 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java @@ -68,10 +68,9 @@ public class SetBorder implements ICommand { return; } Vector vec = new Vector(); - Player player = (Player) sender; - vec.setX(player.getLocation().getBlockX()); + vec.setX(sender.getLocation().getBlockX()); vec.setY(0); - vec.setZ(player.getLocation().getBlockZ()); + vec.setZ(sender.getLocation().getBlockZ()); if (spawnPosition.distance(vec) > 100) { sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION")); return; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java index 90ecb28..434e4a6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java @@ -37,12 +37,11 @@ public class SetBounds implements ICommand { sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN")); return; } - Player player = (Player) sender; - if (!player.getWorld().getName().equals(spawnWorld)) { + if (!sender.getWorld().getName().equals(spawnWorld)) { sender.sendMessage(errorPrefix + message("BOUNDS_WRONG_WORLD")); return; } - if (player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0) { + if (sender.getLocation().getBlockX() == 0 || sender.getLocation().getBlockZ() == 0) { sender.sendMessage(errorPrefix + message("NOT_AT_ZERO")); return; } @@ -51,32 +50,32 @@ public class SetBounds implements ICommand { saveMinX = 0; saveMinZ= 0; saveMaxX = 0; saveMaxZ = 0; } if (saveMaxX == 0) { - addToConfig("bounds.max.x", player.getLocation().getBlockX()); - saveMaxX = player.getLocation().getBlockX(); - } else if (saveMaxX < player.getLocation().getBlockX()) { + addToConfig("bounds.max.x", sender.getLocation().getBlockX()); + saveMaxX = sender.getLocation().getBlockX(); + } else if (saveMaxX < sender.getLocation().getBlockX()) { first = false; - addToConfig("bounds.max.x", player.getLocation().getBlockX()); + addToConfig("bounds.max.x", sender.getLocation().getBlockX()); addToConfig("bounds.min.x", saveMaxX); saveMinX = saveMaxX; - saveMaxX = player.getLocation().getBlockX(); + saveMaxX = sender.getLocation().getBlockX(); } else { first = false; - addToConfig("bounds.min.x", player.getLocation().getBlockX()); - saveMinX = player.getLocation().getBlockX(); + addToConfig("bounds.min.x", sender.getLocation().getBlockX()); + saveMinX = sender.getLocation().getBlockX(); } if (saveMaxZ == 0) { - addToConfig("bounds.max.z", player.getLocation().getBlockZ()); - saveMaxZ = player.getLocation().getBlockZ(); - } else if (saveMaxZ < player.getLocation().getBlockZ()) { + addToConfig("bounds.max.z", sender.getLocation().getBlockZ()); + saveMaxZ = sender.getLocation().getBlockZ(); + } else if (saveMaxZ < sender.getLocation().getBlockZ()) { first = false; - addToConfig("bounds.max.z", player.getLocation().getBlockZ()); + addToConfig("bounds.max.z", sender.getLocation().getBlockZ()); addToConfig("bounds.min.z", saveMaxZ); saveMinZ = saveMaxZ; - saveMaxZ = player.getLocation().getBlockZ(); + saveMaxZ = sender.getLocation().getBlockZ(); } else { first = false; - addToConfig("bounds.min.z", player.getLocation().getBlockZ()); - saveMinZ = player.getLocation().getBlockZ(); + addToConfig("bounds.min.z", sender.getLocation().getBlockZ()); + saveMinZ = sender.getLocation().getBlockZ(); } sender.sendMessage(messagePrefix + message("BOUNDS").addAmount(first ? 1 : 2)); saveConfig(); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java index 6125a00..72a695c 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java @@ -21,9 +21,7 @@ package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.database.util.PlayerInfo; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import java.util.List; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java index 8afc4ba..e7bfb26 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java @@ -104,6 +104,7 @@ public class Database { } } + @SuppressWarnings("UnstableApiUsage") protected UUID decodeUUID(byte[] bytes) { InputStream is = new ByteArrayInputStream(bytes); ByteBuffer buffer = ByteBuffer.allocate(16); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java index 929356e..8f0ddde 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java @@ -200,8 +200,7 @@ public class GameDataTable { } } - protected boolean updateInfo(@NotNull byte[] 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){ - boolean success; + protected void updateInfo(byte[] 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){ 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 (?,?,?,?,?,?,?,?,?)"; try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) { statement.setBytes(1, uuid); @@ -214,16 +213,12 @@ public class GameDataTable { statement.setInt(8, hider_deaths); statement.setInt(9, seeker_deaths); statement.execute(); - statement.close(); - success = true; } catch (SQLException e) { Main.getInstance().getLogger().severe("SQL Error: " + e.getMessage()); e.printStackTrace(); - success = false; } finally { CACHE.remove(database.decodeUUID(uuid)); } - return success; } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java index 814ea5e..0ff2225 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java @@ -58,19 +58,16 @@ public class InventoryTable { return null; } - public boolean saveInventory(@NotNull UUID uuid, @NotNull ItemStack[] itemArray) { + public void saveInventory(@NotNull UUID uuid, @NotNull ItemStack[] itemArray) { String sql = "INSERT OR REPLACE INTO hs_inventory (uuid, inventory) VALUES (?,?)"; String data = itemStackArrayToBase64(itemArray); try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) { statement.setBytes(1, database.encodeUUID(uuid)); statement.setString(2, data); statement.execute(); - statement.close(); - return true; } catch (SQLException e) { Main.getInstance().getLogger().severe("SQL Error: " + e.getMessage()); e.printStackTrace(); - return false; } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/LegacyTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/LegacyTable.java index 580c2f5..e134c22 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/LegacyTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/LegacyTable.java @@ -19,8 +19,6 @@ package net.tylermurphy.hideAndSeek.database; -import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.database.Database; import net.tylermurphy.hideAndSeek.database.util.LegacyPlayerInfo; import java.sql.Connection; @@ -63,7 +61,6 @@ public class LegacyTable { while(resultSet.next()){ legacyPlayerInfoList.add(new LegacyPlayerInfo( resultSet.getBytes("uuid"), - resultSet.getInt("wins"), resultSet.getInt("hider_wins"), resultSet.getInt("seeker_wins"), resultSet.getInt("games_played") diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java index dd32507..02d90cf 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java @@ -25,7 +25,6 @@ import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.management.BufferPoolMXBean; import java.sql.*; import java.util.UUID; @@ -66,13 +65,14 @@ public class NameDataTable { e.printStackTrace(); } OfflinePlayer retry = Bukkit.getOfflinePlayer(uuid); - if(retry != null){ + if(retry != null && retry.getName() != null){ this.update(uuid, retry.getName()); return retry.getName(); } return null; } + @SuppressWarnings("deprecation") @Nullable public UUID getUUID(@NotNull String name) { String sql = "SELECT * FROM hs_names WHERE name = ?;"; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/util/LegacyPlayerInfo.java b/src/main/java/net/tylermurphy/hideAndSeek/database/util/LegacyPlayerInfo.java index 5b59779..067ab0b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/util/LegacyPlayerInfo.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/util/LegacyPlayerInfo.java @@ -19,19 +19,15 @@ package net.tylermurphy.hideAndSeek.database.util; -import java.util.UUID; - public class LegacyPlayerInfo { private final byte[] uniqueId; - private final int totalWins; private final int hiderWins; private final int seekerWins; private final int gamesPlayed; - public LegacyPlayerInfo(byte[] uniqueId, int totalWins, int hiderWins, int seekerWins, int gamesPlayed) { + public LegacyPlayerInfo(byte[] uniqueId, int hiderWins, int seekerWins, int gamesPlayed) { this.uniqueId = uniqueId; - this.totalWins = totalWins; this.hiderWins = hiderWins; this.seekerWins = seekerWins; this.gamesPlayed = gamesPlayed; @@ -41,8 +37,6 @@ public class LegacyPlayerInfo { return uniqueId; } - public int getTotalWins() { return totalWins; } - public int getHiderWins() { return hiderWins; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index cf91c23..6bf0bfb 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -35,6 +35,7 @@ import java.util.stream.Collectors; import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; +@SuppressWarnings("deprecation") public class Board { private final List Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>(); @@ -363,6 +364,7 @@ public class Board { } +@SuppressWarnings("deprecation") class CustomBoard { private final Scoreboard board; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java index 9dcb0ab..8274655 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java @@ -3,7 +3,7 @@ package net.tylermurphy.hideAndSeek.game; import static com.comphenix.protocol.PacketType.Play.Server.*; import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; +import java.util.Collections; import java.util.Map; import org.bukkit.entity.Entity; @@ -30,9 +30,9 @@ public class EntityHider implements Listener { protected Table observerEntityMap = HashBasedTable.create(); private static final PacketType[] ENTITY_PACKETS = { - ENTITY_EQUIPMENT, BED, ANIMATION, NAMED_ENTITY_SPAWN, + ENTITY_EQUIPMENT, ANIMATION, NAMED_ENTITY_SPAWN, COLLECT, SPAWN_ENTITY, SPAWN_ENTITY_LIVING, SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_EXPERIENCE_ORB, - ENTITY_VELOCITY, REL_ENTITY_MOVE, ENTITY_LOOK, ENTITY_MOVE_LOOK, ENTITY_MOVE_LOOK, + ENTITY_VELOCITY, REL_ENTITY_MOVE, ENTITY_LOOK, ENTITY_TELEPORT, ENTITY_HEAD_ROTATION, ENTITY_STATUS, ATTACH_ENTITY, ENTITY_METADATA, ENTITY_EFFECT, REMOVE_ENTITY_EFFECT, BLOCK_BREAK_ANIMATION }; @@ -193,6 +193,7 @@ public class EntityHider implements Listener { * @param entity - the entity to toggle. * @return TRUE if the entity was visible before, FALSE otherwise. */ + @SuppressWarnings("unused") public final boolean toggleEntity(Player observer, Entity entity) { if (isVisible(observer, entity.getEntityId())) { return hideEntity(observer, entity); @@ -213,7 +214,7 @@ public class EntityHider implements Listener { // Resend packets if (manager != null && hiddenBefore) { - manager.updateEntity(entity, Arrays.asList(observer)); + manager.updateEntity(entity, Collections.singletonList(observer)); } return hiddenBefore; } @@ -253,6 +254,7 @@ public class EntityHider implements Listener { * @param entity - the entity that may be hidden. * @return TRUE if the player may see the entity, FALSE if the entity has been hidden. */ + @SuppressWarnings("unused") public final boolean canSee(Player observer, Entity entity) { validate(observer, entity); @@ -268,10 +270,12 @@ public class EntityHider implements Listener { * Retrieve the current visibility policy. * @return The current visibility policy. */ + @SuppressWarnings("unused") public Policy getPolicy() { return policy; } + @SuppressWarnings("unused") public void close() { if (manager != null) { HandlerList.unregisterAll(bukkitListener); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 87fa4a2..b3fd457 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -107,7 +107,8 @@ public class Game { public void start() { try { Optional rand = board.getPlayers().stream().skip(new Random().nextInt(board.size())).findFirst(); - String seekerName = rand.get().getName(); + Player picked = rand.orElse(board.getPlayers().get(0)); + String seekerName = picked.getName(); Player temp = Bukkit.getPlayer(seekerName); Player seeker = board.getPlayer(temp.getUniqueId()); start(seeker); @@ -210,6 +211,7 @@ public class Game { handleBungeeLeave(player); } + @SuppressWarnings("UnstableApiUsage") private void handleBungeeLeave(Player player) { if (bungeeLeave) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java index 0447111..bd35ab5 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java @@ -19,7 +19,6 @@ package net.tylermurphy.hideAndSeek.game; -import com.cryptomorin.xseries.XItemStack; import com.cryptomorin.xseries.messages.Titles; import net.md_5.bungee.api.ChatColor; import net.tylermurphy.hideAndSeek.Main; @@ -27,7 +26,6 @@ import net.tylermurphy.hideAndSeek.configuration.Items; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Player; @@ -40,6 +38,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.lobbyPosition; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; +@SuppressWarnings("deprecation") public class PlayerLoader { public static void loadHider(Player player, String gameWorld){ @@ -69,9 +68,7 @@ public class PlayerLoader { player.setFallDistance(0.0F); player.getInventory().setItem(flightToggleItemPosition, flightToggleItem); player.getInventory().setItem(teleportItemPosition, teleportItem); - Main.getInstance().getBoard().getPlayers().forEach(otherPlayer -> { - otherPlayer.hidePlayer(player); - }); + Main.getInstance().getBoard().getPlayers().forEach(otherPlayer -> otherPlayer.hidePlayer(player)); Titles.sendTitle(player, 10, 70, 20, ChatColor.GRAY + "" + ChatColor.BOLD + "SPECTATING", ChatColor.WHITE + message("SPECTATOR_SUBTITLE").toString()); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java index 587fab9..50c45fb 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java @@ -7,7 +7,6 @@ import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; -import com.comphenix.protocol.wrappers.BlockPosition; import com.cryptomorin.xseries.XMaterial; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.util.Disguise; @@ -27,19 +26,17 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import org.bukkit.util.BlockVector; import java.util.ArrayList; import java.util.List; +@SuppressWarnings("deprecation") public class DisguiseHandler implements Listener { private static final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); - private final PacketAdapter packetListener; public DisguiseHandler(){ - packetListener = createProtocol(); - protocolManager.addPacketListener(packetListener); + protocolManager.addPacketListener(createProtocol()); } @EventHandler(priority = EventPriority.HIGHEST) 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 c8dd488..3440780 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java @@ -22,6 +22,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.glowPowerupItem; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; +@SuppressWarnings("deprecation") public class InteractHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) @@ -96,25 +97,21 @@ public class InteractHandler implements Listener { 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)); - }); + 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)); - }); + 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, (byte) 3); - SkullMeta playerheadmeta = (SkullMeta) playerhead.getItemMeta(); - playerheadmeta.setOwner(player.getName()); - playerheadmeta.setDisplayName(player.getName()); - playerheadmeta.setLore(lore); - playerhead.setItemMeta(playerheadmeta); - return playerhead; + ItemStack playerHead = new ItemStack(XMaterial.PLAYER_HEAD.parseMaterial(), 1, (byte) 3); + SkullMeta playerHeadMeta = (SkullMeta) playerHead.getItemMeta(); + playerHeadMeta.setOwner(player.getName()); + playerHeadMeta.setDisplayName(player.getName()); + playerHeadMeta.setLore(lore); + playerHead.setItemMeta(playerHeadMeta); + return playerHead; } } 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 82369c8..6d88ebf 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java @@ -15,7 +15,6 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition; 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 d38c512..e6e32f6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java @@ -1,6 +1,5 @@ package net.tylermurphy.hideAndSeek.game.listener; -import com.comphenix.protocol.PacketType; import com.google.common.collect.Sets; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.listener.events.PlayerJumpEvent; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java index 330aefe..b0f18a9 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java @@ -1,12 +1,8 @@ package net.tylermurphy.hideAndSeek.game.util; -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.ProtocolManager; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.BlockPosition; -import com.comphenix.protocol.wrappers.WrappedBlockData; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.util.packet.BlockChangePacket; +import net.tylermurphy.hideAndSeek.util.packet.EntityTeleportPacket; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -16,17 +12,14 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.Team; -import java.lang.reflect.InvocationTargetException; - +@SuppressWarnings("deprecation") public class Disguise { - private static final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); - final Player hider; final Material material; FallingBlock block; Horse hitBox; - Location solidLocation; + Location blockLocation; boolean solid, solidify; static Team hidden; @@ -64,7 +57,7 @@ public class Disguise { hitBox.remove(); } if(solid) - sendBlockUpdate(Material.AIR); + sendBlockUpdate(blockLocation, Material.AIR); hider.removePotionEffect(PotionEffectType.INVISIBILITY); if(Main.getInstance().supports(9)) { hidden.removeEntry(hider.getName()); @@ -97,18 +90,18 @@ public class Disguise { if(solidify){ if(!solid) { solid = true; - solidLocation = hider.getLocation().getBlock().getLocation(); - respawnHotbox(); - teleportEntity(hitBox, false); + blockLocation = hider.getLocation().getBlock().getLocation(); + respawnHitbox(); + teleportEntity(hitBox, true); } - sendBlockUpdate(material); + sendBlockUpdate(blockLocation, material); } else if(solid){ solid = false; if(Main.getInstance().supports(9)) hidden.removeEntry(hitBox.getUniqueId().toString()); hitBox.remove(); hitBox = null; - sendBlockUpdate(Material.AIR); + sendBlockUpdate(blockLocation, Material.AIR); } toggleEntityVisibility(block, !solid); teleportEntity(block, solid); @@ -118,38 +111,33 @@ public class Disguise { this.solidify = value; } - private void sendBlockUpdate(Material material){ - final PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.BLOCK_CHANGE); - packet.getModifier().writeDefaults(); - packet.getBlockPositionModifier().write(0, new BlockPosition(solidLocation.toVector())); - packet.getBlockData().write(0, WrappedBlockData.createData(material)); + private void sendBlockUpdate(Location location, Material material){ + BlockChangePacket packet = new BlockChangePacket(); + packet.setBlockPosition(location); + packet.setMaterial(material); Bukkit.getOnlinePlayers().forEach(receiver -> { - if(receiver == hider) return; - try { - protocolManager.sendServerPacket(receiver, packet); - } catch (InvocationTargetException ignored) {} + if(receiver.getName().equals(hider.getName())) return; + packet.send(receiver); }); } private void teleportEntity(Entity entity, boolean center) { - final PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_TELEPORT); - Location location = hider.getLocation(); - packet.getModifier().writeDefaults(); - packet.getIntegers().write(0, entity.getEntityId()); + EntityTeleportPacket packet = new EntityTeleportPacket(); + packet.setEntity(entity); + double x,y,z; if(center){ - packet.getDoubles().write(0, Math.round(location.getX()+.5)-.5); - packet.getDoubles().write(1, (double)Math.round(location.getY())); - packet.getDoubles().write(2, Math.round(location.getZ()+.5)-.5); + x = Math.round(hider.getLocation().getX()+.5)-.5; + y = Math.round(hider.getLocation().getY()); + z = Math.round(hider.getLocation().getZ()+.5)-.5; } else { - packet.getDoubles().write(0, location.getX()); - packet.getDoubles().write(1, location.getY()); - packet.getDoubles().write(2, location.getZ()); + x = hider.getLocation().getX(); + y = hider.getLocation().getY(); + z = hider.getLocation().getZ(); } - Bukkit.getOnlinePlayers().forEach(receiver -> { - try { - protocolManager.sendServerPacket(receiver, packet); - } catch (InvocationTargetException ignored) {} - }); + packet.setX(x); + packet.setY(y); + packet.setZ(z); + Bukkit.getOnlinePlayers().forEach(packet::send); } private void toggleEntityVisibility(Entity entity, boolean show){ @@ -164,13 +152,13 @@ public class Disguise { } private void respawnFallingBlock(){ - block = hider.getLocation().getWorld().spawnFallingBlock(hider.getLocation(), material, (byte)0); + block = hider.getLocation().getWorld().spawnFallingBlock(hider.getLocation().add(0, 1000, 0), material, (byte)0); block.setGravity(false); block.setDropItem(false); block.setInvulnerable(true); } - private void respawnHotbox(){ + private void respawnHitbox(){ hitBox = (Horse) hider.getLocation().getWorld().spawnEntity(hider.getLocation().add(0, 1000, 0), EntityType.HORSE); hitBox.setAI(false); hitBox.setGravity(false); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java index 032deca..8e4078e 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/PAPIExpansion.java @@ -36,6 +36,7 @@ public class PAPIExpansion extends PlaceholderExpansion { return true; } + @SuppressWarnings("ConstantConditions") @Override public String onRequest(OfflinePlayer player, @NotNull String params) { Database database = Main.getInstance().getDatabase(); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java new file mode 100644 index 0000000..9293beb --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java @@ -0,0 +1,31 @@ +package net.tylermurphy.hideAndSeek.util.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import org.bukkit.entity.Player; + +import java.lang.reflect.InvocationTargetException; + +public class AbstractPacket { + + private static final ProtocolManager protocolManager; + static { + protocolManager = ProtocolLibrary.getProtocolManager(); + } + + protected final PacketContainer packet; + + protected AbstractPacket(PacketType type){ + packet = protocolManager.createPacket(type); + packet.getModifier().writeDefaults(); + } + + public void send(Player player){ + try { + protocolManager.sendServerPacket(player, packet); + } catch (InvocationTargetException ignored) {} + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/BlockChangePacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/BlockChangePacket.java new file mode 100644 index 0000000..53f3f9c --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/BlockChangePacket.java @@ -0,0 +1,24 @@ +package net.tylermurphy.hideAndSeek.util.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.wrappers.BlockPosition; +import com.comphenix.protocol.wrappers.WrappedBlockData; +import org.bukkit.Location; +import org.bukkit.Material; +import org.jetbrains.annotations.NotNull; + +public class BlockChangePacket extends AbstractPacket { + + public BlockChangePacket(){ + super(PacketType.Play.Server.BLOCK_CHANGE); + } + + public void setBlockPosition(@NotNull Location location){ + super.packet.getBlockPositionModifier().write(0, new BlockPosition(location.toVector())); + } + + public void setMaterial(Material material){ + super.packet.getBlockData().write(0, WrappedBlockData.createData(material)); + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityTeleportPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityTeleportPacket.java new file mode 100644 index 0000000..b3c7734 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityTeleportPacket.java @@ -0,0 +1,29 @@ +package net.tylermurphy.hideAndSeek.util.packet; + +import com.comphenix.protocol.PacketType; +import org.bukkit.entity.Entity; +import org.jetbrains.annotations.NotNull; + +public class EntityTeleportPacket extends AbstractPacket { + + public EntityTeleportPacket(){ + super(PacketType.Play.Server.ENTITY_TELEPORT); + } + + public void setEntity(@NotNull Entity entity){ + super.packet.getIntegers().write(0, entity.getEntityId()); + } + + public void setX(double x){ + super.packet.getDoubles().write(0, x); + } + + public void setY(double y){ + super.packet.getDoubles().write(1, y); + } + + public void setZ(double z){ + super.packet.getDoubles().write(2, z); + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java b/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java index cf4b062..a81aa51 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java @@ -28,8 +28,10 @@ import java.util.Collections; import java.util.List; import java.util.Random; +@SuppressWarnings({"unused"}) public class VoidGenerator extends ChunkGenerator{ + // 1.14 And On public @NotNull List getDefaultPopulators(@NotNull World world) { return Collections.emptyList(); } @@ -66,7 +68,7 @@ public class VoidGenerator extends ChunkGenerator{ return true; } - // Backwards compatibility + // 1.13 And Prev public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { return createChunkData(world); } } -- cgit v1.2.3-freya From 911469c746d127c91e02f14dfaaa96f1d99575c6 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Mon, 1 Aug 2022 17:15:13 -0400 Subject: creative mode should not be attackable --- .../java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/main/java/net/tylermurphy') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java index 50c45fb..10db324 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java @@ -11,6 +11,7 @@ import com.cryptomorin.xseries.XMaterial; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.util.Disguise; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.attribute.Attribute; @@ -73,6 +74,7 @@ public class DisguiseHandler implements Listener { Disguise disguise = Main.getInstance().getDisguiser().getByEntityID(id); if(disguise == null) disguise = Main.getInstance().getDisguiser().getByHitBoxID(id); if(disguise == null) return; + if(disguise.getPlayer().getGameMode() == GameMode.CREATIVE) return; event.setCancelled(true); handleAttack(disguise, player); } -- cgit v1.2.3-freya From 1a47dc680a25ba6a546fe769f227156090d30e3e Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Wed, 3 Aug 2022 20:19:41 -0400 Subject: load version number before config --- src/main/java/net/tylermurphy/hideAndSeek/Main.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/main/java/net/tylermurphy') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java index 08f1d3e..4d8581f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java @@ -58,11 +58,12 @@ public class Main extends JavaPlugin implements Listener { public void onEnable() { Main.instance = this; + this.updateVersion(); + Config.loadConfig(); Localization.loadLocalization(); Items.loadItems(); - this.updateVersion(); this.board = new Board(); this.database = new Database(); this.disguiser = new Disguiser(); -- cgit v1.2.3-freya From 0ff07e57e0755ef322601493d851cd668f7d8992 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Sun, 7 Aug 2022 16:39:31 -0400 Subject: 1.8 block and disguise hitbox not loading fix --- src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java | 2 +- src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java | 6 ++++++ src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) (limited to 'src/main/java/net/tylermurphy') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index f988d5a..4130ec7 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -292,7 +292,7 @@ public class Config { } bungeeLeave = config.getString("leaveType") == null || config.getString("leaveType").equalsIgnoreCase("proxy"); leaveServer = config.getString("leaveServer"); - blockhuntEnabled = config.getBoolean("blockhunt.enabled"); + blockhuntEnabled = config.getBoolean("blockhunt.enabled") && Main.getInstance().supports(9); blockhuntBlocks = new ArrayList<>(); tempInteracts = config.getStringList("blockhunt.blocks"); for(String id : tempInteracts) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java index a14827b..2f8cbf6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java @@ -1,5 +1,7 @@ package net.tylermurphy.hideAndSeek.game; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; + import net.tylermurphy.hideAndSeek.game.util.Disguise; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -46,6 +48,10 @@ public class Disguiser { } public void disguise(Player player, Material material){ + if(!blockhuntEnabled){ + player.sendMessage(errorPrefix + "Please enable blockhunt in config.yml to enable disguises. Blockhunt does not work on 1.8"); + return; + } if(disguises.containsKey(player)){ disguises.get(player).remove(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java index b0f18a9..e29350b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java @@ -92,7 +92,6 @@ public class Disguise { solid = true; blockLocation = hider.getLocation().getBlock().getLocation(); respawnHitbox(); - teleportEntity(hitBox, true); } sendBlockUpdate(blockLocation, material); } else if(solid){ @@ -104,6 +103,7 @@ public class Disguise { sendBlockUpdate(blockLocation, Material.AIR); } toggleEntityVisibility(block, !solid); + teleportEntity(hitBox, true); teleportEntity(block, solid); } @@ -122,6 +122,7 @@ public class Disguise { } private void teleportEntity(Entity entity, boolean center) { + if(entity == null) return; EntityTeleportPacket packet = new EntityTeleportPacket(); packet.setEntity(entity); double x,y,z; -- cgit v1.2.3-freya