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