Merge pull request '1.7.1 - A few tweaks and bug squashes' (#5) from dev into main

Reviewed-on: https://g.tylerm.dev/tylermurphy534/KenshinsHideAndSeek/pulls/5
This commit is contained in:
tylermurphy534 2023-02-08 23:24:53 +00:00
commit b87174e770
21 changed files with 378 additions and 248 deletions

14
pom.xml
View file

@ -1,7 +1,7 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<groupId>net.tylermurphy</groupId> <groupId>net.tylermurphy</groupId>
<artifactId>KenshinsHideAndSeek</artifactId> <artifactId>KenshinsHideAndSeek</artifactId>
<version>1.7.0</version> <version>1.7.1</version>
<name>Hide and Seek Plugin</name> <name>Hide and Seek Plugin</name>
<properties> <properties>
@ -47,8 +47,6 @@
<artifact>*:*</artifact> <artifact>*:*</artifact>
<excludes> <excludes>
<exclude>META-INF/**</exclude> <exclude>META-INF/**</exclude>
<exclude>sqlite-jdbc.properties</exclude>
<exclude>mariadb.properties</exclude>
</excludes> </excludes>
</filter> </filter>
</filters> </filters>
@ -113,7 +111,7 @@
<dependency> <dependency>
<groupId>org.xerial</groupId> <groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId> <artifactId>sqlite-jdbc</artifactId>
<version>3.39.3.0</version> <version>3.40.1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jetbrains</groupId> <groupId>org.jetbrains</groupId>
@ -123,23 +121,23 @@
<dependency> <dependency>
<groupId>com.github.cryptomorin</groupId> <groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId> <artifactId>XSeries</artifactId>
<version>9.1.0</version> <version>9.2.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>me.clip</groupId> <groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId> <artifactId>placeholderapi</artifactId>
<version>2.11.1</version> <version>2.11.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.zaxxer</groupId> <groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId> <artifactId>HikariCP</artifactId>
<version>5.0.1</version> <version>4.0.3</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mariadb.jdbc</groupId> <groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId> <artifactId>mariadb-java-client</artifactId>
<version>3.0.6</version> <version>3.1.2</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View file

@ -36,7 +36,7 @@ public class Border implements ICommand {
addToConfig("worldBorder.enabled",false); addToConfig("worldBorder.enabled",false);
saveConfig(); saveConfig();
sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE")); sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE"));
Main.getInstance().getGame().getCurrentMap().getWorldBorder().resetWorldBorder(); map.getWorldBorder().resetWorldBorder();
return; return;
} }
int num,delay,change; int num,delay,change;

View file

@ -51,7 +51,7 @@ public class CommandGroup {
if (data == null) { if (data == null) {
player.sendMessage( 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("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) +
String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE) String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE)
); );

View file

@ -61,7 +61,10 @@ public class Config {
mapSaveEnabled, mapSaveEnabled,
allowNaturalCauses, allowNaturalCauses,
saveInventory, saveInventory,
delayedRespawn; delayedRespawn,
spawnPatch,
dropItems,
regenHealth;
public static int public static int
minPlayers, minPlayers,
@ -115,7 +118,7 @@ public class Config {
announceMessagesToNonPlayers = config.getBoolean("announceMessagesToNonPlayers"); announceMessagesToNonPlayers = config.getBoolean("announceMessagesToNonPlayers");
//Prefix //Prefix
char SYMBOL = '\u00A7'; char SYMBOL = '§';
String SYMBOL_STRING = String.valueOf(SYMBOL); String SYMBOL_STRING = String.valueOf(SYMBOL);
messagePrefix = config.getString("prefix.default").replace("&", SYMBOL_STRING); messagePrefix = config.getString("prefix.default").replace("&", SYMBOL_STRING);
@ -237,6 +240,10 @@ public class Config {
delayedRespawn = config.getBoolean("delayedRespawn.enabled"); delayedRespawn = config.getBoolean("delayedRespawn.enabled");
delayedRespawnDelay = Math.max(0,config.getInt("delayedRespawn.delay")); 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) { public static void addToConfig(String path, Object value) {

View file

@ -15,224 +15,227 @@ import static net.tylermurphy.hideAndSeek.configuration.Config.*;
public class Map { public class Map {
private final String name; private final String name;
private Location private Location
spawnPosition = Location.getDefault(), spawnPosition = Location.getDefault(),
lobbyPosition = Location.getDefault(), lobbyPosition = Location.getDefault(),
seekerLobbyPosition = Location.getDefault(); seekerLobbyPosition = Location.getDefault();
private int private int
xBoundMin = 0, xBoundMin = 0,
zBoundMin = 0, zBoundMin = 0,
xBoundMax = 0, xBoundMax = 0,
zBoundMax = 0, zBoundMax = 0,
xWorldBorder = 0, xWorldBorder = 0,
zWorldBorder = 0, zWorldBorder = 0,
worldBorderSize = 0, worldBorderSize = 0,
worldBorderDelay = 0, worldBorderDelay = 0,
worldBorderChange = 0; worldBorderChange = 0;
private boolean private boolean
blockhunt = false; blockhunt = false;
private List<Material> private List<Material>
blockhuntBlocks = new ArrayList<>(); blockhuntBlocks = new ArrayList<>();
private final Border private final Border
worldBorder; worldBorder;
private final WorldLoader private final WorldLoader
worldLoader; worldLoader;
public Map(String name) { public Map(String name) {
this.name = name; this.name = name;
this.worldBorder = new Border(this); this.worldBorder = new Border(this);
this.worldLoader = new WorldLoader(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;
} }
this.worldBorder.resetWorldBorder();
}
public void setBlockhunt(boolean enabled, List<Material> blocks) { public void setSpawn(Location pos) {
if (Main.getInstance().supports(9)) { this.spawnPosition = pos;
this.blockhunt = enabled;
} else {
this.blockhunt = false;
} }
this.blockhuntBlocks = blocks;
}
public void setBoundMin(int x, int z) { public void setLobby(Location pos) {
this.xBoundMin = x; this.lobbyPosition = pos;
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;
} }
}
@NotNull public void setSeekerLobby(Location pos) {
public String getGameSpawnName() { this.seekerLobbyPosition = pos;
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 boolean isWorldBorderEnabled() { public void setWorldBorderData(int x, int z, int size, int delay, int move) {
return worldBorderSize > 0; 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 void setBlockhunt(boolean enabled, List<Material> blocks) {
public Vector getWorldBorderPos() { if (Main.getInstance().supports(9)) {
return new Vector( this.blockhunt = enabled;
xWorldBorder, } else {
0, this.blockhunt = false;
zWorldBorder }
); this.blockhuntBlocks = blocks;
} }
@NotNull public void setBoundMin(int x, int z) {
public Vector getWorldBorderData() { this.xBoundMin = x;
return new Vector( this.zBoundMin = z;
worldBorderSize, }
worldBorderDelay,
worldBorderChange
);
}
@NotNull public void setBoundMax(int x, int z) {
public Border getWorldBorder() { this.xBoundMax = x;
return worldBorder; this.zBoundMax = z;
} }
public boolean isBlockHuntEnabled() { @NotNull
return blockhunt; public Location getGameSpawn() {
} if(mapSaveEnabled) {
return spawnPosition.changeWorld("hs_"+name);
} else {
return spawnPosition;
}
}
@NotNull @NotNull
public List<Material> getBlockHunt() { public String getGameSpawnName() {
return blockhuntBlocks; if(mapSaveEnabled)
} return getGameSpawn().getWorld();
else
return getSpawn().getWorld();
}
@NotNull @NotNull
public Vector getBoundsMin() { public Location getSpawn() {
return new Vector( return spawnPosition;
xBoundMin, }
0,
zBoundMin
);
}
@NotNull @NotNull
public Vector getBoundsMax() { public String getSpawnName() {
return new Vector( return getSpawn().getWorld();
xBoundMax, }
0,
zBoundMax
);
}
@NotNull @NotNull
public String getName() { public Location getLobby() {
return name; return lobbyPosition;
} }
@NotNull @NotNull
public WorldLoader getWorldLoader() { public String getLobbyName() {
return worldLoader; return getLobby().getWorld();
} }
public boolean isNotSetup() { @NotNull
if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0 || !spawnPosition.exists()) return true; public Location getSeekerLobby() {
if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0 || !lobbyPosition.exists()) return true; return seekerLobbyPosition;
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;
}
public boolean isBoundsNotSetup() { @NotNull
return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0; 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<Material> 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;
}
} }

View file

@ -14,6 +14,7 @@ import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.UUID; import java.util.UUID;
import static net.tylermurphy.hideAndSeek.configuration.Config.databasePort;
import static net.tylermurphy.hideAndSeek.configuration.Config.databaseType; import static net.tylermurphy.hideAndSeek.configuration.Config.databaseType;
public class Database { public class Database {
@ -25,12 +26,14 @@ public class Database {
public Database(){ public Database(){
if(databaseType.equals("SQLITE")) { if(databaseType.equalsIgnoreCase("SQLITE")) {
Main.getInstance().getLogger().info("SQLITE database chosen"); Main.getInstance().getLogger().info("SQLITE database chosen");
connection = new SQLiteConnection(); connection = new SQLiteConnection();
} else { } else if(databaseType.equalsIgnoreCase("MYSQL")) {
Main.getInstance().getLogger().info("MYSQL database chosen"); Main.getInstance().getLogger().info("MYSQL database chosen");
connection = new MySQLConnection(); connection = new MySQLConnection();
} else {
throw new IllegalArgumentException("Invalid database type: " + databaseType);
} }
playerInfo = new GameDataTable(this); playerInfo = new GameDataTable(this);

View file

@ -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){ 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)) { try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setBytes(1, uuid); statement.setBytes(1, uuid);
statement.setInt(2, hider_wins); statement.setInt(2, hider_wins);

View file

@ -59,7 +59,7 @@ public class InventoryTable {
} }
public void 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 sql = "REPLACE INTO hs_inventory (uuid, inventory) VALUES (?,?)";
String data = itemStackArrayToBase64(itemArray); String data = itemStackArrayToBase64(itemArray);
try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) { try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setBytes(1, database.encodeUUID(uuid)); statement.setBytes(1, database.encodeUUID(uuid));

View file

@ -96,7 +96,7 @@ public class NameDataTable {
} }
public boolean update(@NotNull UUID uuid, @NotNull String name){ 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)) { try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setBytes(1, database.encodeUUID(uuid)); statement.setBytes(1, database.encodeUUID(uuid));
statement.setString(2, name); statement.setString(2, name);

View file

@ -25,6 +25,7 @@ import net.tylermurphy.hideAndSeek.Main;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement;
import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Config.*;
@ -43,7 +44,8 @@ public class MySQLConnection implements DatabaseConnection {
Main.getInstance().getLogger().info("Database name: " + databaseName); 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("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

View file

@ -2,7 +2,6 @@ package net.tylermurphy.hideAndSeek.game;
import static com.comphenix.protocol.PacketType.Play.Server.*; import static com.comphenix.protocol.PacketType.Play.Server.*;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
@ -31,7 +30,7 @@ public class EntityHider implements Listener {
private static final PacketType[] ENTITY_PACKETS = { private static final PacketType[] ENTITY_PACKETS = {
ENTITY_EQUIPMENT, ANIMATION, NAMED_ENTITY_SPAWN, 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_VELOCITY, REL_ENTITY_MOVE, ENTITY_LOOK,
ENTITY_TELEPORT, ENTITY_HEAD_ROTATION, ENTITY_STATUS, ATTACH_ENTITY, ENTITY_METADATA, ENTITY_TELEPORT, ENTITY_HEAD_ROTATION, ENTITY_STATUS, ATTACH_ENTITY, ENTITY_METADATA,
ENTITY_EFFECT, REMOVE_ENTITY_EFFECT, BLOCK_BREAK_ANIMATION 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. * Add or remove the given entity and observer entry from the table.
* @param observer - the player observer. * @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. * @param member - TRUE if they should be present in the table, FALSE otherwise.
* @return TRUE if they already were present, 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) { if (member) {
return observerEntityMap.put(observer.getEntityId(), entityID, true) != null; return observerEntityMap.put(newEntityId, entityID, true) != null;
} else { } 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. * Determine if the given entity and observer is present in the table.
* @param observer - the player observer. * @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. * @return TRUE if they are present, FALSE otherwise.
*/ */
protected boolean getMembership(Player observer, int entityID) { protected boolean getMembership(Player observer, int newEntityID) {
return observerEntityMap.contains(observer.getEntityId(), entityID); 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. * @param entity - the entity to remove.
*/ */
protected void removeEntity(Entity entity) { protected void removeEntity(Entity entity) {
int entityID = entity.getEntityId(); int entityID;
try {
entityID = entity.getEntityId();
} catch (Exception e) {
return;
}
for (Map<Integer, Boolean> maps : observerEntityMap.rowMap().values()) { for (Map<Integer, Boolean> maps : observerEntityMap.rowMap().values()) {
maps.remove(entityID); maps.remove(entityID);
@ -137,8 +153,13 @@ public class EntityHider implements Listener {
* @param player - the player that jused logged out. * @param player - the player that jused logged out.
*/ */
protected void removePlayer(Player player) { protected void removePlayer(Player player) {
// Cleanup int entityID;
observerEntityMap.rowMap().remove(player.getEntityId()); try {
entityID = player.getEntityId();
} catch (Exception e) {
return;
}
observerEntityMap.rowMap().remove(entityID);
} }
/** /**
@ -195,7 +216,13 @@ public class EntityHider implements Listener {
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final boolean toggleEntity(Player observer, Entity entity) { 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); return hideEntity(observer, entity);
} else { } else {
return !showEntity(observer, entity); return !showEntity(observer, entity);
@ -210,7 +237,13 @@ public class EntityHider implements Listener {
*/ */
public final boolean showEntity(Player observer, Entity entity) { public final boolean showEntity(Player observer, Entity entity) {
validate(observer, 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 // Resend packets
if (manager != null && hiddenBefore) { if (manager != null && hiddenBefore) {
@ -227,12 +260,18 @@ public class EntityHider implements Listener {
*/ */
public final boolean hideEntity(Player observer, Entity entity) { public final boolean hideEntity(Player observer, Entity entity) {
validate(observer, 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) { if (visibleBefore) {
PacketContainer destroyEntity = new PacketContainer(ENTITY_DESTROY); PacketContainer destroyEntity = new PacketContainer(ENTITY_DESTROY);
try { try {
destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()}); destroyEntity.getIntegerArrays().write(0, new int[]{entityID});
} catch (Exception e){ return false; } } catch (Exception e){ return false; }
// Make the entity disappear // Make the entity disappear
manager.sendServerPacket(observer, destroyEntity); manager.sendServerPacket(observer, destroyEntity);
@ -253,8 +292,13 @@ public class EntityHider implements Listener {
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final boolean canSee(Player observer, Entity entity) { public final boolean canSee(Player observer, Entity entity) {
validate(observer, entity); validate(observer, entity);
int entityID;
return isVisible(observer, entity.getEntityId()); try {
entityID = entity.getEntityId();
} catch (Exception e) {
return true;
}
return isVisible(observer, entityID);
} }
private void validate(Player observer, Entity entity) { private void validate(Player observer, Entity entity) {

View file

@ -186,7 +186,9 @@ public class Game {
PlayerLoader.unloadPlayer(player); PlayerLoader.unloadPlayer(player);
if(saveInventory) { if(saveInventory) {
ItemStack[] data = Main.getInstance().getDatabase().getInventoryData().getInventory(player.getUniqueId()); 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)); if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player));
else broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player)); else broadcastMessage(messagePrefix + message("GAME_LEAVE").addPlayer(player));
@ -240,6 +242,9 @@ public class Game {
} }
} else { } else {
lobbyTimer = -1; lobbyTimer = -1;
if (gameTick % 20 == 0) {
board.reloadLobbyBoards();
}
} }
} }

View file

@ -128,7 +128,6 @@ public class PlayerLoader {
player.setGameMode(GameMode.ADVENTURE); player.setGameMode(GameMode.ADVENTURE);
player.getInventory().clear(); player.getInventory().clear();
for(PotionEffect effect : player.getActivePotionEffects()) { 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; if(effect.getType().getName().equals("INVISIBILITY") && Main.getInstance().getDisguiser().disguised(player)) continue;
player.removePotionEffect(effect.getType()); player.removePotionEffect(effect.getType());
} }

View file

@ -7,6 +7,10 @@ import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent; 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.Main;
import net.tylermurphy.hideAndSeek.game.util.Disguise; import net.tylermurphy.hideAndSeek.game.util.Disguise;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -33,17 +37,13 @@ public class DisguiseHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onMove(PlayerMoveEvent event) { public void onMove(PlayerMoveEvent event) {
final Disguise disguise = Main.getInstance().getDisguiser().getDisguise(event.getPlayer()); final Player player = event.getPlayer();
if(disguise == null) return; final Disguise disguise = Main.getInstance().getDisguiser().getDisguise(player);
final Location lastLocation = event.getPlayer().getLocation(); if(disguise == null) return;;
Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { if(event.getFrom().distance(event.getTo()) > .1) {
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)
disguise.setSolidify(false); disguise.setSolidify(false);
}
disguise.startSolidifying();
} }
private PacketAdapter createProtocol(){ private PacketAdapter createProtocol(){
@ -52,6 +52,12 @@ public class DisguiseHandler implements Listener {
@Override @Override
public void onPacketReceiving(PacketEvent event){ public void onPacketReceiving(PacketEvent event){
PacketContainer packet = event.getPacket(); 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(); Player player = event.getPlayer();
int id = packet.getIntegers().read(0); int id = packet.getIntegers().read(0);
Disguise disguise = Main.getInstance().getDisguiser().getByEntityID(id); Disguise disguise = Main.getInstance().getDisguiser().getByEntityID(id);

View file

@ -51,7 +51,7 @@ public class MovementHandler implements Listener {
if (!Main.getInstance().getBoard().contains(event.getPlayer())) return; if (!Main.getInstance().getBoard().contains(event.getPlayer())) return;
if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) 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.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(); 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()) { 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); event.setCancelled(true);

View file

@ -13,6 +13,9 @@ import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.inventory.ItemStack; 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 { public class PlayerHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
@ -25,6 +28,7 @@ public class PlayerHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerRegainHealth(EntityRegainHealthEvent event) { public void onPlayerRegainHealth(EntityRegainHealthEvent event) {
if (regenHealth) return;
if (event.getRegainReason() == EntityRegainHealthEvent.RegainReason.SATIATED || event.getRegainReason() == EntityRegainHealthEvent.RegainReason.REGEN) { if (event.getRegainReason() == EntityRegainHealthEvent.RegainReason.SATIATED || event.getRegainReason() == EntityRegainHealthEvent.RegainReason.REGEN) {
if (event.getEntity() instanceof Player) { if (event.getEntity() instanceof Player) {
if (!Main.getInstance().getBoard().contains((Player) event.getEntity())) return; if (!Main.getInstance().getBoard().contains((Player) event.getEntity())) return;
@ -35,7 +39,7 @@ public class PlayerHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onItemDrop(PlayerDropItemEvent event) { public void onItemDrop(PlayerDropItemEvent event) {
if (Main.getInstance().getBoard().contains(event.getPlayer())) { if (!dropItems && Main.getInstance().getBoard().contains(event.getPlayer())) {
event.setCancelled(true); event.setCancelled(true);
} }
} }
@ -44,7 +48,8 @@ public class PlayerHandler implements Listener {
public void onItemSpawn(ItemSpawnEvent event){ public void onItemSpawn(ItemSpawnEvent event){
if(Main.getInstance().getGame().getStatus() == Status.STANDBY) return; if(Main.getInstance().getGame().getStatus() == Status.STANDBY) return;
ItemStack item = event.getEntity().getItemStack(); ItemStack item = event.getEntity().getItemStack();
if(!Items.matchItem(item)) return; if (!Items.matchItem(item)) return;
if (dropItems) return;
event.setCancelled(true); event.setCancelled(true);
} }

View file

@ -1,5 +1,7 @@
package net.tylermurphy.hideAndSeek.game.util; 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.Main;
import net.tylermurphy.hideAndSeek.util.packet.BlockChangePacket; import net.tylermurphy.hideAndSeek.util.packet.BlockChangePacket;
import net.tylermurphy.hideAndSeek.util.packet.EntityTeleportPacket; import net.tylermurphy.hideAndSeek.util.packet.EntityTeleportPacket;
@ -20,7 +22,7 @@ public class Disguise {
FallingBlock block; FallingBlock block;
Horse hitBox; Horse hitBox;
Location blockLocation; Location blockLocation;
boolean solid, solidify; boolean solid, solidify, solidifying;
static Team hidden; static Team hidden;
static { 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);
}
}
} }

View file

@ -11,6 +11,8 @@ import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import static net.tylermurphy.hideAndSeek.configuration.Config.spawnPatch;
public class Location { public class Location {
private final String world; private final String world;
@ -87,7 +89,11 @@ public class Location {
public void teleport(Player player) { public void teleport(Player player) {
if(!exists()) return; if(!exists()) return;
if(load() == null) 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) { public Location changeWorld(String world) {
@ -139,7 +145,7 @@ public class Location {
} }
public boolean isNotInBounds(int xmin, int xmax, int zmin, int zmax) { 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;
} }
} }

View file

@ -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 # How long in seconds will the game last, set it < 1 to disable
# default: 1200 aka 20min # default: 1200 aka 20min
gameLength: 1200 gameLength: 1200
@ -14,6 +19,10 @@ gameLength: 1200
# default: true # default: true
announceMessagesToNonPlayers: 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. # 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. # 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. # Below you can set CHAT, ACTIONBAR, or TITLE. Any invalid option will revert to CHAT.
@ -46,6 +55,10 @@ minPlayers: 2
# default: true # default: true
pvp: true pvp: true
# Allow players to regen health
# default: false
regenHealth: false
# !! Only effects the game at all if pvp is set to 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 # 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 # falling or projectiles. If you want, you can keep pvp disabled so that Seekers only have to tag Hiders, but

View file

@ -1 +1,3 @@
# PLEASE DO NOT EDIT THIS FILE
# ONLY EDIT IF YOU KNOW WHAT YOU ARE DOING
maps: maps:

View file

@ -1,6 +1,6 @@
name: KenshinsHideAndSeek name: KenshinsHideAndSeek
main: net.tylermurphy.hideAndSeek.Main main: net.tylermurphy.hideAndSeek.Main
version: 1.7.0 version: 1.7.1
author: KenshinEto author: KenshinEto
load: STARTUP load: STARTUP
api-version: 1.13 api-version: 1.13
@ -72,4 +72,6 @@ permissions:
default: op default: op
hs.confirm: hs.confirm:
default: op default: op
hs.leavebounds:
default: false