rewrite database and damage event, add placeholders

This commit is contained in:
Tyler Murphy 2022-05-07 23:54:48 -04:00
parent 134444243a
commit e89e5f932c
12 changed files with 353 additions and 145 deletions

10
pom.xml
View file

@ -74,6 +74,10 @@
<id>dmulloy2-repo</id> <id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url> <url>https://repo.dmulloy2.net/repository/public/</url>
</repository> </repository>
<repository>
<id>placeholderapi</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
@ -103,5 +107,11 @@
<artifactId>XSeries</artifactId> <artifactId>XSeries</artifactId>
<version>8.7.1</version> <version>8.7.1</version>
</dependency> </dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.1</version>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View file

@ -23,6 +23,7 @@ import java.io.File;
import java.util.List; import java.util.List;
import net.tylermurphy.hideAndSeek.database.Database; import net.tylermurphy.hideAndSeek.database.Database;
import net.tylermurphy.hideAndSeek.util.PAPIExpansion;
import net.tylermurphy.hideAndSeek.util.UUIDFetcher; import net.tylermurphy.hideAndSeek.util.UUIDFetcher;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -74,6 +75,10 @@ public class Main extends JavaPlugin implements Listener {
},0,1).getTaskId(); },0,1).getTaskId();
Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
if(Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
new PAPIExpansion().register();
}
} }
public void onDisable() { public void onDisable() {

View file

@ -66,8 +66,8 @@ public class Wins implements ICommand {
message = message + message("INFORMATION_FOR").addPlayer(name) + "\n"; message = message + message("INFORMATION_FOR").addPlayer(name) + "\n";
message = message + "==============================\n"; message = message + "==============================\n";
message = message + String.format("%sTOTAL WINS: %s%s\n%sHIDER WINS: %s%s\n%sSEEKER WINS: %s%s\n%sGAMES PLAYED: %s", message = message + String.format("%sTOTAL WINS: %s%s\n%sHIDER WINS: %s%s\n%sSEEKER WINS: %s%s\n%sGAMES PLAYED: %s",
ChatColor.YELLOW, ChatColor.WHITE, info.wins, ChatColor.GOLD, ChatColor.WHITE, info.hider_wins, ChatColor.YELLOW, ChatColor.WHITE, info.seeker_wins+info.hider_wins, ChatColor.GOLD, ChatColor.WHITE, info.hider_wins,
ChatColor.RED, ChatColor.WHITE, info.seeker_wins, ChatColor.WHITE, info.games_played); ChatColor.RED, ChatColor.WHITE, info.seeker_wins, ChatColor.WHITE, info.seeker_games+info.hider_games);
message = message + ChatColor.WHITE + "" + ChatColor.BOLD + "\n=============================="; message = message + ChatColor.WHITE + "" + ChatColor.BOLD + "\n==============================";
sender.sendMessage(message); sender.sendMessage(message);

View file

@ -79,7 +79,8 @@ public class Config {
bungeeLeave, bungeeLeave,
lobbyItemStartAdmin, lobbyItemStartAdmin,
leaveOnEnd, leaveOnEnd,
mapSaveEnabled; mapSaveEnabled,
allowNaturalCauses;
public static int public static int
minPlayers, minPlayers,
@ -251,6 +252,7 @@ public class Config {
permissionsRequired = config.getBoolean("permissionsRequired"); permissionsRequired = config.getBoolean("permissionsRequired");
gameLength = config.getInt("gameLength"); gameLength = config.getInt("gameLength");
pvpEnabled = config.getBoolean("pvp"); pvpEnabled = config.getBoolean("pvp");
allowNaturalCauses = config.getBoolean("allowNaturalCauses");
autoJoin = config.getBoolean("autoJoin"); autoJoin = config.getBoolean("autoJoin");
teleportToExit = config.getBoolean("teleportToExit"); teleportToExit = config.getBoolean("teleportToExit");
locale = config.getString("locale", "local"); locale = config.getString("locale", "local");

View file

@ -55,14 +55,6 @@ public class Database {
return conn; return conn;
} }
protected static InputStream convertUniqueId(UUID uuid) {
byte[] bytes = new byte[16];
ByteBuffer.wrap(bytes)
.putLong(uuid.getMostSignificantBits())
.putLong(uuid.getLeastSignificantBits());
return new ByteArrayInputStream(bytes);
}
protected static UUID convertBinaryStream(InputStream stream) { protected static UUID convertBinaryStream(InputStream stream) {
ByteBuffer buffer = ByteBuffer.allocate(16); ByteBuffer buffer = ByteBuffer.allocate(16);
try { try {

View file

@ -24,14 +24,17 @@ import java.util.UUID;
public class PlayerInfo { public class PlayerInfo {
public UUID uuid; public UUID uuid;
public int wins, hider_wins, seeker_wins, games_played; public int hider_wins, seeker_wins, hider_games, seeker_games, hider_kills, seeker_kills, hider_deaths, seeker_deaths;
public PlayerInfo(UUID uuid, int wins, int hider_wins, int seeker_wins, int games_played){ public PlayerInfo(UUID uuid, int hider_wins, int seeker_wins, int hider_games, int seeker_games, int hider_kills, int seeker_kills, int hider_deaths, int seeker_deaths) {
this.uuid = uuid; this.uuid = uuid;
this.wins = wins;
this.hider_wins = hider_wins; this.hider_wins = hider_wins;
this.seeker_wins = seeker_wins; this.seeker_wins = seeker_wins;
this.games_played = games_played; this.hider_games = hider_games;
this.seeker_games = seeker_games;
this.hider_kills = hider_kills;
this.seeker_kills = seeker_kills;
this.hider_deaths = hider_deaths;
this.seeker_deaths = seeker_deaths;
} }
} }

View file

@ -19,28 +19,37 @@
package net.tylermurphy.hideAndSeek.database; package net.tylermurphy.hideAndSeek.database;
import com.google.common.io.ByteStreams;
import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.configuration.Config; import net.tylermurphy.hideAndSeek.configuration.Config;
import net.tylermurphy.hideAndSeek.game.Board;
import net.tylermurphy.hideAndSeek.util.WinType; import net.tylermurphy.hideAndSeek.util.WinType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.ByteBuffer;
import java.sql.*; import java.sql.*;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.UUID;
public class PlayerInfoTable { public class PlayerInfoTable {
private static final Map<UUID, PlayerInfo> CACHE = new HashMap<>();
protected PlayerInfoTable(){ protected PlayerInfoTable(){
String sql = "CREATE TABLE IF NOT EXISTS player_info (\n" String sql = "CREATE TABLE IF NOT EXISTS hs_data (\n"
+ " uuid BINARY(16) PRIMARY KEY,\n" + " uuid BINARY(16) PRIMARY KEY,\n"
+ " wins int NOT NULL,\n"
+ " seeker_wins int NOT NULL,\n"
+ " hider_wins int NOT NULL,\n" + " hider_wins int NOT NULL,\n"
+ " games_played int NOT NULL\n" + " seeker_wins int NOT NULL,\n"
+ " hider_games int NOT NULL\n"
+ " seeker_games int NOT NULL\n"
+ " hider_kills int NOT NULL\n"
+ " seeker_kills int NOT NULL\n"
+ " hider_deaths int NOT NULL\n"
+ " seeker_deaths int NOT NULL\n"
+ ");"; + ");";
try(Connection connection = Database.connect(); Statement statement = connection.createStatement()){ try(Connection connection = Database.connect(); Statement statement = connection.createStatement()){
@ -51,52 +60,87 @@ public class PlayerInfoTable {
} }
} }
public PlayerInfo getInfo(UUID uuid){ private byte[] encodeUUID(UUID uuid){
String sql = "SELECT * FROM player_info WHERE uuid = ?;"; try {
try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ byte[] bytes = new byte[16];
InputStream is = Database.convertUniqueId(uuid); ByteBuffer.wrap(bytes)
byte[] bytes = new byte[is.available()]; .putLong(uuid.getMostSignificantBits())
if(is.read(bytes) == -1){ .putLong(uuid.getLeastSignificantBits());
throw new IOException("Failed to read bytes from input stream"); InputStream is = new ByteArrayInputStream(bytes);
byte[] result = new byte[is.available()];
if (is.read(result) == -1) {
Main.plugin.getLogger().severe("IO Error: Failed to read bytes from input stream");
return new byte[0];
} }
statement.setBytes(1, bytes); return result;
} catch (IOException e){
Main.plugin.getLogger().severe("IO Error: " + e.getMessage());
return new byte[0];
}
}
private UUID decodeUUID(byte[] bytes){
InputStream is = new ByteArrayInputStream(bytes);
ByteBuffer buffer = ByteBuffer.allocate(16);
try {
buffer.put(ByteStreams.toByteArray(is));
buffer.flip();
return new UUID(buffer.getLong(), buffer.getLong());
} catch (IOException e) {
Main.plugin.getLogger().severe("IO Error: " + e.getMessage());
}
return null;
}
@NotNull
public PlayerInfo getInfo(UUID uuid){
String sql = "SELECT * FROM hs_data WHERE uuid = ?;";
try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){
statement.setBytes(1, encodeUUID(uuid));
ResultSet rs = statement.executeQuery(); ResultSet rs = statement.executeQuery();
if(rs.next()){ if(rs.next()){
PlayerInfo info = new PlayerInfo( PlayerInfo info = new PlayerInfo(
uuid, uuid,
rs.getInt("wins"),
rs.getInt("seeker_wins"),
rs.getInt("hider_wins"), rs.getInt("hider_wins"),
rs.getInt("games_played") rs.getInt("seeker_wins"),
rs.getInt("hider_games"),
rs.getInt("seeker_games"),
rs.getInt("hider_kills"),
rs.getInt("seeker_kills"),
rs.getInt("hider_deaths"),
rs.getInt("seeker_deaths")
); );
rs.close(); rs.close();
connection.close(); connection.close();
CACHE.put(uuid, info);
return info; return info;
} }
rs.close(); rs.close();
} catch (SQLException e){ } catch (SQLException e){
Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); Main.plugin.getLogger().severe("SQL Error: " + e.getMessage());
e.printStackTrace(); e.printStackTrace();
} catch (IOException e) {
Main.plugin.getLogger().severe("IO Error: " + e.getMessage());
e.printStackTrace();
} }
return new PlayerInfo(uuid, 0, 0, 0, 0); return new PlayerInfo(uuid, 0, 0, 0, 0, 0, 0, 0, 0);
} }
@Nullable
public List<PlayerInfo> getInfoPage(int page){ public List<PlayerInfo> getInfoPage(int page){
String sql = "SELECT * FROM player_info ORDER BY wins DESC LIMIT 10 OFFSET ?;"; String sql = "SELECT * FROM hs_data ORDER BY (hider_wins + seeker_wins) DESC LIMIT 10 OFFSET ?;";
try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){
statement.setInt(1, (page-1)*10); statement.setInt(1, (page-1)*10);
ResultSet rs = statement.executeQuery(); ResultSet rs = statement.executeQuery();
List<PlayerInfo> infoList = new ArrayList<>(); List<PlayerInfo> infoList = new ArrayList<>();
while(rs.next()){ while(rs.next()){
PlayerInfo info = new PlayerInfo( PlayerInfo info = new PlayerInfo(
Database.convertBinaryStream(new ByteArrayInputStream(rs.getBytes("uuid"))), decodeUUID(rs.getBytes("uuid")),
rs.getInt("wins"),
rs.getInt("seeker_wins"),
rs.getInt("hider_wins"), rs.getInt("hider_wins"),
rs.getInt("games_played") rs.getInt("seeker_wins"),
rs.getInt("hider_games"),
rs.getInt("seeker_games"),
rs.getInt("hider_kills"),
rs.getInt("seeker_kills"),
rs.getInt("hider_deaths"),
rs.getInt("seeker_deaths")
); );
infoList.add(info); infoList.add(info);
} }
@ -110,31 +154,31 @@ public class PlayerInfoTable {
return null; return null;
} }
public void addWins(List<UUID> uuids, List<UUID> winners, WinType type){ public void addWins(List<UUID> uuids, List<UUID> winners, Map<String,Integer> kills, Map<String,Integer> deaths, WinType type){
for(UUID uuid : uuids){ for(UUID uuid : uuids){
String sql = "INSERT OR REPLACE INTO player_info (uuid, wins, seeker_wins, hider_wins, games_played) VALUES (?,?,?,?,?)"; String sql = "INSERT OR REPLACE INTO hs_data (uuid, hider_wins, seeker_wins, hider_games, seeker_games, hider_kills, seeker_kills, hider_deaths, seeker_deaths) VALUES (?,?,?,?,?,?,?,?,?)";
PlayerInfo info = getInfo(uuid); PlayerInfo info = getInfo(uuid);
try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){
InputStream is = Database.convertUniqueId(uuid); statement.setBytes(1, encodeUUID(uuid));
byte[] bytes = new byte[is.available()]; statement.setInt(2, info.hider_wins + (winners.contains(uuid) && type == WinType.HIDER_WIN ? 1 : 0));
if(is.read(bytes) == -1){
throw new IOException("Failed to read bytes from input stream");
}
statement.setBytes(1, bytes);
statement.setInt(2, info.wins + (winners.contains(uuid) ? 1 : 0));
statement.setInt(3, info.seeker_wins + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0)); statement.setInt(3, info.seeker_wins + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0));
statement.setInt(4, info.hider_wins + (winners.contains(uuid) && type == WinType.HIDER_WIN ? 1 : 0)); statement.setInt(4, info.hider_games + (Board.isHider(uuid) ? 1 : 0));
statement.setInt(5, info.games_played + 1); statement.setInt(5, info.seeker_games + (Board.isSeeker(uuid) ? 1 : 0));
statement.setInt(6, info.hider_kills + (Board.isHider(uuid) ? kills.get(uuid.toString()) : 0));
statement.setInt(7, info.seeker_kills + (Board.isSeeker(uuid) ? kills.get(uuid.toString()) : 0));
statement.setInt(8, info.hider_deaths + (Board.isHider(uuid) ? deaths.get(uuid.toString()) : 0));
statement.setInt(9, info.seeker_deaths + (Board.isSeeker(uuid) ? deaths.get(uuid.toString()) : 0));
statement.execute(); statement.execute();
} catch (SQLException e){ } catch (SQLException e){
Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); Main.plugin.getLogger().severe("SQL Error: " + e.getMessage());
e.printStackTrace(); e.printStackTrace();
return; return;
} catch (IOException e) { } finally {
Main.plugin.getLogger().severe("IO Error: " + e.getMessage()); CACHE.remove(uuid);
e.printStackTrace();
} }
} }
} }
} }

View file

@ -38,6 +38,8 @@ public class Board {
private static final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>(); private static final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>();
private static final Map<String, Player> playerList = new HashMap<>(); private static final Map<String, Player> playerList = new HashMap<>();
private static final Map<String, CustomBoard> customBoards = new HashMap<>(); private static final Map<String, CustomBoard> customBoards = new HashMap<>();
private static final Map<String, Integer> kills = new HashMap<>();
private static final Map<String, Integer> deaths = new HashMap<>();
public static boolean isPlayer(Player player) { public static boolean isPlayer(Player player) {
return playerList.containsKey(player.getUniqueId().toString()); return playerList.containsKey(player.getUniqueId().toString());
@ -51,10 +53,18 @@ public class Board {
return Hider.contains(player.getUniqueId().toString()); return Hider.contains(player.getUniqueId().toString());
} }
public static boolean isHider(UUID uuid){
return Hider.contains(uuid.toString());
}
public static boolean isSeeker(Player player) { public static boolean isSeeker(Player player) {
return Seeker.contains(player.getUniqueId().toString()); return Seeker.contains(player.getUniqueId().toString());
} }
public static boolean isSeeker(UUID uuid){
return Seeker.contains(uuid.toString());
}
public static boolean isSpectator(Player player) { public static boolean isSpectator(Player player) {
return Spectator.contains(player.getUniqueId().toString()); return Spectator.contains(player.getUniqueId().toString());
} }
@ -133,6 +143,32 @@ public class Board {
Hider.clear(); Hider.clear();
Seeker.clear(); Seeker.clear();
Spectator.clear(); Spectator.clear();
kills.clear();
deaths.clear();
}
public static void addKill(UUID uuid){
if(kills.containsKey(uuid.toString())){
kills.put(uuid.toString(), kills.get(uuid.toString())+1);
} else {
kills.put(uuid.toString(), 1);
}
}
public static void addDeath(UUID uuid){
if(deaths.containsKey(uuid.toString())){
deaths.put(uuid.toString(), deaths.get(uuid.toString())+1);
} else {
deaths.put(uuid.toString(), 1);
}
}
public static Map<String, Integer> getKills(){
return new HashMap<>(kills);
}
public static Map<String, Integer> getDeaths(){
return new HashMap<>(deaths);
} }
public static void createLobbyBoard(Player player) { public static void createLobbyBoard(Player player) {

View file

@ -32,6 +32,7 @@ import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.Arrow; import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -148,79 +149,63 @@ public class EventListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageEvent event) { public void onEntityDamage(EntityDamageEvent event) {
try { // If you are not a player, get out of here
if (event.getEntity() instanceof Player) { if(!(event.getEntity() instanceof Player)) return;
// Define variables
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
if (!Board.isPlayer(player)) {
if (event instanceof EntityDamageByEntityEvent) {
Entity damager = ((EntityDamageByEntityEvent) event).getDamager();
if (damager instanceof Player) {
if(Board.isPlayer(damager)){
event.setCancelled(true);
return;
}
}
}
return;
}
if (Game.status != Status.PLAYING) {
event.setCancelled(true);
return;
}
Player attacker = null; Player attacker = null;
// If player pvp is enabled, and player doesn't die, we do not care
if(pvpEnabled && player.getHealth() - event.getFinalDamage() >= 0.5){ return; }
// If no spawn position, we won't be able to manage their death :o
if(spawnPosition == null){ return; }
// If there is an attacker, find them
if (event instanceof EntityDamageByEntityEvent) { if (event instanceof EntityDamageByEntityEvent) {
Entity damager = ((EntityDamageByEntityEvent) event).getDamager(); if(((EntityDamageByEntityEvent) event).getDamager() instanceof Player)
if (damager instanceof Player) { attacker = (Player) ((EntityDamageByEntityEvent) event).getDamager();
attacker = (Player) damager; else if(((EntityDamageByEntityEvent) event).getDamager() instanceof Projectile)
if (!Board.isPlayer(attacker)) event.setCancelled(true); if(((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter() instanceof Player)
if (Board.onSameTeam(player, attacker)) event.setCancelled(true); attacker = (Player) ((Projectile) ((EntityDamageByEntityEvent) event).getDamager()).getShooter();
if (Board.isSpectator(player)) event.setCancelled(true);
} else if(damager instanceof Arrow){
ProjectileSource source = ((Arrow) damager).getShooter();
if(source instanceof Player){
attacker = (Player) source;
if (!Board.isPlayer(attacker)) event.setCancelled(true);
if (Board.onSameTeam(player, attacker)) event.setCancelled(true);
if (Board.isSpectator(player)) event.setCancelled(true);
} }
} // Makes sure that if there was an attacking player, that the event is allowed for the game
} if(attacker != null){
if(event.isCancelled()) return; // Cancel if one player is in the game but other isn't
if (player.getHealth() - event.getFinalDamage() < 0.5 || !pvpEnabled) { if((Board.isPlayer(player) && !Board.isPlayer(attacker)) || (!Board.isPlayer(player) && Board.isPlayer(attacker))){
if (event instanceof EntityDamageByEntityEvent && !pvpEnabled) { event.setCancelled(true);
Entity damager = ((EntityDamageByEntityEvent) event).getDamager(); return;
if (damager instanceof Player) { // Ignore event if neither player are in the game
Player atacker = (Player) damager; } else if(!Board.isPlayer(player) && !Board.isPlayer(attacker)){
if(!Board.isSeeker(atacker)){ return;
// Ignore event if players are on the same team, or one of them is a spectator
} else if(Board.onSameTeam(player, attacker) || Board.isSpectator(player) || Board.isSpectator(attacker)){
event.setCancelled(true);
return;
// Ignore the event if pvp is disabled, and a hider is trying to attack a seeker
} else if(!pvpEnabled && Board.isHider(attacker) && Board.isSeeker(player)){
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} else { // If there is no attacker, it must of been by natural causes. If pvp is disabled, and config doesn't allow natural causes, cancel event.
} else if(!pvpEnabled && !allowNaturalCauses){
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} else if(!pvpEnabled) { // Handle death event
event.setCancelled(true);
return;
}
if (spawnPosition == null) return;
event.setCancelled(true); event.setCancelled(true);
// Reset health and play death effect
if(Version.atLeast("1.9")) { if(Version.atLeast("1.9")) {
AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
if (attribute != null) player.setHealth(attribute.getValue()); if (attribute != null) player.setHealth(attribute.getValue());
} else {
player.setHealth(player.getMaxHealth());
}
player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
if(Version.atLeast("1.9")){
XSound.ENTITY_PLAYER_DEATH.play(player, 1, 1); XSound.ENTITY_PLAYER_DEATH.play(player, 1, 1);
} else { } else {
player.setHealth(player.getMaxHealth());
XSound.ENTITY_PLAYER_HURT.play(player, 1, 1); XSound.ENTITY_PLAYER_HURT.play(player, 1, 1);
} }
// Teleport player to seeker spawn
player.teleport(new Location(Bukkit.getWorld(Game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
// Broadcast player death message
if (Board.isSeeker(player)) { if (Board.isSeeker(player)) {
Game.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(player).toString()); Game.broadcastMessage(message("GAME_PLAYER_DEATH").addPlayer(player).toString());
} } else if (Board.isHider(player)) {
if (Board.isHider(player)) {
if (attacker == null) { if (attacker == null) {
Game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString()); Game.broadcastMessage(message("GAME_PLAYER_FOUND").addPlayer(player).toString());
} else { } else {
@ -228,13 +213,9 @@ public class EventListener implements Listener {
} }
Board.addSeeker(player); Board.addSeeker(player);
} }
Game.resetPlayer(player); // Add leaderboard stats
Board.reloadBoardTeams(); Board.addDeath(player.getUniqueId());
} if(attacker != null){ Board.addKill(attacker.getUniqueId()); }
}
} catch (Exception e){
Main.plugin.getLogger().severe("Entity Damage Event Error: " + e.getMessage());
}
} }
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)

View file

@ -178,11 +178,11 @@ public class Game {
List<UUID> players = Board.getPlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList()); List<UUID> players = Board.getPlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList());
if(type == WinType.HIDER_WIN){ if(type == WinType.HIDER_WIN){
List<UUID> winners = Board.getHiders().stream().map(Entity::getUniqueId).collect(Collectors.toList()); List<UUID> winners = Board.getHiders().stream().map(Entity::getUniqueId).collect(Collectors.toList());
Database.playerInfo.addWins(players, winners, type); Database.playerInfo.addWins(players, winners, Board.getKills(), Board.getDeaths(), type);
} else if(type == WinType.SEEKER_WIN){ } else if(type == WinType.SEEKER_WIN){
List<UUID> winners = new ArrayList<>(); List<UUID> winners = new ArrayList<>();
winners.add(Board.getFirstSeeker().getUniqueId()); winners.add(Board.getFirstSeeker().getUniqueId());
Database.playerInfo.addWins(players, winners, type); Database.playerInfo.addWins(players, winners, Board.getKills(), Board.getDeaths(), type);
} }
worldBorder.resetWorldborder(getGameWorld()); worldBorder.resetWorldborder(getGameWorld());
for(Player player : Board.getPlayers()) { for(Player player : Board.getPlayers()) {

View file

@ -0,0 +1,128 @@
package net.tylermurphy.hideAndSeek.util;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import net.tylermurphy.hideAndSeek.database.Database;
import net.tylermurphy.hideAndSeek.database.PlayerInfo;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Method;
import java.util.Locale;
import java.util.UUID;
public class PAPIExpansion extends PlaceholderExpansion {
@Override
public @NotNull String getIdentifier() {
return "kenshinshideandseek";
}
@Override
public @NotNull String getAuthor() {
return "KenshinEto";
}
@Override
public @NotNull String getVersion() {
return "1.4.3";
}
@Override
public boolean persist() {
return true;
}
@Override
public String onRequest(OfflinePlayer player, @NotNull String params) {
switch (params.toLowerCase(Locale.ROOT)) {
case "hs_stats_total-wins":
return hs_stats_total_wins(player.getUniqueId());
case "hs_stats_hider-wins":
return hs_stats_hider_wins(player.getUniqueId());
case "hs_stats_seeker-wins":
return hs_stats_seeker_wins(player.getUniqueId());
case "hs_stats_total-games":
return hs_stats_total_games(player.getUniqueId());
case "hs_stats_hider-games":
return hs_stats_hider_games(player.getUniqueId());
case "hs_stats_seeker-games":
return hs_stats_seeker_games(player.getUniqueId());
case "hs_stats_total-kills":
return hs_stats_total_kills(player.getUniqueId());
case "hs_stats_hider-kills":
return hs_stats_hider_kills(player.getUniqueId());
case "hs_stats_seeker-kills":
return hs_stats_seeker_kills(player.getUniqueId());
case "hs_stats_total-deaths":
return hs_stats_total_deaths(player.getUniqueId());
case "hs_stats_hider-deaths":
return hs_stats_hider_deaths(player.getUniqueId());
case "hs_stats_seeker-deaths":
return hs_stats_seeker_deaths(player.getUniqueId());
default:
return null;
}
}
private String hs_stats_total_wins(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_wins + info.seeker_wins);
}
private String hs_stats_hider_wins(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_wins);
}
private String hs_stats_seeker_wins(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.seeker_wins);
}
private String hs_stats_total_games(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_games + info.seeker_games);
}
private String hs_stats_hider_games(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_games);
}
private String hs_stats_seeker_games(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.seeker_games);
}
private String hs_stats_total_kills(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_kills + info.seeker_kills);
}
private String hs_stats_hider_kills(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_kills);
}
private String hs_stats_seeker_kills(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.seeker_kills);
}
private String hs_stats_total_deaths(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_deaths + info.seeker_deaths);
}
private String hs_stats_hider_deaths(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.hider_deaths);
}
private String hs_stats_seeker_deaths(UUID uuid){
PlayerInfo info = Database.playerInfo.getInfo(uuid);
return String.valueOf(info.seeker_deaths);
}
}

View file

@ -46,6 +46,13 @@ minPlayers: 2
# default: true # default: true
pvp: true pvp: true
# !! Only effects the game at all if pvp is set to false !!
# By default, If you disable pvp, Hiders and Seekers can no longer take damage from natural causes such as
# falling or projectiles. If you want, you can keep pvp disabled so that Seekers only have to tag Hiders, but
# all players can still take fall damage or any other damage that's not from another player.
# deafult: false
allowNaturalCauses: false
# Players that join the server will automatically be placed into the lobby. # Players that join the server will automatically be placed into the lobby.
# default: false # default: false
autoJoin: false autoJoin: false