diff --git a/pom.xml b/pom.xml index df2ab1b..4cf22dd 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,7 @@ 4.0.0 net.tylermurphy KenshinsHideAndSeek - 1.7.0 + 1.7.1 Hide and Seek Plugin @@ -47,8 +47,6 @@ *:* META-INF/** - sqlite-jdbc.properties - mariadb.properties @@ -113,7 +111,7 @@ org.xerial sqlite-jdbc - 3.39.3.0 + 3.40.1.0 org.jetbrains @@ -123,23 +121,23 @@ com.github.cryptomorin XSeries - 9.1.0 + 9.2.0 me.clip placeholderapi - 2.11.1 + 2.11.2 provided com.zaxxer HikariCP - 5.0.1 + 4.0.3 org.mariadb.jdbc mariadb-java-client - 3.0.6 + 3.1.2 \ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java index 64bf5d4..2c05115 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java @@ -36,7 +36,7 @@ public class Border implements ICommand { addToConfig("worldBorder.enabled",false); saveConfig(); sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE")); - Main.getInstance().getGame().getCurrentMap().getWorldBorder().resetWorldBorder(); + map.getWorldBorder().resetWorldBorder(); return; } int num,delay,change; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java index 0cb307b..98f2f4f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java @@ -51,7 +51,7 @@ public class CommandGroup { if (data == null) { player.sendMessage( - String.format("%s%sKenshin's Hide and Seek %s(%s1.7.0%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY, ChatColor.WHITE, ChatColor.GRAY) + + String.format("%s%sKenshin's Hide and Seek %s(%s1.7.1%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY, ChatColor.WHITE, ChatColor.GRAY) + String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) + String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE) ); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index 5881d19..9fc7009 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -61,7 +61,10 @@ public class Config { mapSaveEnabled, allowNaturalCauses, saveInventory, - delayedRespawn; + delayedRespawn, + spawnPatch, + dropItems, + regenHealth; public static int minPlayers, @@ -115,7 +118,7 @@ public class Config { announceMessagesToNonPlayers = config.getBoolean("announceMessagesToNonPlayers"); //Prefix - char SYMBOL = '\u00A7'; + char SYMBOL = '§'; String SYMBOL_STRING = String.valueOf(SYMBOL); messagePrefix = config.getString("prefix.default").replace("&", SYMBOL_STRING); @@ -237,6 +240,10 @@ public class Config { delayedRespawn = config.getBoolean("delayedRespawn.enabled"); delayedRespawnDelay = Math.max(0,config.getInt("delayedRespawn.delay")); + spawnPatch = config.getBoolean("spawnPatch"); + dropItems = config.getBoolean("dropItems"); + regenHealth = config.getBoolean("regenHealth"); + } public static void addToConfig(String path, Object value) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java index a23a1f7..394bbf3 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java @@ -15,224 +15,227 @@ import static net.tylermurphy.hideAndSeek.configuration.Config.*; public class Map { - private final String name; + private final String name; - private Location - spawnPosition = Location.getDefault(), - lobbyPosition = Location.getDefault(), - seekerLobbyPosition = Location.getDefault(); + private Location + spawnPosition = Location.getDefault(), + lobbyPosition = Location.getDefault(), + seekerLobbyPosition = Location.getDefault(); - private int - xBoundMin = 0, - zBoundMin = 0, - xBoundMax = 0, - zBoundMax = 0, - xWorldBorder = 0, - zWorldBorder = 0, - worldBorderSize = 0, - worldBorderDelay = 0, - worldBorderChange = 0; + private int + xBoundMin = 0, + zBoundMin = 0, + xBoundMax = 0, + zBoundMax = 0, + xWorldBorder = 0, + zWorldBorder = 0, + worldBorderSize = 0, + worldBorderDelay = 0, + worldBorderChange = 0; - private boolean - blockhunt = false; + private boolean + blockhunt = false; - private List - blockhuntBlocks = new ArrayList<>(); + private List + blockhuntBlocks = new ArrayList<>(); - private final Border - worldBorder; + private final Border + worldBorder; - private final WorldLoader - worldLoader; + private final WorldLoader + worldLoader; - public Map(String name) { - this.name = name; - this.worldBorder = new Border(this); - this.worldLoader = new WorldLoader(this); - } - - public void setSpawn(Location pos) { - this.spawnPosition = pos; - } - - public void setLobby(Location pos) { - this.lobbyPosition = pos; - } - - public void setSeekerLobby(Location pos) { - this.seekerLobbyPosition = pos; - } - - public void setWorldBorderData(int x, int z, int size, int delay, int move) { - if(size < 1) { - this.worldBorderSize = 0; - this.worldBorderDelay = 0; - this.worldBorderChange = 0; - this.xWorldBorder = 0; - this.zWorldBorder = 0; - } else { - this.worldBorderSize = size; - this.worldBorderDelay = delay; - this.worldBorderChange = move; - this.xWorldBorder = x; - this.zWorldBorder = z; + public Map(String name) { + this.name = name; + this.worldBorder = new Border(this); + this.worldLoader = new WorldLoader(this); } - this.worldBorder.resetWorldBorder(); - } - public void setBlockhunt(boolean enabled, List blocks) { - if (Main.getInstance().supports(9)) { - this.blockhunt = enabled; - } else { - this.blockhunt = false; + public void setSpawn(Location pos) { + this.spawnPosition = pos; } - this.blockhuntBlocks = blocks; - } - public void setBoundMin(int x, int z) { - this.xBoundMin = x; - this.zBoundMin = z; - } - - public void setBoundMax(int x, int z) { - this.xBoundMax = x; - this.zBoundMax = z; - } - - @NotNull - public Location getGameSpawn() { - if(mapSaveEnabled) { - return spawnPosition.changeWorld("hs_"+name); - } else { - return spawnPosition; + public void setLobby(Location pos) { + this.lobbyPosition = pos; } - } - @NotNull - public String getGameSpawnName() { - if(mapSaveEnabled) - return getGameSpawn().getWorld(); - else - return getSpawn().getWorld(); - } - - @NotNull - public Location getSpawn() { - return spawnPosition; - } - - @NotNull - public String getSpawnName() { - return getSpawn().getWorld(); - } - - @NotNull - public Location getLobby() { - return lobbyPosition; - } - - @NotNull - public String getLobbyName() { - return getLobby().getWorld(); - } - - @NotNull - public Location getSeekerLobby() { - return seekerLobbyPosition; - } - - @NotNull - public String getSeekerLobbyName() { - return getSeekerLobby().getWorld(); - } - - @NotNull - public Location getGameSeekerLobby() { - if(mapSaveEnabled) { - return seekerLobbyPosition.changeWorld("hs_"+name); - } else { - return seekerLobbyPosition; + public void setSeekerLobby(Location pos) { + this.seekerLobbyPosition = pos; } - } - public boolean isWorldBorderEnabled() { - return worldBorderSize > 0; - } + public void setWorldBorderData(int x, int z, int size, int delay, int move) { + if(size < 1) { + this.worldBorderSize = 0; + this.worldBorderDelay = 0; + this.worldBorderChange = 0; + this.xWorldBorder = 0; + this.zWorldBorder = 0; + } else { + this.worldBorderSize = size; + this.worldBorderDelay = delay; + this.worldBorderChange = move; + this.xWorldBorder = x; + this.zWorldBorder = z; + } + this.worldBorder.resetWorldBorder(); + } - @NotNull - public Vector getWorldBorderPos() { - return new Vector( - xWorldBorder, - 0, - zWorldBorder - ); - } + public void setBlockhunt(boolean enabled, List blocks) { + if (Main.getInstance().supports(9)) { + this.blockhunt = enabled; + } else { + this.blockhunt = false; + } + this.blockhuntBlocks = blocks; + } - @NotNull - public Vector getWorldBorderData() { - return new Vector( - worldBorderSize, - worldBorderDelay, - worldBorderChange - ); - } + public void setBoundMin(int x, int z) { + this.xBoundMin = x; + this.zBoundMin = z; + } - @NotNull - public Border getWorldBorder() { - return worldBorder; - } + public void setBoundMax(int x, int z) { + this.xBoundMax = x; + this.zBoundMax = z; + } - public boolean isBlockHuntEnabled() { - return blockhunt; - } + @NotNull + public Location getGameSpawn() { + if(mapSaveEnabled) { + return spawnPosition.changeWorld("hs_"+name); + } else { + return spawnPosition; + } + } - @NotNull - public List getBlockHunt() { - return blockhuntBlocks; - } + @NotNull + public String getGameSpawnName() { + if(mapSaveEnabled) + return getGameSpawn().getWorld(); + else + return getSpawn().getWorld(); + } - @NotNull - public Vector getBoundsMin() { - return new Vector( - xBoundMin, - 0, - zBoundMin - ); - } + @NotNull + public Location getSpawn() { + return spawnPosition; + } - @NotNull - public Vector getBoundsMax() { - return new Vector( - xBoundMax, - 0, - zBoundMax - ); - } + @NotNull + public String getSpawnName() { + return getSpawn().getWorld(); + } - @NotNull - public String getName() { - return name; - } + @NotNull + public Location getLobby() { + return lobbyPosition; + } - @NotNull - public WorldLoader getWorldLoader() { - return worldLoader; - } + @NotNull + public String getLobbyName() { + return getLobby().getWorld(); + } - public boolean isNotSetup() { - if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0 || !spawnPosition.exists()) return true; - if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0 || !lobbyPosition.exists()) return true; - if (exitPosition == null || exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0 || !exitPosition.exists()) return true; - if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0 || !seekerLobbyPosition.exists()) return true; - if (mapSaveEnabled && !getGameSpawn().exists()) return true; - if (blockhunt && blockhuntBlocks.isEmpty()) return true; - if(isWorldBorderEnabled() && - new Vector(spawnPosition.getX(), 0, spawnPosition.getZ()).distance(new Vector(xWorldBorder, 0, zWorldBorder)) > 100) return true; - return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0; - } + @NotNull + public Location getSeekerLobby() { + return seekerLobbyPosition; + } - public boolean isBoundsNotSetup() { - return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0; - } + @NotNull + public String getSeekerLobbyName() { + return getSeekerLobby().getWorld(); + } + + @NotNull + public Location getGameSeekerLobby() { + if(mapSaveEnabled) { + return seekerLobbyPosition.changeWorld("hs_"+name); + } else { + return seekerLobbyPosition; + } + } + + public boolean isWorldBorderEnabled() { + return worldBorderSize > 0; + } + + @NotNull + public Vector getWorldBorderPos() { + return new Vector( + xWorldBorder, + 0, + zWorldBorder + ); + } + + @NotNull + public Vector getWorldBorderData() { + return new Vector( + worldBorderSize, + worldBorderDelay, + worldBorderChange + ); + } + + @NotNull + public Border getWorldBorder() { + return worldBorder; + } + + public boolean isBlockHuntEnabled() { + return blockhunt; + } + + @NotNull + public List getBlockHunt() { + return blockhuntBlocks; + } + + @NotNull + public Vector getBoundsMin() { + return new Vector( + xBoundMin, + 0, + zBoundMin + ); + } + + @NotNull + public Vector getBoundsMax() { + return new Vector( + xBoundMax, + 0, + zBoundMax + ); + } + + @NotNull + public String getName() { + return name; + } + + @NotNull + public WorldLoader getWorldLoader() { + return worldLoader; + } + + public boolean isNotSetup() { + if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0 || !spawnPosition.exists()) return true; + if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0 || !lobbyPosition.exists()) return true; + if (exitPosition == null || exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0 || !exitPosition.exists()) return true; + if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0 || !seekerLobbyPosition.exists()) return true; + if (mapSaveEnabled && !getGameSpawn().exists()) return true; + if (blockhunt && blockhuntBlocks.isEmpty()) return true; + if(isWorldBorderEnabled() && + new Vector(spawnPosition.getX(), 0, spawnPosition.getZ()).distance(new Vector(xWorldBorder, 0, zWorldBorder)) > 100) return true; + return isBoundsNotSetup(); + } + + public boolean isBoundsNotSetup() { + if (xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0) return true; + int xDiff = xBoundMax - xBoundMin; + int zDiff = zBoundMax - zBoundMin; + return xDiff < 5 || zDiff < 5; + } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java index dca2de0..1c56fe7 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java @@ -14,6 +14,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.UUID; +import static net.tylermurphy.hideAndSeek.configuration.Config.databasePort; import static net.tylermurphy.hideAndSeek.configuration.Config.databaseType; public class Database { @@ -25,12 +26,14 @@ public class Database { public Database(){ - if(databaseType.equals("SQLITE")) { + if(databaseType.equalsIgnoreCase("SQLITE")) { Main.getInstance().getLogger().info("SQLITE database chosen"); connection = new SQLiteConnection(); - } else { + } else if(databaseType.equalsIgnoreCase("MYSQL")) { Main.getInstance().getLogger().info("MYSQL database chosen"); connection = new MySQLConnection(); + } else { + throw new IllegalArgumentException("Invalid database type: " + databaseType); } playerInfo = new GameDataTable(this); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java index c01f615..87378f9 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java @@ -201,7 +201,7 @@ public class GameDataTable { } 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 (?,?,?,?,?,?,?,?,?)"; + String sql = "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); statement.setInt(2, hider_wins); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java index 0ff2225..b023801 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java @@ -59,7 +59,7 @@ public class InventoryTable { } public void saveInventory(@NotNull UUID uuid, @NotNull ItemStack[] itemArray) { - String sql = "INSERT OR REPLACE INTO hs_inventory (uuid, inventory) VALUES (?,?)"; + String sql = "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)); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java index 02d90cf..4cc77fc 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java @@ -96,7 +96,7 @@ public class NameDataTable { } public boolean update(@NotNull UUID uuid, @NotNull String name){ - String sql = "INSERT OR REPLACE INTO hs_names (uuid, name) VALUES (?,?)"; + String sql = "REPLACE INTO hs_names (uuid, name) VALUES (?,?)"; try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) { statement.setBytes(1, database.encodeUUID(uuid)); statement.setString(2, name); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java index 56f53f6..e237e71 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java @@ -25,6 +25,7 @@ import net.tylermurphy.hideAndSeek.Main; import java.sql.Connection; import java.sql.SQLException; +import java.sql.Statement; import static net.tylermurphy.hideAndSeek.configuration.Config.*; @@ -43,7 +44,8 @@ public class MySQLConnection implements DatabaseConnection { Main.getInstance().getLogger().info("Database name: " + databaseName); - config.setJdbcUrl("jdbc:mariadb://"+databaseHost+":"+databasePort+"/"+databaseName); + config.setDriverClassName(org.mariadb.jdbc.Driver.class.getName()); + config.setJdbcUrl("jdbc:mariadb://"+databaseHost+":"+databasePort+"/"+databaseName.trim()); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java index 3892f6f..755e89d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java @@ -2,7 +2,6 @@ package net.tylermurphy.hideAndSeek.game; import static com.comphenix.protocol.PacketType.Play.Server.*; -import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Map; @@ -31,7 +30,7 @@ public class EntityHider implements Listener { private static final PacketType[] ENTITY_PACKETS = { ENTITY_EQUIPMENT, ANIMATION, NAMED_ENTITY_SPAWN, - COLLECT, SPAWN_ENTITY, SPAWN_ENTITY_LIVING, SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_EXPERIENCE_ORB, + COLLECT, SPAWN_ENTITY, SPAWN_ENTITY_EXPERIENCE_ORB, 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 @@ -85,26 +84,38 @@ public class EntityHider implements Listener { /** * Add or remove the given entity and observer entry from the table. * @param observer - the player observer. - * @param entityID - ID of the entity. + * @param newEntityId - 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) { + protected boolean setMembership(Player observer, int newEntityId, boolean member) { + int entityID; + try { + entityID = observer.getEntityId(); + } catch (Exception e) { + return member; + } if (member) { - return observerEntityMap.put(observer.getEntityId(), entityID, true) != null; + return observerEntityMap.put(newEntityId, entityID, true) != null; } else { - return observerEntityMap.remove(observer.getEntityId(), entityID) != null; + return observerEntityMap.remove(newEntityId, 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. + * @param newEntityID - 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); + protected boolean getMembership(Player observer, int newEntityID) { + int entityID; + try { + entityID = observer.getEntityId(); + } catch (Exception e) { + return false; + } + return observerEntityMap.contains(entityID, newEntityID); } /** @@ -125,7 +136,12 @@ public class EntityHider implements Listener { * @param entity - the entity to remove. */ protected void removeEntity(Entity entity) { - int entityID = entity.getEntityId(); + int entityID; + try { + entityID = entity.getEntityId(); + } catch (Exception e) { + return; + } for (Map maps : observerEntityMap.rowMap().values()) { maps.remove(entityID); @@ -137,8 +153,13 @@ public class EntityHider implements Listener { * @param player - the player that jused logged out. */ protected void removePlayer(Player player) { - // Cleanup - observerEntityMap.rowMap().remove(player.getEntityId()); + int entityID; + try { + entityID = player.getEntityId(); + } catch (Exception e) { + return; + } + observerEntityMap.rowMap().remove(entityID); } /** @@ -195,7 +216,13 @@ public class EntityHider implements Listener { */ @SuppressWarnings("unused") public final boolean toggleEntity(Player observer, Entity entity) { - if (isVisible(observer, entity.getEntityId())) { + int entityID; + try { + entityID = observer.getEntityId(); + } catch (Exception e) { + return true; + } + if (isVisible(observer, entityID)) { return hideEntity(observer, entity); } else { return !showEntity(observer, entity); @@ -210,7 +237,13 @@ public class EntityHider implements Listener { */ public final boolean showEntity(Player observer, Entity entity) { validate(observer, entity); - boolean hiddenBefore = !setVisibility(observer, entity.getEntityId(), true); + int entityID; + try { + entityID = entity.getEntityId(); + } catch (Exception e) { + return false; + } + boolean hiddenBefore = !setVisibility(observer, entityID, true); // Resend packets if (manager != null && hiddenBefore) { @@ -227,12 +260,18 @@ public class EntityHider implements Listener { */ public final boolean hideEntity(Player observer, Entity entity) { validate(observer, entity); - boolean visibleBefore = setVisibility(observer, entity.getEntityId(), false); + int entityID; + try { + entityID = entity.getEntityId(); + } catch (Exception e) { + return true; + } + boolean visibleBefore = setVisibility(observer, entityID, false); if (visibleBefore) { PacketContainer destroyEntity = new PacketContainer(ENTITY_DESTROY); try { - destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()}); + destroyEntity.getIntegerArrays().write(0, new int[]{entityID}); } catch (Exception e){ return false; } // Make the entity disappear manager.sendServerPacket(observer, destroyEntity); @@ -253,8 +292,13 @@ public class EntityHider implements Listener { @SuppressWarnings("unused") public final boolean canSee(Player observer, Entity entity) { validate(observer, entity); - - return isVisible(observer, entity.getEntityId()); + int entityID; + try { + entityID = entity.getEntityId(); + } catch (Exception e) { + return true; + } + return isVisible(observer, entityID); } private void validate(Player observer, Entity entity) { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index e18a309..41df9b8 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -186,7 +186,9 @@ public class Game { PlayerLoader.unloadPlayer(player); if(saveInventory) { ItemStack[] data = Main.getInstance().getDatabase().getInventoryData().getInventory(player.getUniqueId()); - player.getInventory().setContents(data); + try { + player.getInventory().setContents(data); + } catch (NullPointerException ignored){} } if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player)); else broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player)); @@ -240,6 +242,9 @@ public class Game { } } else { lobbyTimer = -1; + if (gameTick % 20 == 0) { + board.reloadLobbyBoards(); + } } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java index 10157cd..4ee1f5c 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java @@ -128,7 +128,6 @@ 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()); } 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 c80e83f..68eb26b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java @@ -7,6 +7,10 @@ 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.EnumWrappers; +import com.comphenix.protocol.wrappers.WrappedEnumEntityUseAction; +import com.cryptomorin.xseries.XSound; +import com.cryptomorin.xseries.messages.ActionBar; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.util.Disguise; import org.bukkit.Bukkit; @@ -33,17 +37,13 @@ public class DisguiseHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onMove(PlayerMoveEvent event) { - 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); - }, 20 * 3); - if(event.getFrom().distance(event.getTo()) > .1) + final Player player = event.getPlayer(); + final Disguise disguise = Main.getInstance().getDisguiser().getDisguise(player); + if(disguise == null) return;; + if(event.getFrom().distance(event.getTo()) > .1) { disguise.setSolidify(false); + } + disguise.startSolidifying(); } private PacketAdapter createProtocol(){ @@ -52,6 +52,12 @@ public class DisguiseHandler implements Listener { @Override public void onPacketReceiving(PacketEvent event){ PacketContainer packet = event.getPacket(); + + // only left click attacks + WrappedEnumEntityUseAction action = packet.getEnumEntityUseActions().getValues().stream().findFirst().orElse(null); + if (action == null) return; + if (action.getAction() != EnumWrappers.EntityUseAction.ATTACK) return; + Player player = event.getPlayer(); int id = packet.getIntegers().read(0); Disguise disguise = Main.getInstance().getDisguiser().getByEntityID(id); 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 1dd6cfc..290b679 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java @@ -51,7 +51,7 @@ public class MovementHandler implements Listener { if (!Main.getInstance().getBoard().contains(event.getPlayer())) return; if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) return; if (!event.getTo().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) return; - if (event.getPlayer().hasPermission("hideandseek.leavebounds")) return; + if (event.getPlayer().hasPermission("hs.leavebounds")) return; Map map = Main.getInstance().getGame().getCurrentMap(); if (event.getTo().getBlockX() < map.getBoundsMin().getBlockX() || event.getTo().getBlockX() > map.getBoundsMax().getBlockX() || event.getTo().getBlockZ() < map.getBoundsMin().getZ() || event.getTo().getBlockZ() > map.getBoundsMax().getZ()) { event.setCancelled(true); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java index d34cb11..760f1f9 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java @@ -13,6 +13,9 @@ import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.inventory.ItemStack; +import static net.tylermurphy.hideAndSeek.configuration.Config.dropItems; +import static net.tylermurphy.hideAndSeek.configuration.Config.regenHealth; + public class PlayerHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) @@ -25,6 +28,7 @@ public class PlayerHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerRegainHealth(EntityRegainHealthEvent event) { + if (regenHealth) return; if (event.getRegainReason() == EntityRegainHealthEvent.RegainReason.SATIATED || event.getRegainReason() == EntityRegainHealthEvent.RegainReason.REGEN) { if (event.getEntity() instanceof Player) { if (!Main.getInstance().getBoard().contains((Player) event.getEntity())) return; @@ -35,7 +39,7 @@ public class PlayerHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onItemDrop(PlayerDropItemEvent event) { - if (Main.getInstance().getBoard().contains(event.getPlayer())) { + if (!dropItems && Main.getInstance().getBoard().contains(event.getPlayer())) { event.setCancelled(true); } } @@ -44,7 +48,8 @@ public class PlayerHandler implements Listener { public void onItemSpawn(ItemSpawnEvent event){ if(Main.getInstance().getGame().getStatus() == Status.STANDBY) return; ItemStack item = event.getEntity().getItemStack(); - if(!Items.matchItem(item)) return; + if (!Items.matchItem(item)) return; + if (dropItems) return; event.setCancelled(true); } 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 b9ea09b..b3460d0 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Disguise.java @@ -1,5 +1,7 @@ package net.tylermurphy.hideAndSeek.game.util; +import com.cryptomorin.xseries.XSound; +import com.cryptomorin.xseries.messages.ActionBar; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.util.packet.BlockChangePacket; import net.tylermurphy.hideAndSeek.util.packet.EntityTeleportPacket; @@ -20,7 +22,7 @@ public class Disguise { FallingBlock block; Horse hitBox; Location blockLocation; - boolean solid, solidify; + boolean solid, solidify, solidifying; static Team hidden; static { @@ -172,4 +174,37 @@ public class Disguise { } } + public void startSolidifying() { + if (solidifying) return; + if (solid) return; + solidifying = true; + final Location lastLocation = hider.getLocation(); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> solidifyUpdate(lastLocation, 3), 10); + } + + private void solidifyUpdate(Location lastLocation, int time) { + Location currentLocation = hider.getLocation(); + if(lastLocation.getWorld() != currentLocation.getWorld()) { + solidifying = false; + return; + } + if(lastLocation.distance(currentLocation) > .1) { + solidifying = false; + return; + } + if(time == 0) { + ActionBar.clearActionBar(hider); + setSolidify(true); + solidifying = false; + } else { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < time; i++) { + s.append("▪"); + } + ActionBar.sendActionBar(hider, s.toString()); + XSound.BLOCK_NOTE_BLOCK_PLING.play(hider, 1, 1); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> solidifyUpdate(lastLocation, time - 1), 20); + } + } + } \ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java b/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java index 606b64b..916b6f9 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java @@ -11,6 +11,8 @@ import org.jetbrains.annotations.NotNull; import java.io.File; +import static net.tylermurphy.hideAndSeek.configuration.Config.spawnPatch; + public class Location { private final String world; @@ -87,7 +89,11 @@ public class Location { public void teleport(Player player) { if(!exists()) return; if(load() == null) return; - player.teleport(toBukkit()); + if (spawnPatch) { + Main.getInstance().scheduleTask(() -> player.teleport(toBukkit())); + } else { + player.teleport(toBukkit()); + } } public Location changeWorld(String world) { @@ -139,7 +145,7 @@ public class Location { } public boolean isNotInBounds(int xmin, int xmax, int zmin, int zmax) { - return getBlockX() < xmin || getBlockX() > xmax || getBlockZ() < zmin || getBlockZ() > zmax; + return getBlockX() <= xmin || getBlockX() >= xmax || getBlockZ() <= zmin || getBlockZ() >= zmax; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 82b9379..5316402 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -6,6 +6,11 @@ # +--------------------------------------------------------+ # #============================================================# +# If you are having weird issues with your server where it's printing to the console +# "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH", try enabling the +# below spawn patch. WARNING: this will NOT work if you use Multiverse Inventory's. +spawnPatch: false + # How long in seconds will the game last, set it < 1 to disable # default: 1200 aka 20min gameLength: 1200 @@ -14,6 +19,10 @@ gameLength: 1200 # default: true announceMessagesToNonPlayers: true +# Allow players to drop their items in game +# default: false +dropItems: false + # When the game is starting, the plugin will state there is x seconds left to hide. # You change where countdown messages are to be displayed: in the chat, action bar, or a title. # Below you can set CHAT, ACTIONBAR, or TITLE. Any invalid option will revert to CHAT. @@ -46,6 +55,10 @@ minPlayers: 2 # default: true pvp: true +# Allow players to regen health +# default: false +regenHealth: false + # !! Only effects the game at all if pvp is set to false !! # By default, If you disable pvp, Hiders and Seekers can no longer take damage from natural causes such as # falling or projectiles. If you want, you can keep pvp disabled so that Seekers only have to tag Hiders, but diff --git a/src/main/resources/maps.yml b/src/main/resources/maps.yml index 8505162..a8d9865 100644 --- a/src/main/resources/maps.yml +++ b/src/main/resources/maps.yml @@ -1 +1,3 @@ +# PLEASE DO NOT EDIT THIS FILE +# ONLY EDIT IF YOU KNOW WHAT YOU ARE DOING maps: \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c6ce455..a857be1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: KenshinsHideAndSeek main: net.tylermurphy.hideAndSeek.Main -version: 1.7.0 +version: 1.7.1 author: KenshinEto load: STARTUP api-version: 1.13 @@ -72,4 +72,6 @@ permissions: default: op hs.confirm: default: op + hs.leavebounds: + default: false