package me.arcodeskel.uwpmcutils; import me.arcodeskel.uwpmcutils.commands.*; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.command.CommandExecutor; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.event.Listener; import java.sql.*; import java.util.*; public class Main extends JavaPlugin implements CommandExecutor, Listener, Maps { // Claim Tool ItemStack itemStack = new ItemStack(Material.GOLDEN_SHOVEL); // Ranks String[] ranks = {"GUEST", "MEMBER", "BUILDER" , "MOD", "DEV", "OWNER"}; ChatColor[] colors = {ChatColor.GRAY, ChatColor.GREEN, ChatColor.DARK_AQUA ,ChatColor.LIGHT_PURPLE, ChatColor.RED, ChatColor.RED}; String CreateHome = "CREATE TABLE IF NOT EXISTS 'homes' ('username' TEXT UNIQUE, 'x' INTEGER, 'y' INTEGER, 'z' INTEGER, 'yaw' INTEGER, 'pitch' INTEGER)"; String CreateRank = "CREATE TABLE IF NOT EXISTS 'rank' ('username' TEXT UNIQUE, 'rank' TEXT)"; String CreateSpawn = "CREATE TABLE IF NOT EXISTS 'spawn' ('x' INTEGER DEFAULT 0, 'y' INTEGER DEFAULT 0, 'z' INTEGER DEFAULT 0, 'yaw' INTEGER DEFAULT 0, 'pitch' INTEGER DEFAULT 0)"; // Survival World World main = Bukkit.getServer().getWorld("world"); @Override public void onEnable() { getServer().getPluginManager().registerEvents(this, this); Objects.requireNonNull(getCommand("spawn")).setExecutor(new Spawn()); Objects.requireNonNull(getCommand("sethome")).setExecutor(new SetHome()); Objects.requireNonNull(getCommand("home")).setExecutor(new Home()); Objects.requireNonNull(getCommand("rtp")).setExecutor(new Rtp()); Objects.requireNonNull(getCommand("rank")).setExecutor(new Rank()); Objects.requireNonNull(getCommand("setspawn")).setExecutor(new SetSpawn()); Objects.requireNonNull(getCommand("tpbuild")).setExecutor(new tpbuild()); Objects.requireNonNull(getCommand("help")).setExecutor(new Help()); try { Connection connection = DatabaseConnection.getConnection(); Statement statement = connection.createStatement(); statement.addBatch(CreateHome); statement.addBatch(CreateRank); statement.addBatch(CreateSpawn); statement.executeBatch(); } catch (SQLException e) { throw new RuntimeException(e); } getLogger().info("Utils Plugin Started"); } @Override public void onDisable() { getLogger().info("Utils Plugin Disabled"); } @EventHandler(priority = EventPriority.HIGH) public void onPlayerJoin(PlayerJoinEvent event) { String rank = "SELECT rank FROM rank WHERE username= ?"; if (event.getPlayer().hasPlayedBefore()) { event.getPlayer().sendMessage("Welcome back, " + event.getPlayer().getName() + "! There are currently " + getServer().getOnlinePlayers().size() + " players online."); /* try (Connection connection = DatabaseConnection.getConnection();) { try (PreparedStatement psUpdate = connection.prepareStatement(rank)) { psUpdate.setString(1, event.getPlayer().getName()); psUpdate.executeQuery(); for (String s : ranks) { if (s.equals(psUpdate.getResultSet().toString())) { event.getPlayer().setPlayerListName(rank + " " + event.getPlayer().getName()); break; } } connection.close(); } } catch (SQLException e) { throw new RuntimeException(e); } */ } else if (!event.getPlayer().hasPlayedBefore()) { String insertUser = "INSERT OR IGNORE INTO rank (username) VALUES (?)"; try (Connection connection = DatabaseConnection.getConnection()) { try (PreparedStatement psUpdate = connection.prepareStatement(insertUser)) { psUpdate.setString(1, event.getPlayer().getName()); Rank.addGuest(event.getPlayer().getName()); //event.getPlayer().setPlayerListName(ranks[0] + " " + event.getPlayer().getName()); event.getPlayer().sendMessage("Welcome to UWP MC! Go through the mineshaft elevator to get started."); ItemMeta meta = itemStack.getItemMeta(); assert meta != null; meta.setDisplayName("Claim Tool"); itemStack.setItemMeta(meta); event.getPlayer().getInventory().setItem(0, itemStack); // Execute the SELECT statement try (PreparedStatement selectStmt = connection.prepareStatement("SELECT x, y, z FROM spawn LIMIT 1")) { try (ResultSet resultSet = selectStmt.executeQuery()) { // Execute the query if (resultSet.next()) { // Move to the first row double x = resultSet.getDouble("x"); double y = resultSet.getDouble("y"); double z = resultSet.getDouble("z"); psUpdate.executeUpdate(); // Now execute the update Location location = new Location(Bukkit.getServer().getWorld("world"), x, y, z); event.getPlayer().teleport(location); } } } } } catch (SQLException e) { getLogger().info("SQLite ran into an exception. If the exception relates to unique constraints, it can be safely ignored."); getLogger().info(e.toString()); } } } @EventHandler public void onPlayerRespawn(PlayerRespawnEvent event) throws SQLException { try { String result = "SELECT x,y,z FROM spawn"; Connection connection = DatabaseConnection.getConnection(); Statement statement = connection.createStatement(); var resultset = statement.executeQuery(result); double x = resultset.getDouble(1); double y = resultset.getDouble(2); double z = resultset.getDouble(3); ItemMeta meta = itemStack.getItemMeta(); assert meta != null; meta.setDisplayName("Claim Tool"); itemStack.setItemMeta(meta); if (enteringEndPortal.contains(event.getPlayer().getUniqueId().toString())) { enteringEndPortal.remove(event.getPlayer().getUniqueId().toString()); } if (event.getPlayer().getWorld().getName().equals("world")) { event.getPlayer().getInventory().setItem(0, itemStack); } if (!event.getPlayer().getWorld().getName().equals("world")) { Location loc = new Location(Bukkit.getWorld("world"), x, y, z); Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L); } if (event.getPlayer().getBedSpawnLocation() != null) { if (!event.getPlayer().getBedSpawnLocation().getWorld().getName().equals("world")) { Location loc = new Location(Bukkit.getWorld("world"), x, y, z); Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L); return; } Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(event.getPlayer().getBedSpawnLocation()), 1L); } if (event.getPlayer().getBedSpawnLocation() == null) { Location loc = new Location(Bukkit.getWorld("world"), x, y, z); Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L); } else { Location loc = new Location(Bukkit.getWorld("world"), x, y, z); Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L); } connection.close(); } catch (SQLException e) { throw new RuntimeException(e); } } @EventHandler public boolean loggedOff(PlayerQuitEvent event) { if (activeCommands.contains(event.getPlayer())) { double velocity = originalVelocity.get(event.getPlayer()); event.getPlayer().setVelocity(event.getPlayer().getLocation().getDirection().multiply(velocity)); frozenPlayers.remove(event.getPlayer()); originalVelocity.remove(event.getPlayer()); sneakingPlayers.remove(event.getPlayer()); event.getPlayer().setWalkSpeed(0.2F); } return true; } @EventHandler public boolean AsyncPlayerChatEvent(AsyncPlayerChatEvent event) throws SQLException { String playerName = event.getPlayer().getName(); // Use Bukkit's runAsync method to handle the database operation asynchronously try (Connection connection = DatabaseConnection.getConnection(); PreparedStatement ps = connection.prepareStatement("SELECT rank FROM rank WHERE username = ?")) { ps.setString(1, playerName); ResultSet resultSet = ps.executeQuery(); if (resultSet.next()) { String rank = resultSet.getString("rank"); for (int i = 0; i < ranks.length; i++) { if (ranks[i].equalsIgnoreCase(rank)) { // Set the chat format in the main thread String formattedMessage = colors[i] + ranks[i] + " " + ChatColor.AQUA + playerName + " >> " + ChatColor.GOLD + event.getMessage(); event.setFormat(formattedMessage); break; } } } } catch (SQLException e) { e.printStackTrace(); // Handle the exception appropriately } return true; } @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if (frozenPlayers.contains(event.getPlayer())) { event.setCancelled(true); // Cancel movement } } public void onPlayerDamage(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof Player) { // Check if the damaged entity is a mob Entity damager = event.getDamager(); Player player = (Player) damager; if (activeCommands.contains(player)) { if (event.getEntity().getType() != EntityType.PLAYER || event.getEntity().getType() == EntityType.PLAYER) { event.setCancelled(true); // Cancel the damage event event.getDamager().sendMessage(ChatColor.RED + "You cannot attack while teleporting! (SHIFT TO CANCEL)"); } } } } @EventHandler public void onPlayerPortal(PlayerPortalEvent event) { if (event.getTo().getWorld().getName().equals("world_the_end") || event.getTo().getWorld().getName().equals("anarchy_end")) { enteringEndPortal.add(event.getPlayer().getUniqueId().toString()); } } @EventHandler public void onPlayerCommandPreprocess (PlayerCommandPreprocessEvent event){ String command = event.getMessage(); if (command.equalsIgnoreCase("/home")) { if (!event.getPlayer().getWorld().getName().equals("world") && !event.getPlayer().getWorld().getName().equals("world_nether") && !event.getPlayer().getWorld().getName().equals("world_the_end")) { event.getPlayer().sendMessage(ChatColor.RED + "Cannot use this command in " + event.getPlayer().getWorld().getName() + ", enter spawn to execute this command!"); event.setCancelled(true); } } if (command.equalsIgnoreCase("/rtp")) { if (!event.getPlayer().getWorld().getName().equals("world")) { event.getPlayer().sendMessage(ChatColor.RED + "Cannot use this command in " + event.getPlayer().getWorld().getName() + ", you can only use this in the survival over world or at spawn!"); event.setCancelled(true); } } if (command.equalsIgnoreCase("/home") || command.equalsIgnoreCase("/spawn") || command.equalsIgnoreCase("/rtp")) { Block blockBelow = event.getPlayer().getLocation().subtract(0, 1, 0).getBlock(); if (!blockBelow.getType().isSolid()) { event.getPlayer().sendMessage(ChatColor.RED + "Cannot teleport while falling!"); event.setCancelled(true); // Cancel the command } if (activeCommands.contains(event.getPlayer())) { event.getPlayer().sendMessage(ChatColor.RED + "You already have a command in progress!"); event.setCancelled(true); // Cancel the new command } } } }